Macaulay2 Engine
Loading...
Searching...
No Matches

◆ RingMap()

RingMap::RingMap ( const Matrix * m)
private

Definition at line 10 of file ringmap.cpp.

10 : R(m->get_ring())
11{
12 M = nullptr;
13 P = R->cast_to_PolynomialRing();
14 if (P != nullptr)
15 {
16 M = P->getMonoid();
17 K = P->getCoefficientRing();
18 }
19 else
20 K = R;
21
22 nvars = m->n_cols();
23 is_monomial = true;
24
25 ring_elem one = K->from_long(1);
26
27 // Allocate space for the ring map elements
28 _elem = new var[nvars];
29
30 for (int i = 0; i < nvars; i++)
31 {
32 // First initialize these fields:
33 _elem[i].is_zero = false;
34 _elem[i].coeff_is_one = true;
35 _elem[i].monom_is_one = true;
36 _elem[i].bigelem_is_one = true;
37 _elem[i].coeff = ZERO_RINGELEM;
38 _elem[i].monom = nullptr;
39
40 ring_elem f = m->elem(0, i); // This does a copy.
41 _elem[i].bigelem = f;
42
43 if (R->is_zero(f))
44 _elem[i].is_zero = true;
45 else if (P == nullptr)
46 {
47 // Not a polynomial ring, so put everything into coeff
48 if (!K->is_equal(f, one))
49 {
50 _elem[i].coeff_is_one = false;
51 _elem[i].coeff = K->copy(f);
52 }
53 }
54 else
55 {
56// A polynomial ring.
57#ifdef DEVELOPMENT
58#warning "also handle fraction rings"
59#endif
60 Nterm *t = f;
61 if (t->next == nullptr)
62 {
63 // This is a single term
64 if (!K->is_equal(t->coeff, one))
65 {
66 _elem[i].coeff_is_one = false;
67 _elem[i].coeff = K->copy(t->coeff);
68 }
69
70 if (!M->is_one(t->monom)) // should handle M->n_vars() == 0 case
71 // correctly.
72 {
73 _elem[i].monom_is_one = false;
74 _elem[i].monom = M->make_new(t->monom);
75 }
76 }
77 else
78 {
79 // This is a bigterm
80 is_monomial = false;
81 _elem[i].bigelem_is_one = false;
82 }
83 }
84 K->remove(one);
85 }
86}
const Ring * get_ring() const
Definition matrix.hpp:134
ring_elem elem(int i, int j) const
Definition matrix.cpp:307
int n_cols() const
Definition matrix.hpp:147
const Monoid * M
Definition ringmap.hpp:93
const Ring * R
Definition ringmap.hpp:89
const Ring * K
Definition ringmap.hpp:92
bool is_monomial
Definition ringmap.hpp:95
const PolynomialRing * P
Definition ringmap.hpp:91
int nvars
Definition ringmap.hpp:98
var * _elem
Definition ringmap.hpp:99
#define ZERO_RINGELEM
Definition ring.hpp:677
Nterm * next
Definition ringelem.hpp:157
ring_elem coeff
Definition ringelem.hpp:158
int monom[1]
Definition ringelem.hpp:160
Per-source-variable image record: a factored representation of the target-ring element that variable ...
Definition ringmap.hpp:73

References _elem, Nterm::coeff, Matrix::elem(), get_ring(), is_monomial, K, M, Matrix, Nterm::monom, Matrix::n_cols(), Nterm::next, nvars, P, R, and ZERO_RINGELEM.

Referenced by is_equal(), and make().