  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);
    }
  }
