ReductionCogBase is an abstract class to perform a full reduction:
it contains two parts: "IgnoredPPs" summands whose PPs are to be ignored "Active" the part which will be reduced Thanks to the limited operations allowed on a ReductionCog, all PP in IgnoredPPs are gueranteed bigger than the PPs in the Active part.
with a ReductionCog F you can compute:
ActiveLPP(F) the LPP of the Active part IsActiveZero(F) is the Active part zero?
F.myMoveToNextLM() move the LM of the Active part to the IgnoredPPs F.myReduce(f) reduce the Active part with f F.myAssignReset(f) the Active part gets f; f and IgnoredPPs get 0 F.myAssignReset(f, fLen) same as above but faster for geobucket implementation F.myRelease(f) F gets the total value of f; f gets 0 F.myOutput(out)
The idea is that LM will be reduced first, if the result is not 0 it will be "set aside and ignored" and the new LM of the Active part will be reduced, and so on.
The result of myReduce is defined up to a constant (in the coefficients ring)
Constructors are
ReductionCog NewRedCogPolyField(const SparsePolyRing& P); ReductionCog NewRedCogPolyGCD(const SparsePolyRing& P); ReductionCog NewRedCogGeobucketField(const SparsePolyRing& P); ReductionCog NewRedCogGeobucketGCD(const SparsePolyRing& P);
If "GCD" myRelease makes poly content free, but if "Field: myRelease does NOT make poly monic. ... I can't remember why I made this choice....
ReductionCog F = ChooseReductionCogGeobucket(myGRingInfoValue); F->myAssignReset(f, fLen); while ( !IsActiveZero(F) ) { (..) // find reducer g or break F->myReduce(g); } F->myRelease(f);
in general the geobucket implementation are to be preferred
RedCog::PolyFieldImpl
RedCog::PolyGCDImpl
RedCog::GeobucketFieldImpl
RedCog::GeobucketGCDImpl