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

◆ geo_reduce()

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

Definition at line 473 of file Eschreyer.cpp.

474{
477
478 const Ring *gbringK = GR->get_flattened_coefficients();
479 ring_elem one = gbringK->from_long(1);
480 gbvector *lastterm = fsyz; // fsyz has only ONE term.
481 const gbvector *r;
482 gbvectorHeap fb(GR, F);
483 fb.add(f);
484 f = nullptr;
485 const gbvector *lead;
486 int q;
487
488 int count = 0;
489 if (M2_gbTrace >= 4) emit_wrapped(",");
490
491 while ((lead = fb.get_lead_term()) != nullptr)
492 {
493 if (SF)
494 {
495 SF->schreyer_down(lead->monom, lead->comp - 1, REDUCE_mon);
496 M->to_expvector(REDUCE_mon, REDUCE_exp);
497 }
498 else
499 M->to_expvector(lead->monom, REDUCE_exp);
500 if (find_ring_divisor(REDUCE_exp, r))
501 {
502 ring_elem u, v;
503 // Subtract off f, leave fsyz alone
504 M->divide(lead->monom, r->monom, REDUCE_mon);
505
506 gbringK->syzygy(f->coeff, r->coeff, u, v);
507 gbvector *h = GR->mult_by_term(F, r, v, REDUCE_mon, f->comp);
508 fb.add(h);
509 if (!gbringK->is_equal(u, one))
510 {
511 GR->gbvector_mult_by_coeff_to(fsyz, u);
512 GR->gbvector_mult_by_coeff_to(f, u);
513 gbringK->remove(u);
514 gbringK->remove(v);
515 }
516
517 fb.add(h);
519 count++;
520 }
521 else if (find_divisor(mi[lead->comp - 1], REDUCE_exp, q))
522 {
523 ring_elem u, v;
524 gbringK->syzygy(f->coeff, gb[q]->coeff, u, v);
525 M->divide(lead->monom, gb[q]->monom, REDUCE_mon);
526 gbvector *h = GR->mult_by_term(F, gb[q], v, REDUCE_mon, 0);
527 if (!gbringK->is_equal(u, one))
528 {
529 GR->gbvector_mult_by_coeff_to(fsyz, u);
530 GR->gbvector_mult_by_coeff_to(f, u);
531 }
533 lastterm->next = make_syz_term(v, lead->monom, q + 1); // grabs v.
534 lastterm = lastterm->next;
535 fb.add(h);
537 count++;
538 }
539 else
540 {
541 // To get here is an ERROR!
542 fb.remove_lead_term();
543 emit_line(
544 "error in Schreyer reduction: element does not reduce to zero!");
545 }
546 }
547
548 if (M2_gbTrace >= 4)
549 {
550 buffer o;
551 o << count;
552 emit_wrapped(o.str());
553 }
554}
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
int comp
Definition gbring.hpp:82
void emit_wrapped(const char *s)
Definition text-io.cpp:27
void emit_line(const char *s)
Definition text-io.cpp:47

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