// complete algorithm to compute a Groebner basis F void gb( IntermediateBasis &F, int n) { int nextIndex = F.size(); rearrangeBasis(F, -1); interreduction(F); Pairs B = makeList(F, n); //unsigned int countAddPoly = 0; //unsigned int numSPoly= 0; int interreductionCounter = 0; while (!B.empty()) { Pair pair = *(B.begin()); B.erase(B.begin()); if (isGoodPair(pair,F,B,n)) { //numSPoly++; BRP S = sPolynomial(pair,F,n); reduce(S,F); if ( ! S.isZero() ) { //countAddPoly++; F[nextIndex] = S; if(interreductionCounter == 5) { interreductionCounter = 0; interreduction(F); B = makeList(F, n); } else { interreductionCounter++; Pairs newList = makeNewPairs(nextIndex, F, n); B.insert(newList.begin(), newList.end()); } nextIndex++; } } } interreduction(F); //cout << "we computed " << numSPoly << " S Polynomials and added " << countAddPoly << " of them to the intermediate basis." << endl; }
// generate list of index pairs for a new index and an intermediate basis Pairs makeNewPairs(int newIndex, const IntermediateBasis &F, int n) { Pairs B; Pairs::iterator position = B.begin(); for(int i=-n; i<0; i++) { Pair pair = Pair(i, newIndex, F); position = B.insert(position, pair); } IntermediateBasis::const_iterator end = F.end(); end--; for(IntermediateBasis::const_iterator iter = F.begin(); iter != end; ++iter) { int j = iter->first; Pair pair = Pair(newIndex, j, F); if (pair.good) { position = B.insert(position, pair); } } return B; }
// generate list of index pairs for given intermediate basis // first insert all pairs with FPs, then insert pairs of all other polynomials // the list of indeces was ordered by increasingly Pairs makeList(const IntermediateBasis &F, int n) { Pairs B; Pairs::iterator position = B.begin(); IntermediateBasis::const_iterator end = F.end(); for(IntermediateBasis::const_iterator iter = F.begin(); iter != end; ++iter) { int j = iter->first; for(int i=-n; i<0; i++) { Pair pair = Pair(i, j, F); position = B.insert(position, pair); } for(int i=0; i<j; i++) { Pair pair = Pair(i, j, F); if (pair.good) { position = B.insert(position, pair); } } } return B; }