Esempio n. 1
0
void ReducerHashPack<Q>::insert(ConstMonoRef multiple, const Poly& poly) {
  MATHICGB_ASSERT(&poly.ring() == &mRing);
  if (poly.isZero())
    return;
  NewConstTerm termMultiple = {1, multiple.ptr()};
  insertEntry(new (mPool.alloc()) MultipleWithPos(poly, termMultiple));
}
Esempio n. 2
0
void ReducerPackDedup<Q>::insert(ConstMonoRef multiple, const Poly& poly) {
  if (poly.isZero())
    return;
  mLeadTermKnown = false;

  NewConstTerm termMultiple = {1, multiple.ptr()};
  auto entry = new (mPool.alloc()) MultipleWithPos(poly, termMultiple);
  entry->computeCurrent(poly.ring());
  mQueue.push(entry);
}
Esempio n. 3
0
void ReducerNoDedup<Q>::insert(ConstMonoRef multiple, const Poly& poly) {
  if (poly.isZero())
    return;
  mLeadTermKnown = false;

  const auto end = poly.end();
  for (auto it = poly.begin(); it != end; ++it) {
    NewTerm t = {it.coef(), mRing.monoid().alloc().release()};
    mRing.monoid().multiply(multiple, it.mono(), *t.mono);
    mQueue.push(t);
  }
}
Esempio n. 4
0
bool SigPolyBasis::isSingularTopReducibleSlow(
  const Poly& poly,
  ConstMonoRef sig
) const {
  if (poly.isZero())
    return false;

  monomial multiplier = ring().allocMonomial();
  const size_t genCount = size();
  const auto polyLead = poly.leadMono();
  for (size_t i = 0; i < genCount; ++i) {
    if (!monoid().divides(leadMono(i), polyLead))
      continue;
    monoid().divide(leadMono(i), polyLead, multiplier);
    if (monoid().compare(sig, multiplier, signature(i)) == EQ)
      return true;
  }
  ring().freeMonomial(multiplier);
  return false;
}