Documentation

HexPolyZ.Decomposition

A primitive integer polynomial is nonzero.

The primitive field reassembles over Rat[x] as a rational scalar multiple of the product of the square-free part and repeated part.

A nonzero square-free part from the primitive square-free decomposition is square-free over Rat[x].

For nonzero input, the product of the square-free part and repeated part is primitive.

Companion to primitiveSquareFreeDecomposition_squareFreeCore_eq_one_of_degree_zero: when the recorded square-free part has degree zero (and is nonzero), the recorded repeatedPart collapses to 1. The derivative-zero branch settles the goal by the literal repeatedPart := 1 field, while the derivative-nonzero branch is ruled out via the gcd-derivative degree arithmetic (derivative.size ≤ ratPrimitive.size - 1 combined with the quotient being a rational unit).

The square-free part produced by primitive square-free decomposition has nonnegative leading coefficient.

The repeated part produced by primitive square-free decomposition has nonnegative leading coefficient.

For nonzero input, the product of the square-free part and repeated part has positive leading coefficient.

For nonzero input, the product of the square-free part and repeated part reassembles the primitive part up to sign.

The squareFreeCore projection is the decomposition's square-free part. A definitional correspondence for consumers that cannot unfold the unexposed def.

The square-free part of a nonzero polynomial is nonzero: in the signed reassembly it is a factor of the (nonzero) primitive part.

The square-free core of a nonzero polynomial is primitive.

The square-free core of a nonzero polynomial has positive leading coefficient.

The square-free core of a nonzero polynomial is square-free over Rat[x]: combine the executable core square-freeness with core nonzeroness.

The rational cast of the repeated part divides the derivative of the rational cast of the primitive part. The repeated part is a rational associate of gcd(primitive, primitive'), which divides primitive'; this is the divisibility the square-free-part root transfer consumes.

theorem Hex.ZPoly.coprimeModP_of_bezout (f g s t : ZPoly) (p : Nat) (hbez : (s * f + t * g).congr 1 p) :

A Bezout congruence witness proves that two integer polynomials are coprime modulo p.

Gauss descent: if a primitive integer polynomial r divides f over the rationals (ℚ[x]), then it divides f over the integers (ℤ[x]). The rational cofactor is cleared to a primitive integer polynomial via ratPolyPrimitivePart, and rational_associate_primitive_unit forces the leftover rational scalar to be ±1, so the integer product recovers f's primitive part exactly.

On a nonzero input whose primitive part is square-free over , the repeated part of the primitive square-free decomposition is 1.

On a nonzero input whose primitive part is square-free over , the square-free part of the primitive square-free decomposition is exactly the sign-normalized primitive part. Together with primitiveSquareFreeDecomposition_repeatedPart_eq_one_of_squareFreeRat, this is the trivial decomposition that the modular square-free fast path returns.