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

◆ koszul_monomials()

Matrix * Matrix::koszul_monomials ( int nskew,
const Matrix * rows,
const Matrix * cols )
static

Definition at line 1162 of file matrix.cpp.

1167{
1168 // First check rings: r,c,'this' should be row vectors.
1169 // and the ring should be a polynomial ring
1170 const FreeModule *F = r->cols();
1171
1172 const PolynomialRing *P = F->get_ring()->cast_to_PolynomialRing();
1173 if (P == nullptr)
1174 {
1175 ERROR("expected polynomial ring");
1176 return nullptr;
1177 }
1178 const MonomialIdeal *A = makemonideal(r);
1179
1180 const Ring *K = P->getCoefficients();
1181 const Monoid *M = P->getMonoid();
1182
1183 MatrixConstructor mat(F, c->cols(), nullptr);
1184
1185 int nvars = M->n_vars();
1186 int *skew_list = newarray_atomic(int, nskew);
1187 for (int j = 0; j < nskew; j++) skew_list[j] = j;
1188 SkewMultiplication skew(nvars, nskew, skew_list);
1189 int ncols = c->n_cols();
1190
1191 exponents_t aexp = newarray_atomic(int, nvars);
1192 exponents_t bexp = newarray_atomic(int, nvars);
1193 exponents_t result_exp = newarray_atomic(int, nvars);
1194 monomial m = M->make_one();
1195 VECTOR(Bag *) divisors;
1196 for (int i = 0; i < ncols; i++)
1197 {
1198 if (c->elem(i) == nullptr) continue;
1199 const_monomial a = P->lead_flat_monomial(c->elem(i)->coeff);
1200 M->to_expvector(a, aexp);
1201 divisors.clear();
1202 A->find_all_divisors(aexp, divisors);
1203 for (int j = 0; j < divisors.size(); j++)
1204 {
1205 int rownum = divisors[j]->basis_elem();
1206 const_monomial b = P->lead_flat_monomial(r->elem(rownum)->coeff);
1207 M->to_expvector(b, bexp);
1208 exponents::divide(nvars, aexp, bexp, result_exp);
1209 int sign = skew.mult_sign(result_exp, bexp);
1210 if (sign != 0)
1211 {
1212 M->from_expvector(result_exp, m);
1213 ring_elem s = (sign > 0 ? K->one() : K->minus_one());
1214 ring_elem f = P->make_flat_term(s, m);
1215 mat.set_entry(rownum, i, f);
1216 }
1217 }
1218 }
1219 freemem(aexp);
1220 freemem(bexp);
1221 freemem(result_exp);
1222 return mat.to_matrix();
1223}
exponents::Exponents exponents_t
static void divide(int nvars, ConstExponents a, ConstExponents b, Exponents result)
const Ring * get_ring() const
Definition freemod.hpp:102
friend class FreeModule
Definition matrix.hpp:73
friend class MatrixConstructor
Definition matrix.hpp:76
void to_expvector(const_monomial m, exponents_t result_exp) const
Definition monoid.cpp:747
int n_vars() const
Definition monoid.hpp:207
monomial make_one() const
Definition monoid.cpp:455
void from_expvector(const_exponents exp, monomial result) const
Definition monoid.cpp:742
void find_all_divisors(const_exponents exp, VECTOR(Bag *)&b) const
Definition monideal.cpp:246
virtual const Monoid * getMonoid() const
Definition polyring.hpp:282
virtual ring_elem make_flat_term(const ring_elem a, const_monomial m) const =0
virtual const Ring * getCoefficients() const
Definition polyring.hpp:277
virtual const_monomial lead_flat_monomial(const ring_elem f) const =0
ring_elem one() const
Definition ring.hpp:357
ring_elem minus_one() const
Definition ring.hpp:358
virtual const PolynomialRing * cast_to_PolynomialRing() const
Definition ring.hpp:243
#define monomial
Definition gb-toric.cpp:11
const int * const_monomial
Definition imonorder.hpp:45
int_bag Bag
Definition int-bag.hpp:70
void freemem(void *s)
Definition m2-mem.cpp:103
void size_t s
Definition m2-mem.cpp:271
const int ERROR
Definition m2-mem.cpp:55
static MonomialIdeal * makemonideal(const Matrix *A)
Definition matrix.cpp:1123
#define VECTOR(T)
Definition newdelete.hpp:78
#define newarray_atomic(T, len)
Definition newdelete.hpp:91

References Ring::cast_to_PolynomialRing(), cols(), ExponentVector< int, true >::divide(), elem(), ERROR, MonomialIdeal::find_all_divisors(), freemem(), FreeModule, Monoid::from_expvector(), FreeModule::get_ring(), PolynomialRing::getCoefficients(), PolynomialRing::getMonoid(), koszul_monomials(), PolynomialRing::lead_flat_monomial(), PolynomialRing::make_flat_term(), Monoid::make_one(), makemonideal(), Matrix(), MatrixConstructor, Ring::minus_one(), monomial, SkewMultiplication::mult_sign(), n_cols(), Monoid::n_vars(), newarray_atomic, Ring::one(), s, MatrixConstructor::set_entry(), Monoid::to_expvector(), MatrixConstructor::to_matrix(), and VECTOR.

Referenced by koszul_monomials().