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

◆ CRA() [1/5]

Matrix * ChineseRemainder::CRA ( const Matrix * f,
const Matrix * g,
mpz_srcptr um,
mpz_srcptr vn,
mpz_srcptr mn )
static

Definition at line 252 of file cra.cpp.

257{
258 auto R = f->get_ring();
259 if (R != g->get_ring())
260 {
261 ERROR("matrices have different base rings");
262 return nullptr;
263 }
264 if (f->rows()->rank() != g->rows()->rank() ||
265 f->cols()->rank() != g->cols()->rank())
266 {
267 ERROR("matrices have different shapes");
268 return nullptr;
269 }
270
271 const PolyRing *S = R->cast_to_PolyRing();
272 if (S == nullptr)
273 {
274 ERROR("expected polynomial ring over ZZ");
275 return nullptr;
276 }
277
278 const FreeModule *F = f->rows();
279 const FreeModule *G = f->cols();
280 const int *deg;
281
282 if (!f->rows()->is_equal(g->rows())) F = S->make_FreeModule(f->n_rows());
283
284 if (!f->cols()->is_equal(g->cols())) G = S->make_FreeModule(f->n_cols());
285
286 if (EQ == R->degree_monoid()->compare(f->degree_shift(), g->degree_shift()))
287 deg = f->degree_shift();
288 else
289 deg = R->degree_monoid()->make_one();
290
291 MatrixConstructor mat(F, G, deg);
292 for (int i = 0; i < f->n_cols(); i++)
293 {
294 vec u = CRA(S, f->elem(i), g->elem(i), um, vn, mn);
295 mat.set_column(i, u);
296 }
297 return mat.to_matrix();
298}
static ring_elem CRA(const PolyRing *R, const ring_elem f, const ring_elem g, mpz_srcptr um, mpz_srcptr vn, mpz_srcptr mn)
Definition cra.cpp:53
bool is_equal(const FreeModule *F) const
Definition freemod.cpp:154
int rank() const
Definition freemod.hpp:105
const_monomial degree_shift() const
Definition matrix.hpp:149
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
int n_rows() const
Definition matrix.hpp:146
const FreeModule * rows() const
Definition matrix.hpp:144
const FreeModule * cols() const
Definition matrix.hpp:145
virtual FreeModule * make_FreeModule() const
Definition ring.cpp:53
virtual const PolyRing * cast_to_PolyRing() const
Definition ring.hpp:245
const int ERROR
Definition m2-mem.cpp:55
tbb::flow::graph G
const int EQ
Definition style.hpp:40

References PolyRing::cast_to_PolyRing(), Matrix::cols(), CRA(), Matrix::degree_shift(), Matrix::elem(), EQ, ERROR, G, Matrix::get_ring(), FreeModule::is_equal(), Ring::make_FreeModule(), Matrix, Matrix::n_cols(), Matrix::n_rows(), FreeModule::rank(), Matrix::rows(), MatrixConstructor::set_column(), and MatrixConstructor::to_matrix().