1-- The multiplicative identity for finite polynomial convolution (ZF).2-- Part of Cumulus, the Grace17 mathematics library.3-- Copyright (c) 2026 Grant Passmore.4-- Released under the Apache License 2.0. See LICENSE in the repository root.5-- Authors: Grant Passmore67module Grace.Cumulus.Algebra.Polynomial.Unit8import Distributivity910theorem polynomialConstant.support (I A zero a : Set)11requires zeroIn : zero ∈ A12requires coefficient : a ∈ A13shows functionSupport(polynomialConstant(I, A, zero, a), monomials(I), zero) ⊆ {monomialOne(I)}14proof15unfold polynomialConstant16unfold polynomialTerm17exact coefficientSingle.support with*1819section Rings20variable (I A add zero neg mul one p : Set)21hypothesisring : IsCommRing(A, add, zero, neg, mul, one)22hypothesis member : p ∈ polynomials(I, A, zero)23notationring R := (A, add, zero, neg, mul, one)2425theorem polynomialProduct.one_right26shows polynomialProduct(I, A, add, zero, neg, mul, one, p, polynomialConstant(I, A, zero, one)) = p27proof28have ordinary := IsCommRing.ring withring29have zeroIn := IsRing.zero_in_carrier with ordinary30have multiplicative := IsRing.multiplicative with ordinary31have oneIn := IsMonoid.unit_in_carrier with multiplicative32have unit := monomialOne.member at I33have unitPolynomial := polynomialConstant.member at I, A, zero, one with*34have unitValue := polynomialConstant.coefficient at I, A, zero, one with*35have unitSupport := polynomialConstant.support at I, A, zero, one with*36have support := functionSupport.subset at p, monomials(I), zero37have singletonSubset : {monomialOne(I)} ⊆ monomials(I)38settlewith Subset, singleton.membership39have finiteSupport := polynomials.finite_support with member40have finiteSingleton := Finite.singleton at monomialOne(I)41have finite := Finite.product with finiteSupport, finiteSingleton42have domain := product.monotone with support, singletonSubset43have reflexive : functionSupport(p, monomials(I), zero) ⊆ functionSupport(p, monomials(I), zero)44settlewith Subset45have covers : convolutionPairs(I, zero, p, polynomialConstant(I, A, zero, one)) ⊆ functionSupport(p, monomials(I), zero) × {monomialOne(I)}46unfold convolutionPairs47exact product.monotone with reflexive, unitSupport48have weights := boundedConvolutionWeights.function at I, functionSupport(p, monomials(I), zero) × {monomialOne(I)}, A, add, zero, neg, mul, one, p, polynomialConstant(I, A, zero, one) with*49have target := polynomials.function with member50have values : ∀ t ∈ functionSupport(p, monomials(I), zero) × {monomialOne(I)}, boundedConvolutionWeights(I, functionSupport(p, monomials(I), zero) × {monomialOne(I)}, A, add, zero, neg, mul, one, p, polynomialConstant(I, A, zero, one))(t) = p(monomialMul(I)(t))51intros t ht52obtain⟨bound, u, hu, v, hv, shape⟩:= product.membership.forward at53 functionSupport(p, monomials(I), zero), {monomialOne(I)}, t with ht54have equal := singleton.membership.forward at v, monomialOne(I) with hv55have data := functionSupport.membership.forward at p, monomials(I), zero, u with hu56have inD : (u, monomialOne(I)) ∈ functionSupport(p, monomials(I), zero) × {monomialOne(I)}57have singleton := singleton.self at monomialOne(I)58exact product.pair with hu, singleton59have coefficient := polynomials.coefficient at I, A, zero, p, u with*60have output := boundedConvolutionWeights.pair at I, functionSupport(p, monomials(I), zero) × {monomialOne(I)}, A, add, zero, neg, mul, one, p, polynomialConstant(I, A, zero, one), u, monomialOne(I) with*61have index := monomialMul.apply at I, u, monomialOne(I) with*62unfold call2 at index63have unitLaw := monomialProduct.one at I, u with*64have scalarUnit : p(u) * one = p(u)65ring66cc67have injective : ∀ t ∈ functionSupport(p, monomials(I), zero) × {monomialOne(I)}, ∀ s ∈ functionSupport(p, monomials(I), zero) × {monomialOne(I)}, monomialMul(I)(t) = monomialMul(I)(s) → t = s68intros t ht s hs equalImages69obtain⟨boundT, u, hu, v, hv, shapeT⟩:= product.membership.forward at70 functionSupport(p, monomials(I), zero), {monomialOne(I)}, t with ht71obtain⟨boundS, x, hx, y, hy, shapeS⟩:= product.membership.forward at72 functionSupport(p, monomials(I), zero), {monomialOne(I)}, s with hs73have equalV := singleton.membership.forward at v, monomialOne(I) with hv74have equalY := singleton.membership.forward at y, monomialOne(I) with hy75have dataU := functionSupport.membership.forward at p, monomials(I), zero, u with hu76have dataX := functionSupport.membership.forward at p, monomials(I), zero, x with hx77have indexU := monomialMul.apply at I, u, monomialOne(I) with*78have indexX := monomialMul.apply at I, x, monomialOne(I) with*79unfold call2 at indexU80unfold call2 at indexX81have unitU := monomialProduct.one at I, u with*82have unitX := monomialProduct.one at I, x with*83cc84have coverage : ∀ c ∈ monomials(I), p(c) ≠ zero →∃ t ∈ functionSupport(p, monomials(I), zero) × {monomialOne(I)}, monomialMul(I)(t) = c85intros c hc nonzero86have supported : c ∈ functionSupport(p, monomials(I), zero)87apply functionSupport.membership.backward at p, monomials(I), zero, c88refine⟨hc, nonzero⟩89have singleton : monomialOne(I) ∈ {monomialOne(I)}90settlewith singleton.membership91have pair := product.pair with supported, singleton92have index := monomialMul.apply at I, c, monomialOne(I) with*93unfold call2 at index94have unitLaw := monomialProduct.one at I, c with*95refine⟨(c, monomialOne(I)), pair, _⟩96cc97have reconstructed := finitePushforward.reconstruct at functionSupport(p, monomials(I), zero) × {monomialOne(I)}, monomials(I), A, add, zero, neg, mul, one, monomialMul(I), boundedConvolutionWeights(I, functionSupport(p, monomials(I), zero) × {monomialOne(I)}, A, add, zero, neg, mul, one, p, polynomialConstant(I, A, zero, one)), p with*98have bounded := polynomialProduct.on_domain withring, member, unitPolynomial, domain, finite, covers99cc100101theorem polynomialProduct.one_left102shows polynomialProduct(I, A, add, zero, neg, mul, one, polynomialConstant(I, A, zero, one), p) = p103proof104have ordinary := IsCommRing.ring withring105have zeroIn := IsRing.zero_in_carrier with ordinary106have multiplicative := IsRing.multiplicative with ordinary107have oneIn := IsMonoid.unit_in_carrier with multiplicative108have unitPolynomial := polynomialConstant.member at I, A, zero, one with*109have commutative := polynomialProduct.commutative at I, A, add, zero, neg, mul, one, polynomialConstant(I, A, zero, one), p with*110haveright:= polynomialProduct.one_right withring, member111cc112113end Rings114