1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30
|
void improveB(ExternalTerm& b, const TermTree& tree) {
int position = tree.getPosition() + 1;
if (_dimension - position < 10)
return;
ExternalTerm lcm(_dimension);
tree.lcm(lcm);
vector<ExternalTerm> gcds;
gcds.reserve(_dimension);
for (int i = 0; i < (int)_dimension; ++i)
gcds.push_back(lcm);
ExternalTerm term(_dimension);
TermTree::TreeIterator treeIt((TermTree&)tree);
while (!treeIt.atEnd()) {
treeIt.getTerm(term);
for (int i = position; i < (int)_dimension; ++i)
if (term[i] > b[i])
gcds[i].gcd(gcds[i], term, position);
++treeIt;
}
for (int i = position; i < (int)_dimension; ++i) {
gcds[i][i] -= 1;
b.lcm(b, gcds[i], position);
}
}
|