Explore form-preserving functions
Keep polynomial and quotient forms visible while applying expansion, recentering, combination, and cancellation explicitly.
Use .ff for both preserved polynomial forms and fractional forms. Values are ordinary callables.
Operations preserve their construction
Addition and multiplication retain their expression trees. Together is an explicit choice.
Expand and recenter explicitly
Compare form, value, and function domain
C displays a cancelled form but still has the source hole at 1. Crossing to canonical RationalFunction semantics is explicit.
Calling C(1) still reports division by zero, while F.Canonical()(1) is 2.
Canonical projections
Verified presentations that retain the source domain
Factorization, square-free decomposition, and partial fractions operate on the canonical exact projection. Their FractionFunction wrappers keep the original domain authoritative:
factored.Source()(1) still fails because the source denominator is zero. factored.Canonical()(1) is 2; that is an explicitly requested canonical projection, not a widening of the source function's domain.
Zeros, poles, and removable holes
The canonical zero is -1, there are no canonical poles, and the cancelled source restriction gives the removable hole at 1. When an irreducible factor remains, verified still certifies the displayed algebra while complete stays null and the residual polynomial records what is not yet enumerated.
For a classroom comparison, render all three transformations together or one at a time:
Export forms and restrictions to Calculus
.symbolic loads FractionFunction and Calculus together. Displayed and source-domain evaluation forms cross the public expression boundary separately, so cancellation cannot hide a removable hole:
Differentiate the exported form with the obligation-bearing Calculus result:
The derivative result retains the quotient's nonzero denominator condition. .symbolic.Obligations(F) exposes the same source-domain restriction directly from FractionFunction metadata.
Polynomial FractionFunctions also use the higher-derivative and evaluation façades without leaving the public Calculus representation:
They can also formulate integral records without erasing source-domain holes:
Both records inherit x != 0 from the FractionFunction. The family merely selects Log(x) as a representative plus an explicit constant; it does not silently certify the identity or discharge the restriction.