hex

19.3. Producing a factorization🔗

For a Polynomial ℤ input, factor_poly returns Hex.FactoredPoly: a scalar, a list of irreducible factors, and proofs that the scalar times their product is the input.

open Polynomial noncomputable def facZ := factor_poly ((X - 1) ^ 2 * (X ^ 2 + 1) * 6 : Polynomial ) example : facZ.scalar = 6 := rfl example : facZ.factors.length = 3 := rfl

The tactic form introduces transparent local names and their proofs:

open Polynomial example : True := True scalar: := (FactoredPoly.ofZ ((X - 1) * (X + 1)) (DensePoly.ofCoeffs #[-1, 0, 1]) 1 [DensePoly.ofCoeffs #[1, 1], DensePoly.ofCoeffs #[-1, 1]] [(DensePoly.ofCoeffs #[1, 1], ZPoly.IrredWitness.linear), (DensePoly.ofCoeffs #[-1, 1], ZPoly.IrredWitness.linear)] [] ).scalarfactors:List [X] := (FactoredPoly.ofZ ((X - 1) * (X + 1)) (DensePoly.ofCoeffs #[-1, 0, 1]) 1 [DensePoly.ofCoeffs #[1, 1], DensePoly.ofCoeffs #[-1, 1]] [(DensePoly.ofCoeffs #[1, 1], ZPoly.IrredWitness.linear), (DensePoly.ofCoeffs #[-1, 1], ZPoly.IrredWitness.linear)] [] ).factorsfactors_mul:C scalar * factors.prod = (X - 1) * (X + 1)factors_irred: q factors, Irreducible qTrue scalar: := (FactoredPoly.ofZ ((X - 1) * (X + 1)) (DensePoly.ofCoeffs #[-1, 0, 1]) 1 [DensePoly.ofCoeffs #[1, 1], DensePoly.ofCoeffs #[-1, 1]] [(DensePoly.ofCoeffs #[1, 1], ZPoly.IrredWitness.linear), (DensePoly.ofCoeffs #[-1, 1], ZPoly.IrredWitness.linear)] [] ).scalarfactors:List [X] := (FactoredPoly.ofZ ((X - 1) * (X + 1)) (DensePoly.ofCoeffs #[-1, 0, 1]) 1 [DensePoly.ofCoeffs #[1, 1], DensePoly.ofCoeffs #[-1, 1]] [(DensePoly.ofCoeffs #[1, 1], ZPoly.IrredWitness.linear), (DensePoly.ofCoeffs #[-1, 1], ZPoly.IrredWitness.linear)] [] ).factorsfactors_mul:C scalar * factors.prod = (X - 1) * (X + 1)factors_irred: q factors, Irreducible qx✝:C scalar * factors.prod = (X - 1) * (X + 1)True scalar: := (FactoredPoly.ofZ ((X - 1) * (X + 1)) (DensePoly.ofCoeffs #[-1, 0, 1]) 1 [DensePoly.ofCoeffs #[1, 1], DensePoly.ofCoeffs #[-1, 1]] [(DensePoly.ofCoeffs #[1, 1], ZPoly.IrredWitness.linear), (DensePoly.ofCoeffs #[-1, 1], ZPoly.IrredWitness.linear)] [] ).scalarfactors:List [X] := (FactoredPoly.ofZ ((X - 1) * (X + 1)) (DensePoly.ofCoeffs #[-1, 0, 1]) 1 [DensePoly.ofCoeffs #[1, 1], DensePoly.ofCoeffs #[-1, 1]] [(DensePoly.ofCoeffs #[1, 1], ZPoly.IrredWitness.linear), (DensePoly.ofCoeffs #[-1, 1], ZPoly.IrredWitness.linear)] [] ).factorsfactors_mul:C scalar * factors.prod = (X - 1) * (X + 1)factors_irred: q factors, Irreducible qx✝¹:C scalar * factors.prod = (X - 1) * (X + 1)x✝: q factors, Irreducible qTrue All goals completed! 🐙

Over a prime field, the result has the analogous Hex.FpPoly.Factored type:

open Hex local instance boundsFive : ZMod64.Bounds 5 := 0 < 5 All goals completed! 🐙, 5 < 2 ^ 31 All goals completed! 🐙 def fp : FpPoly 5 := #p[4, 0, 1] def fpFactors : FpPoly.Factored fp := factor_poly fp