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

◆ make_monideal()

MonomialIdeal * Matrix::make_monideal ( int n,
bool use_only_monomials_with_unit_coeffs = false ) const

Definition at line 1925 of file matrix.cpp.

1928{
1929 const PolynomialRing *P = get_ring()->cast_to_PolynomialRing();
1930 if (P == nullptr)
1931 {
1932 ERROR("expected polynomial ring");
1933 return nullptr;
1934 }
1935 bool coeffsZZ = (P->coefficient_type() == Ring::COEFF_ZZ &&
1936 use_only_monomials_with_unit_coeffs);
1937 const Monoid *M = P->getMonoid();
1938 VECTOR(Bag *) new_elems;
1939 for (int i = 0; i < n_cols(); i++)
1940 {
1941 vec v = elem(i);
1942 if (v == nullptr) continue;
1943 const vecterm *w = P->vec_locate_lead_term(rows(), v);
1944 if (w->comp != n) continue;
1945 if (coeffsZZ && !globalZZ->is_unit(P->lead_flat_coeff(w->coeff)))
1946 continue;
1947 Bag *b = new Bag(i);
1948 M->to_varpower(P->lead_flat_monomial(w->coeff), b->monom());
1949 new_elems.push_back(b);
1950 }
1951
1952 // If the base ring is a quotient ring, include these lead monomials.
1953 for (int i = 0; i < P->n_quotients(); i++)
1954 {
1955 Nterm *f = P->quotient_element(i);
1956 if (coeffsZZ && !globalZZ->is_unit(f->coeff)) continue;
1957 Bag *b = new Bag(-1);
1958 M->to_varpower(f->monom, b->monom());
1959 new_elems.push_back(b);
1960 }
1961
1962 // If the base ring has skew commuting variables, include their squares
1963 if (P->is_skew_commutative())
1964 {
1965 for (int i = 0; i < M->n_vars(); i++)
1966 if (P->is_skew_var(i))
1967 {
1968 Bag *b = new Bag(-1);
1969 varpower::var(i, 2, b->monom());
1970 new_elems.push_back(b);
1971 }
1972 }
1973
1974 MonomialIdeal *result = new MonomialIdeal(P, new_elems);
1975 return result;
1976}
static void var(Exponent v, Exponent e, Vector &result)
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 FreeModule * rows() const
Definition matrix.hpp:144
void to_varpower(const_monomial m, gc_vector< int > &result_vp) const
Definition monoid.cpp:735
int n_vars() const
Definition monoid.hpp:207
int n_quotients() const
Definition polyring.hpp:219
virtual const Monoid * getMonoid() const
Definition polyring.hpp:282
virtual ring_elem lead_flat_coeff(const ring_elem f) const =0
Nterm * quotient_element(int i) const
Definition polyring.hpp:220
bool is_skew_var(int v) const
Definition polyring.hpp:240
virtual const vecterm * vec_locate_lead_term(const FreeModule *F, vec v) const =0
CoefficientType coefficient_type() const
Definition polyring.hpp:191
bool is_skew_commutative() const
Definition polyring.hpp:237
virtual const_monomial lead_flat_monomial(const ring_elem f) const =0
virtual const PolynomialRing * cast_to_PolynomialRing() const
Definition ring.hpp:243
@ COEFF_ZZ
Definition ring.hpp:222
virtual bool is_unit(const ring_elem f) const
Definition ZZ.cpp:149
gc_vector< int > & monom()
Definition int-bag.hpp:60
RingZZ * globalZZ
Definition relem.cpp:13
int_bag Bag
Definition int-bag.hpp:70
const int ERROR
Definition m2-mem.cpp:55
VALGRIND_MAKE_MEM_DEFINED & result(result)
#define VECTOR(T)
Definition newdelete.hpp:78
ring_elem coeff
Definition ringelem.hpp:158
int monom[1]
Definition ringelem.hpp:160
ring_elem coeff
Definition ringelem.hpp:172

References Nterm::coeff, vec::coeff, Ring::COEFF_ZZ, PolynomialRing::coefficient_type(), vec::comp, elem(), ERROR, get_ring(), PolynomialRing::getMonoid(), globalZZ, PolynomialRing::is_skew_commutative(), PolynomialRing::is_skew_var(), PolynomialRing::lead_flat_coeff(), PolynomialRing::lead_flat_monomial(), make_monideal(), int_bag::monom(), Nterm::monom, n_cols(), PolynomialRing::n_quotients(), Monoid::n_vars(), PolynomialRing::quotient_element(), result(), rows(), Monoid::to_varpower(), ExponentList< int, true >::var(), PolynomialRing::vec_locate_lead_term(), and VECTOR.

Referenced by dimension1(), IM2_MonomialIdeal_make(), and make_monideal().