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

◆ reduce()

void GBKernelComputation::reduce ( gbvector *& g,
gbvector *& gsyz )
private

Definition at line 381 of file Eschreyer.cpp.

382{
385
386 const Ring *gbringK = GR->get_flattened_coefficients();
387 ring_elem one = gbringK->from_long(1);
388 gbvector *lastterm = fsyz; // fsyz has only ONE term.
389 const gbvector *r;
390 int q;
391
392 int nhits = 0;
393 int nremoved = 0;
394 int max_len = GR->gbvector_n_terms(f);
395
396 int count = 0;
397 if (M2_gbTrace >= 4) emit_wrapped(",");
398
399 while (f != nullptr)
400 {
401 if (SF)
402 {
403 SF->schreyer_down(f->monom, f->comp - 1, REDUCE_mon);
404 M->to_expvector(REDUCE_mon, REDUCE_exp);
405 }
406 else
407 M->to_expvector(f->monom, REDUCE_exp);
408 if (find_ring_divisor(REDUCE_exp, r))
409 {
410 ring_elem u, v;
411 // Subtract off f, leave fsyz alone
412 M->divide(f->monom, r->monom, REDUCE_mon);
413 gbringK->syzygy(f->coeff, r->coeff, u, v);
414 gbvector *h = GR->mult_by_term(F, r, v, REDUCE_mon, f->comp);
415 GR->gbvector_add_to(F, f, h);
416 if (!gbringK->is_equal(u, one))
417 {
418 GR->gbvector_mult_by_coeff_to(fsyz, u);
419 GR->gbvector_mult_by_coeff_to(f, u);
420 gbringK->remove(u);
421 gbringK->remove(v);
422 }
424 count++;
425 }
426 else if (find_divisor(mi[f->comp - 1], REDUCE_exp, q))
427 {
428 ring_elem u, v;
429 gbringK->syzygy(f->coeff, gb[q]->coeff, u, v);
430 M->divide(f->monom, gb[q]->monom, REDUCE_mon);
431 gbvector *h = GR->mult_by_term(F, gb[q], v, REDUCE_mon, 0);
432 if (!gbringK->is_equal(u, one))
433 {
434 GR->gbvector_mult_by_coeff_to(fsyz, u);
435 GR->gbvector_mult_by_coeff_to(f, u);
436 }
437 int n1 = GR->gbvector_n_terms(h);
439 int n2 = GR->gbvector_n_terms(h);
440 nremoved += (n1 - n2);
441 lastterm->next = make_syz_term(v, f->monom, q + 1); // grabs v.
442 lastterm = lastterm->next;
443 gbringK->remove(u);
444 gbringK->remove(v);
445 int n3 = GR->gbvector_n_terms(f);
446 GR->gbvector_add_to(F, f, h);
447 int n4 = GR->gbvector_n_terms(f);
448 if (n4 > max_len) max_len = n4;
449 nhits +=
450 (n2 + n3 - n4 -
451 2); // the -2 is to avoid counting the lead term cancellations.
453 count++;
454 }
455 else
456 {
457 // To get here is an ERROR!
458 f = f->next; // Just to not have an infinite loop
459 emit_line(
460 "error in Schreyer reduction: element does not reduce to zero!");
461 }
462 }
463
464 if (M2_gbTrace >= 4)
465 {
466 buffer o;
467 o << count;
468 o << "[" << max_len << " " << nhits << " " << nremoved << "]";
469 emit_wrapped(o.str());
470 }
471}
exponents::Exponents exponents_t
int find_divisor(const MonomialIdeal *mi, const_exponents exp, int &result)
bool find_ring_divisor(const_exponents exp, const gbvector *&result)
const FreeModule * F
Definition Eschreyer.hpp:93
const SchreyerOrder * SF
Definition Eschreyer.hpp:91
gc_vector< gbvector * > gb
Definition Eschreyer.hpp:98
void wipe_unneeded_terms(gbvector *&f)
gc_vector< MonomialIdeal * > mi
Definition Eschreyer.hpp:97
gbvector * make_syz_term(ring_elem c, const_monomial monom, int comp) const
const Monoid * M
Definition Eschreyer.hpp:90
virtual void remove(ring_elem &f) const =0
virtual bool is_equal(const ring_elem f, const ring_elem g) const =0
virtual ring_elem from_long(long n) const =0
virtual void syzygy(const ring_elem a, const ring_elem b, ring_elem &x, ring_elem &y) const =0
char * str()
Definition buffer.hpp:72
#define monomial
Definition gb-toric.cpp:11
int M2_gbTrace
Definition m2-types.cpp:52
#define ALLOCATE_EXPONENTS(byte_len)
Definition monoid.hpp:62
#define ALLOCATE_MONOMIAL(byte_len)
Definition monoid.hpp:65
ring_elem coeff
Definition gbring.hpp:81
gbvector * next
Definition gbring.hpp:80
int monom[1]
Definition gbring.hpp:83
void emit_wrapped(const char *s)
Definition text-io.cpp:27
void emit_line(const char *s)
Definition text-io.cpp:47

References ALLOCATE_EXPONENTS, ALLOCATE_MONOMIAL, gbvector::coeff, gbvector::comp, emit_line(), emit_wrapped(), exp_size, F, find_divisor(), find_ring_divisor(), Ring::from_long(), gb, GR, Ring::is_equal(), M, M2_gbTrace, make_syz_term(), mi, gbvector::monom, monom_size, monomial, gbvector::next, Ring::remove(), SF, buffer::str(), Ring::syzygy(), total_reduce_count, and wipe_unneeded_terms().

Referenced by calc().