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

◆ matrix_lift()

M2_bool ReducedGB::matrix_lift ( const Matrix * m,
const Matrix ** result_remainder,
const Matrix ** result_quotient )
virtual

Implements GBComputation.

Definition at line 155 of file reducedgb.cpp.

158{
159 if (m->get_ring() != originalR)
160 {
161 ERROR("expected matrix over the same ring");
162 *result_remainder = nullptr;
163 *result_quotient = nullptr;
164 return false;
165 }
166 if (m->n_rows() != F->rank())
167 {
168 ERROR("expected matrices to have same number of rows");
169 *result_remainder = nullptr;
170 *result_quotient = nullptr;
171 return false;
172 }
173
174 MatrixConstructor mat_remainder(m->rows(), m->cols(), m->degree_shift());
175 MatrixConstructor mat_quotient(Fsyz, m->cols(), nullptr);
176
177#ifdef DEVELOPMENT
178#warning "K should be the denominator ring?"
179#endif
180 const Ring *K = R->get_flattened_coefficients();
181 bool all_zeroes = true;
182 for (int i = 0; i < m->n_cols(); i++)
183 {
184 ring_elem denom;
185 POLY g;
186 g.f = originalR->translate_gbvector_from_vec(F, (*m)[i], denom);
187 g.fsyz = R->gbvector_zero();
188
189 remainder(g, true, denom);
190 if (g.f != nullptr) all_zeroes = false;
191
192 vec fv = originalR->translate_gbvector_to_vec_denom(F, g.f, denom);
193 K->negate_to(denom);
194 vec fsyzv =
195 originalR->translate_gbvector_to_vec_denom(Fsyz, g.fsyz, denom);
196 mat_remainder.set_column(i, fv);
197 mat_quotient.set_column(i, fsyzv);
198
199 R->gbvector_remove(g.f);
200 R->gbvector_remove(g.fsyz);
201 }
202 *result_remainder = mat_remainder.to_matrix();
203 *result_quotient = mat_quotient.to_matrix();
204 return all_zeroes;
205}
const_monomial degree_shift() const
Definition matrix.hpp:149
const Ring * get_ring() const
Definition matrix.hpp:134
int n_cols() const
Definition matrix.hpp:147
int n_rows() const
Definition matrix.hpp:146
const FreeModule * rows() const
Definition matrix.hpp:144
const FreeModule * cols() const
Definition matrix.hpp:145
const FreeModule * Fsyz
Definition reducedgb.hpp:67
virtual void remainder(POLY &f, bool use_denom, ring_elem &denom)=0
GBRing * R
Definition reducedgb.hpp:64
const PolynomialRing * originalR
Definition reducedgb.hpp:65
const FreeModule * F
Definition reducedgb.hpp:66
void negate_to(ring_elem &f) const
Definition ring.cpp:210
const int ERROR
Definition m2-mem.cpp:55
#define POLY(q)
Definition poly.cpp:23
gbvector * fsyz
Definition gbring.hpp:99
gbvector * f
Definition gbring.hpp:98

References Matrix::cols(), Matrix::degree_shift(), ERROR, F, POLY::f, Fsyz, POLY::fsyz, Matrix::get_ring(), Matrix, Matrix::n_cols(), Matrix::n_rows(), Ring::negate_to(), originalR, POLY, R, remainder(), Matrix::rows(), MatrixConstructor::set_column(), and MatrixConstructor::to_matrix().