1-- Closure of polynomial supports in monomial ideals under the ring operations.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.IdealSupport8import Ring910section Rings11variable (I A add zero neg mul one U : Set)12hypothesisring : IsCommRing(A, add, zero, neg, mul, one)1314theorem monomialIdealPolynomials.zero15shows constantFunction(monomials(I), A, zero) ∈ monomialIdealPolynomials(I, A, zero, U)16proof17have polynomial := polynomials.zero at I, A, add, zero, neg, mul, one with*18have ordinary := IsCommRing.ring withring19have zeroIn := IsRing.zero_in_carrier with ordinary20apply monomialIdealPolynomials.membership.backward21refine⟨polynomial, _⟩22intros m hm23have data := functionSupport.membership.forward with hm24have value := constantFunction.apply at monomials(I), A, m, zero with*25exfalso26exact data.right with value2728theorem monomialIdealPolynomials.add (p q : Set)29requires memberP : p ∈ monomialIdealPolynomials(I, A, zero, U)30requires memberQ : q ∈ monomialIdealPolynomials(I, A, zero, U)31shows coefficientAdd(monomials(I), A, add, zero, neg, mul, one, p, q) ∈ monomialIdealPolynomials(I, A, zero, U)32proof33have dataP := monomialIdealPolynomials.membership.forward with memberP34have dataQ := monomialIdealPolynomials.membership.forward with memberQ35have polynomial := polynomials.add at I, A, add, zero, neg, mul, one, p, q with*36have functionP := polynomials.function with dataP.left37have functionQ := polynomials.function with dataQ.left38have support := coefficientAdd.support at monomials(I), A, add, zero, neg, mul, one, p, q with*39have unionBound : functionSupport(p, monomials(I), zero) ∪ functionSupport(q, monomials(I), zero) ⊆ U40have boundP := dataP.right41have boundQ := dataQ.right42simp [Subset, union2.membership]43have bounded := Subset.transitive with support, unionBound44exact monomialIdealPolynomials.membership.backward with⟨polynomial, bounded⟩4546theorem monomialIdealPolynomials.neg (p : Set)47requires memberP : p ∈ monomialIdealPolynomials(I, A, zero, U)48shows coefficientNeg(monomials(I), A, add, zero, neg, mul, one, p) ∈ monomialIdealPolynomials(I, A, zero, U)49proof50have data := monomialIdealPolynomials.membership.forward with memberP51have polynomial := polynomials.neg at I, A, add, zero, neg, mul, one, p with*52have function := polynomials.function with data.left53have support := coefficientNeg.support with*54have bounded := Subset.transitive with support, data.right55exact monomialIdealPolynomials.membership.backward with⟨polynomial, bounded⟩5657theorem monomialIdealPolynomials.mul_right (p q : Set)58requires ideal : MonomialIdeal(I, U)59requires memberP : p ∈ monomialIdealPolynomials(I, A, zero, U)60requires memberQ : q ∈ polynomials(I, A, zero)61shows polynomialProduct(I, A, add, zero, neg, mul, one, p, q) ∈ monomialIdealPolynomials(I, A, zero, U)62proof63have data := monomialIdealPolynomials.membership.forward with memberP64have polynomial := polynomialProduct.member at I, A, add, zero, neg, mul, one, p, q with*65have bounded : functionSupport(polynomialProduct(I, A, add, zero, neg, mul, one, p, q), monomials(I), zero) ⊆ U66intros m hm67obtain⟨u, hu, v, hv, equation⟩:= polynomialProduct.support_factor at I, A, add, zero, neg, mul, one, p, q, m with*68have supportBound := data.right69have inIdeal := supportBound with u, hu70have monomial := functionSupport.membership.forward with hv71have product := ideal.right with u, inIdeal, v, monomial.left72 rwa equation73exact monomialIdealPolynomials.membership.backward with⟨polynomial, bounded⟩7475theorem monomialIdealPolynomials.mul_left (p q : Set)76requires ideal : MonomialIdeal(I, U)77requires memberP : p ∈ polynomials(I, A, zero)78requires memberQ : q ∈ monomialIdealPolynomials(I, A, zero, U)79shows polynomialProduct(I, A, add, zero, neg, mul, one, p, q) ∈ monomialIdealPolynomials(I, A, zero, U)80proof81have data := monomialIdealPolynomials.membership.forward with memberQ82have comm := polynomialProduct.commutative at I, A, add, zero, neg, mul, one, p, q with*83have absorbed := monomialIdealPolynomials.mul_right at I, A, add, zero, neg, mul, one, U, q, p with*84 rwa comm8586theorem monomialIdealPolynomials.ideal87requires ideal : MonomialIdeal(I, U)88shows IsIdeal(polynomials(I, A, zero), polynomialAdd(I, A, add, zero, neg, mul, one), constantFunction(monomials(I), A, zero), polynomialNeg(I, A, add, zero, neg, mul, one), polynomialMul(I, A, add, zero, neg, mul, one), monomialIdealPolynomials(I, A, zero, U))89proof90have subset : monomialIdealPolynomials(I, A, zero, U) ⊆ polynomials(I, A, zero)91intros p hp92have data := monomialIdealPolynomials.membership.forward with hp93exact data.left94have zeroMember := monomialIdealPolynomials.zero at I, A, add, zero, neg, mul, one, U with*95have addition : ∀ p ∈ monomialIdealPolynomials(I, A, zero, U), ∀ q ∈ monomialIdealPolynomials(I, A, zero, U), (polynomialAdd(I, A, add, zero, neg, mul, one))(p, q) ∈ monomialIdealPolynomials(I, A, zero, U)96intros p hp q hq97have dataP := monomialIdealPolynomials.membership.forward with hp98have dataQ := monomialIdealPolynomials.membership.forward with hq99have value := polynomialAdd.apply at I, A, add, zero, neg, mul, one, p, q with*100rw value101exact monomialIdealPolynomials.add at I, A, add, zero, neg, mul, one, U, p, q with*102have negation : ∀ p ∈ monomialIdealPolynomials(I, A, zero, U), (polynomialNeg(I, A, add, zero, neg, mul, one))(p) ∈ monomialIdealPolynomials(I, A, zero, U)103intros p hp104have data := monomialIdealPolynomials.membership.forward with hp105have value := polynomialNeg.apply at I, A, add, zero, neg, mul, one, p with*106rw value107exact monomialIdealPolynomials.neg at I, A, add, zero, neg, mul, one, U, p with*108have absorption : ∀ p ∈ polynomials(I, A, zero), ∀ q ∈ monomialIdealPolynomials(I, A, zero, U), (polynomialMul(I, A, add, zero, neg, mul, one))(p, q) ∈ monomialIdealPolynomials(I, A, zero, U) ∧ (polynomialMul(I, A, add, zero, neg, mul, one))(q, p) ∈ monomialIdealPolynomials(I, A, zero, U)109intros p hp q hq110have data := monomialIdealPolynomials.membership.forward with hq111have leftValue := polynomialMul.apply at I, A, add, zero, neg, mul, one, p, q with*112have rightValue := polynomialMul.apply at I, A, add, zero, neg, mul, one, q, p with*113constructor114 . rw leftValue115exact monomialIdealPolynomials.mul_left at I, A, add, zero, neg, mul, one, U, p, q with*116 . rw rightValue117exact monomialIdealPolynomials.mul_right at I, A, add, zero, neg, mul, one, U, q, p with*118unfold IsIdeal119refine⟨subset, zeroMember, addition, negation, absorption⟩120121end Rings122