// determine the part of a polynomials of a given degree
template <class CacheType, class NaviType, class DegType, class SetType>
SetType
dd_graded_part(const CacheType& cache, NaviType navi, DegType deg,
SetType init) {
if (deg == 0) {
while(!navi.isConstant())
navi.incrementElse();
return SetType(navi);
}
if(navi.isConstant())
return SetType();
// Look whether result was cached before
NaviType cached = cache.find(navi, deg);
if (cached.isValid())
return SetType(cached);
SetType result =
SetType(*navi,
dd_graded_part(cache, navi.thenBranch(), deg - 1, init),
dd_graded_part(cache, navi.elseBranch(), deg, init)
);
// store result for later reuse
cache.insert(navi, deg, result.navigation());
return result;
}
The encoding of integers for the degree as variable is done implicitely by our cache lookup functions.