16 #ifndef polybori_groebner_NextSpoly_h_
17 #define polybori_groebner_NextSpoly_h_
34 m_gen(gen), m_status(status) {}
37 return compute(act_pair, act_pair.
extract(m_gen));
43 return compute(act_pair.
ijPair(), result);
52 int i = ij.
i, j = ij.
j;
54 m_status.setToHasTRep(ij.
i, ij.
j);
55 if ((i != ij.
i) || (ij.
j != j)){
56 m_status.setToHasTRep(i,j);
57 return spoly(m_gen[i].p, m_gen[j].p);
63 m_gen(vp.
i).vPairCalculated.insert(vp.
v);
64 return (!res.
isZero() && (res.
lead() == m_gen[vp.
i].lead)?
65 res + m_gen[vp.
i].p: res);
70 m_gen.leadingTerms.
divisorsOf(m_gen[first].leadExp.LCM(m_gen[second].leadExp));
75 template <
class Iterator>
76 void replacePair(Iterator start, Iterator finish,
int& first,
int& second) {
77 std::pair<int, int> original(first, second);
78 while(start != finish)
79 replaceGenerators(m_gen.index(*start++), original, first, second);
83 void replaceGenerators(
int index, std::pair<int, int> original,
84 int& first,
int& second)
const {
86 if ((index != original.first) && (index != original.second)) {
87 replaceGenerator(index, original.first, first);
88 replaceGenerator(index, original.second, second);
93 void replaceGenerator(
int next,
int original,
int& current)
const {
94 if (m_status.hasTRep(next, original) &&
95 (m_gen[current].weightedLength > m_gen[next].weightedLength) &&
96 (m_gen[next].ecart() <= m_gen[original].ecart()))
100 ReductionStrategy& m_gen;
101 PairStatusSet& m_status;