예제 #1
0
///////////////////////////////////////
// External interface routines ////////
///////////////////////////////////////
void TournamentReducer::insertTail(const_term multiple, const Poly* poly)
{
  if (poly->nTerms() <= 1)
    return;
  mLeadTermKnown = false;

  MultipleWithPos* entry = new (mPool.alloc()) MultipleWithPos(*poly, multiple);
  ++entry->pos;
  entry->computeCurrent(poly->ring());
  mQueue.push(entry);
}
예제 #2
0
void TournamentReducer::insert(monomial multiple, const Poly* poly)
{
  if (poly->isZero())
    return;
  mLeadTermKnown = false;

  term termMultiple(1, multiple);
  MultipleWithPos* entry = new (mPool.alloc()) MultipleWithPos(*poly, termMultiple);
  entry->computeCurrent(poly->ring());
  mQueue.push(entry);
}
예제 #3
0
void ReducerPack<Q>::insertTail(NewConstTerm multiple, const Poly& poly)
{
  if (poly.termCount() <= 1)
    return;
  mLeadTermKnown = false;

  MultipleWithPos* entry =
    new (mPool.alloc()) MultipleWithPos(poly, multiple);
  ++entry->pos;
  entry->computeCurrent(poly.ring());
  mQueue.push(entry);
}
예제 #4
0
bool TournamentReducer::leadTerm(const_term& result)
{
  if (mLeadTermKnown) {
    result = mLeadTerm;
    return true;
  }

  do {
    if (mQueue.empty())
      return false;
    MultipleWithPos* entry = mQueue.top();
    mLeadTerm.monom.swap(entry->current);
    entry->currentCoefficient(mRing, mLeadTerm.coeff);
    
    while (true) {
      ++entry->pos;
      if (entry->pos == entry->end) {
        mQueue.pop();
        entry->destroy(mRing);
        mPool.free(entry);
      } else {
        entry->computeCurrent(mRing);
        mQueue.decreaseTop(entry);
      }
      
      if (mQueue.empty())
        break;
      
      entry = mQueue.top();
      if (!mRing.monomialEQ(entry->current, mLeadTerm.monom))
        break;
      coefficient coeff;
      entry->currentCoefficient(mRing, coeff);
      mRing.coefficientAddTo(mLeadTerm.coeff, const_cast<const coefficient&>(coeff));
    }
  } while (mRing.coefficientIsZero(mLeadTerm.coeff));

  result = mLeadTerm;
  mLeadTermKnown = true;
  return true;
}
예제 #5
0
bool ReducerPack<Q>::leadTerm(NewConstTerm& result)
{
  if (!mLeadTermKnown) {
    do {
      if (mQueue.empty())
        return false;
      MultipleWithPos* entry = mQueue.top();
      std::swap(mLeadTerm.mono, entry->current);
      entry->currentCoefficient(mRing, mLeadTerm.coef);
    
      while (true) {
        ++entry->pos;
        if (entry->pos == entry->end) {
          mQueue.pop();
          entry->destroy(mRing);
          mPool.free(entry);
        } else {
          entry->computeCurrent(mRing);
          mQueue.decreaseTop(entry);
        }
      
        if (mQueue.empty())
          break;
      
        entry = mQueue.top();
        if (!mRing.monoid().equal(*entry->current, *mLeadTerm.mono))
          break;
        coefficient coef;
        entry->currentCoefficient(mRing, coef);
        mRing.coefficientAddTo
          (mLeadTerm.coef, const_cast<const coefficient&>(coef));
      }
    } while (mRing.coefficientIsZero(mLeadTerm.coef));
  }

  result = mLeadTerm;
  mLeadTermKnown = true;
  return true;
}