382{
385
386 const Ring *gbringK =
GR->get_flattened_coefficients();
388 gbvector *lastterm = fsyz;
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;
398
399 while (f != nullptr)
400 {
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);
409 {
410 ring_elem u, v;
411
412 M->divide(f->monom, r->
monom, REDUCE_mon);
414 gbvector *h =
GR->mult_by_term(
F, r, v, REDUCE_mon, f->comp);
415 GR->gbvector_add_to(
F, f, h);
417 {
418 GR->gbvector_mult_by_coeff_to(fsyz, u);
419 GR->gbvector_mult_by_coeff_to(f, u);
422 }
424 count++;
425 }
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);
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);
442 lastterm = lastterm->
next;
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);
453 count++;
454 }
455 else
456 {
457
458 f = f->next;
460 "error in Schreyer reduction: element does not reduce to zero!");
461 }
462 }
463
465 {
466 buffer o;
467 o << count;
468 o << "[" << max_len << " " << nhits << " " << nremoved << "]";
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)
gc_vector< gbvector * > gb
void wipe_unneeded_terms(gbvector *&f)
gc_vector< MonomialIdeal * > mi
gbvector * make_syz_term(ring_elem c, const_monomial monom, int comp) const
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
#define ALLOCATE_EXPONENTS(byte_len)
#define ALLOCATE_MONOMIAL(byte_len)
void emit_wrapped(const char *s)
void emit_line(const char *s)