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

◆ koszul() [1/2]

Matrix * Matrix::koszul ( const Matrix * rows,
const Matrix * cols )
static

Definition at line 1225 of file matrix.cpp.

1226{
1227 // First check rings: r,c,'this' should be row vectors.
1228 // and the ring should be a polynomial ring
1229 const FreeModule *F = r->cols();
1230
1231 const PolynomialRing *P = F->get_ring()->cast_to_PolynomialRing();
1232 if (P == nullptr) return nullptr;
1233 const Ring *K = P->getCoefficients();
1234 const Monoid *M = P->getMonoid();
1235
1236 MatrixConstructor mat(F, c->cols(), nullptr);
1237
1238 int nvars = M->n_vars();
1239 int nrows = r->n_cols();
1240 int ncols = c->n_cols();
1241 const_monomial a, b;
1242 exponents_t aexp = newarray_atomic(int, nvars);
1243 exponents_t bexp = newarray_atomic(int, nvars);
1244 exponents_t result_exp = newarray_atomic(int, nvars);
1245 for (int i = 0; i < ncols; i++)
1246 {
1247 if (c->elem(i) == nullptr) continue;
1248 a = P->lead_flat_monomial(c->elem(i)->coeff);
1249 M->to_expvector(a, aexp);
1250 for (int j = 0; j < nrows; j++)
1251 {
1252 if (r->elem(j) == nullptr) continue;
1253 b = P->lead_flat_monomial(r->elem(j)->coeff);
1254 M->to_expvector(b, bexp);
1255 int sign = signdivide(nvars, aexp, bexp, result_exp);
1256 if (sign != 0)
1257 {
1258 monomial m = M->make_one();
1259 M->from_expvector(result_exp, m);
1260 ring_elem s = (sign > 0 ? K->one() : K->minus_one());
1261 ring_elem f = P->make_flat_term(s, m);
1262 mat.set_entry(j, i, f);
1263 }
1264 }
1265 }
1266 freemem(aexp);
1267 freemem(bexp);
1268 freemem(result_exp);
1269 return mat.to_matrix();
1270}
exponents::Exponents exponents_t
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
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
void freemem(void *s)
Definition m2-mem.cpp:103
void size_t s
Definition m2-mem.cpp:271
static int signdivide(int n, const_exponents a, const_exponents b, exponents_t exp)
Definition matrix.cpp:1146
#define newarray_atomic(T, len)
Definition newdelete.hpp:91

References Ring::cast_to_PolynomialRing(), cols(), elem(), freemem(), FreeModule, Monoid::from_expvector(), FreeModule::get_ring(), PolynomialRing::getCoefficients(), PolynomialRing::getMonoid(), koszul(), PolynomialRing::lead_flat_monomial(), PolynomialRing::make_flat_term(), Monoid::make_one(), Matrix(), MatrixConstructor, Ring::minus_one(), monomial, n_cols(), Monoid::n_vars(), newarray_atomic, Ring::one(), s, MatrixConstructor::set_entry(), signdivide(), Monoid::to_expvector(), and MatrixConstructor::to_matrix().