void BooleanInvolutiveBasis<MonomType>::ConstructInvolutiveBasis() { typename TSet<MonomType>::Iterator tit(IntermediateBasis.Begin()); Polynom<MonomType>* newNormalForm = 0; Triple<MonomType>* currentTriple = 0; while (!ProlongationsSet.Empty()) { currentTriple = ProlongationsSet.Get(); newNormalForm = NormalForm(currentTriple); /* As far as currentTriple can't be 0 (checked in QSET and TSET), * NormalForm can't return 0. */ std::set<typename MonomType::Integer> currentNmpSet; const Triple<MonomType>* currentAncestor = 0; if (!newNormalForm->IsZero() && newNormalForm->Lm() == currentTriple->GetPolynomLm()) { currentNmpSet = currentTriple->GetNmp(); currentAncestor = currentTriple->GetAncestor(); if (currentAncestor == currentTriple) { currentAncestor = 0; } } delete currentTriple; if (!newNormalForm->IsZero()) { std::list<Triple<MonomType>*> newProlongations; tit = IntermediateBasis.Begin(); while (tit != IntermediateBasis.End()) { if ((**tit).GetPolynomLm().IsTrueDivisibleBy(newNormalForm->Lm())) { ProlongationsSet.DeleteDescendants(*tit); newProlongations.push_back(*tit); tit = IntermediateBasis.Erase(tit); } else { ++tit; } } IntermediateBasis.PushBack(new Triple<MonomType>(newNormalForm, currentAncestor, currentNmpSet, 0, -1)); if (!newNormalForm->Degree()) { return; } IntermediateBasis.CollectNonMultiProlongations(--IntermediateBasis.End(), newProlongations); ProlongationsSet.Insert(newProlongations); } else { delete newNormalForm; } } }