Documentation

CompPoly.Multilinear.Basic

Multilinear Polynomials #

This file defines computable representations of multilinear polynomials.

The first representation is by their coefficients, and the second representation is by their evaluations over the Boolean hypercube {0,1}^n. Both representations are defined as Vectors of length 2^n, where n is the number of variables. We will define operations on these representations, and prove equivalence between them, and with the standard Mathlib definition of multilinear polynomials, which is the type R⦃≤ 1⦄[X Fin n] (notation for MvPolynomial.restrictDegree (Fin n) R 1).

TODOs #

@[reducible]
def CompPoly.CMlPolynomial (R : Type u_1) (n : ) :
Type u_1

CMlPolynomial n R is the type of multilinear polynomials in n variables over a ring R. It is represented by its monomial coefficients as a Vector of length 2^n. The indexing is little-endian (i.e. the least significant bit is the first bit).

Equations
    Instances For
      def CompPoly.CMlPolynomial.mk {R : Type u_1} (n : ) (v : Vector R (2 ^ n)) :
      Equations
        Instances For
          @[reducible]
          def CompPoly.CMlPolynomialEval (R : Type u_1) (n : ) :
          Type u_1

          CMlPolynomialEval n R is the type of multilinear polynomials in n variables over a ring R. It is represented by its evaluations over the Boolean hypercube {0,1}^n, i.e. Lagrange basis coefficients. The indexing is little-endian (i.e. the least significant bit is the first bit).

          Equations
            Instances For
              def CompPoly.CMlPolynomialEval.mk {R : Type u_1} (n : ) (v : Vector R (2 ^ n)) :
              Equations
                Instances For
                  @[inline]
                  def CompPoly.CMlPolynomial.ofArray {R : Type u_1} [Zero R] (coeffs : Array R) (n : ) :

                  Conform a list of coefficients to a CMlPolynomial with a given number of variables. May either pad with zeros or truncate.

                  Equations
                    Instances For
                      @[inline]
                      Equations
                        Instances For
                          @[inline]
                          def CompPoly.CMlPolynomial.add {R : Type u_1} {n : } [Add R] (p q : CMlPolynomial R n) :

                          Add two CMlPolynomials

                          Equations
                            Instances For
                              @[inline]
                              def CompPoly.CMlPolynomial.neg {R : Type u_1} {n : } [Neg R] (p : CMlPolynomial R n) :

                              Negation of a CMlPolynomial

                              Equations
                                Instances For
                                  @[inline]
                                  def CompPoly.CMlPolynomial.smul {R : Type u_1} {n : } [Mul R] (r : R) (p : CMlPolynomial R n) :

                                  Scalar multiplication of a CMlPolynomial

                                  Equations
                                    Instances For
                                      @[inline]
                                      def CompPoly.CMlPolynomial.nsmul {R : Type u_1} {n : } [SMul R] (m : ) (p : CMlPolynomial R n) :

                                      Scalar multiplication of a CMlPolynomial by a natural number

                                      Equations
                                        Instances For
                                          @[inline]
                                          def CompPoly.CMlPolynomial.zsmul {R : Type u_1} {n : } [SMul R] (m : ) (p : CMlPolynomial R n) :

                                          Scalar multiplication of a CMlPolynomial by an integer

                                          Equations
                                            Instances For
                                              Equations
                                                def CompPoly.CMlPolynomial.monomialBasis {R : Type u_1} {n : } [CommRing R] (w : Vector R n) :
                                                Vector R (2 ^ n)
                                                Equations
                                                  Instances For
                                                    theorem CompPoly.CMlPolynomial.monomialBasis_getElem {R : Type u_1} {n : } [CommRing R] {w : Vector R n} (i : Fin (2 ^ n)) :
                                                    (monomialBasis w)[i] = j : Fin n, if { toFin := i }.getLsb j = true then w[j] else 1

                                                    The i-th element of monomialBasis w is the product of w[j] if the j-th bit of i is 1, and 1 if the j-th bit of i is 0.

                                                    def CompPoly.CMlPolynomial.map {R : Type u_1} {n : } [CommRing R] {S : Type u_3} [CommRing S] (f : R →+* S) (p : CMlPolynomial R n) :
                                                    Equations
                                                      Instances For
                                                        def CompPoly.CMlPolynomial.eval {R : Type u_1} {n : } [CommRing R] (p : CMlPolynomial R n) (x : Vector R n) :
                                                        R

                                                        Evaluate a CMlPolynomial at a point

                                                        Equations
                                                          Instances For
                                                            def CompPoly.CMlPolynomial.eval₂ {R : Type u_1} {n : } [CommRing R] {S : Type u_3} [CommRing S] (p : CMlPolynomial R n) (f : R →+* S) (x : Vector S n) :
                                                            S
                                                            Equations
                                                              Instances For
                                                                @[inline]
                                                                def CompPoly.CMlPolynomialEval.ofArray {R : Type u_1} [Zero R] (coeffs : Array R) (n : ) :

                                                                Conform a list of coefficients to a CMlPolynomialEval with a given number of variables. May either pad with zeros or truncate.

                                                                Equations
                                                                  Instances For
                                                                    @[inline]
                                                                    Equations
                                                                      Instances For
                                                                        @[inline]

                                                                        Add two CMlPolynomialEvals

                                                                        Equations
                                                                          Instances For
                                                                            @[inline]

                                                                            Negation of a CMlPolynomialEval

                                                                            Equations
                                                                              Instances For
                                                                                @[inline]
                                                                                def CompPoly.CMlPolynomialEval.smul {R : Type u_1} {n : } [Mul R] (r : R) (p : CMlPolynomialEval R n) :

                                                                                Scalar multiplication of a CMlPolynomialEval

                                                                                Equations
                                                                                  Instances For
                                                                                    @[inline]

                                                                                    Scalar multiplication of a CMlPolynomialEval by a natural number

                                                                                    Equations
                                                                                      Instances For
                                                                                        @[inline]

                                                                                        Scalar multiplication of a CMlPolynomialEval by an integer

                                                                                        Equations
                                                                                          Instances For
                                                                                            def CompPoly.CMlPolynomialEval.lagrangeBasis {R : Type u_1} {n : } [CommRing R] (w : Vector R n) :
                                                                                            Vector R (2 ^ n)

                                                                                            Lagrange (hypercube) basis at point w.

                                                                                            Returns the length-2^n vector v such that for any x ∈ {0,1}^n, letting i = ∑_{j=0}^{n-1} x_j · 2^j (little‑endian indexing), we have v[i] = ∏_{j < n} (x_j · w[j] + (1 - x_j) · (1 - w[j])). Equivalently, for i : Fin (2^n), v[i] = ∏_{j < n}, (if the j-th bit of i is 1 then w[j] else 1 - w[j]).

                                                                                            Equations
                                                                                              Instances For
                                                                                                theorem CompPoly.CMlPolynomialEval.lagrangeBasis_getElem {R : Type u_1} {n : } [CommRing R] {w : Vector R n} (i : Fin (2 ^ n)) :
                                                                                                (lagrangeBasis w)[i] = j : Fin n, if { toFin := i }.getLsb j = true then w[j] else 1 - w[j]

                                                                                                The i-th element of lagrangeBasis w is the product of w[j] if the j-th bit of i is 1, and 1 - w[j] if the j-th bit of i is 0.

                                                                                                def CompPoly.CMlPolynomialEval.map {R : Type u_1} {n : } [CommRing R] {S : Type u_3} [CommRing S] (f : R →+* S) (p : CMlPolynomialEval R n) :

                                                                                                Map a ring homomorphism over a CMlPolynomialEval

                                                                                                Equations
                                                                                                  Instances For
                                                                                                    def CompPoly.CMlPolynomialEval.eval {R : Type u_1} {n : } [CommRing R] (p : CMlPolynomialEval R n) (x : Vector R n) :
                                                                                                    R

                                                                                                    Evaluate a CMlPolynomialEval at a point

                                                                                                    Equations
                                                                                                      Instances For
                                                                                                        def CompPoly.CMlPolynomialEval.eval₂ {R : Type u_1} {n : } [CommRing R] {S : Type u_3} [CommRing S] (p : CMlPolynomialEval R n) (f : R →+* S) (x : Vector S n) :
                                                                                                        S

                                                                                                        Evaluate a CMlPolynomialEval at a point using a ring homomorphism

                                                                                                        Equations
                                                                                                          Instances For
                                                                                                            @[inline]
                                                                                                            def CompPoly.CMlPolynomial.monoToLagrangeLevel {R : Type u_2} [AddCommGroup R] {n : } (j : Fin n) :
                                                                                                            Vector R (2 ^ n)Vector R (2 ^ n)

                                                                                                            One level of the zeta‑transform (coefficient to evaluation).

                                                                                                            This function performs the transformation for the j-th variable (corresponding to the j-th bit). It iterates over all indices i in the boolean hypercube. If the j-th bit of i is 1, it adds the value at the corresponding index with the j-th bit 0 (i - stride) to the current value. This effectively computes the partial sum along the j-th dimension, which corresponds to evaluating the polynomial at $X_j = 1$ given its values at $X_j = 0$ (coefficients) and difference.

                                                                                                            The stride is $2^j$, representing the distance between indices that differ only in the j-th bit.

                                                                                                            Equations
                                                                                                              Instances For
                                                                                                                @[inline]

                                                                                                                Full transform: coefficients → evaluations.

                                                                                                                Equations
                                                                                                                  Instances For
                                                                                                                    @[inline]
                                                                                                                    def CompPoly.CMlPolynomial.lagrangeToMonoLevel {R : Type u_2} [AddCommGroup R] {n : } (j : Fin n) :
                                                                                                                    Vector R (2 ^ n)Vector R (2 ^ n)

                                                                                                                    One level of the inverse zeta‑transform (evaluation to coefficient).

                                                                                                                    This function performs the inverse transformation for the j-th variable. It iterates over all indices i. If the j-th bit of i is 1, it subtracts the value at the corresponding index with the j-th bit 0 (i - stride) from the current value. This recovers the coefficient for the term involving $X_j$ from the evaluations.

                                                                                                                    The stride is $2^j$.

                                                                                                                    Equations
                                                                                                                      Instances For
                                                                                                                        @[inline]
                                                                                                                        def CompPoly.CMlPolynomial.lagrangeToMono {R : Type u_2} [AddCommGroup R] (n : ) :
                                                                                                                        Vector R (2 ^ n)Vector R (2 ^ n)

                                                                                                                        Full inverse transform: evaluations → coefficients.

                                                                                                                        Equations
                                                                                                                          Instances For

                                                                                                                            The O(n^3) computable version of the Mobius Transform, serving as the spec.

                                                                                                                            TODO: prove equivalence between lagrangeToMono and lagrangeToMonoSpec

                                                                                                                            Equations
                                                                                                                              Instances For
                                                                                                                                def CompPoly.CMlPolynomial.forwardRange (n : ) (r : Fin n) (l : Fin (r + 1)) :
                                                                                                                                List (Fin n)

                                                                                                                                Generates a list of indices representing a range of bit positions [l, r] in increasing order. Used for optimized recursive transforms that operate on segments of variables. Returns a list containing l, l+1, ..., r. The result is used to fold over dimensions in monoToLagrangeSegment and lagrangeToMonoSegment.

                                                                                                                                Equations
                                                                                                                                  Instances For
                                                                                                                                    theorem CompPoly.CMlPolynomial.forwardRange_length (n : ) (r : Fin n) (l : Fin (r + 1)) :
                                                                                                                                    (forwardRange n r l).length = r - l + 1
                                                                                                                                    theorem CompPoly.CMlPolynomial.forwardRange_eq_of_r_eq (n : ) (r1 r2 : Fin n) (h_r_eq : r1 = r2) (l : Fin (r1 + 1)) :
                                                                                                                                    forwardRange n r1 l = forwardRange n r2 l,
                                                                                                                                    theorem CompPoly.CMlPolynomial.forwardRange_getElem (n : ) (r : Fin n) (l : Fin (r + 1)) (k : Fin (r - l + 1)) :
                                                                                                                                    (forwardRange n r l).get k, = l + k,
                                                                                                                                    theorem CompPoly.CMlPolynomial.forwardRange_succ_right_ne_empty (n : ) (r : Fin (n - 1)) (l : Fin (r + 1)) :
                                                                                                                                    forwardRange n r + 1, l, []
                                                                                                                                    theorem CompPoly.CMlPolynomial.forwardRange_pred_le_ne_empty (n : ) (r : Fin n) (l : Fin (r + 1)) (h_l_gt_0 : l > 0) :
                                                                                                                                    forwardRange n r l - 1, []
                                                                                                                                    theorem CompPoly.CMlPolynomial.forwardRange_dropLast (n : ) (r : Fin (n - 1)) (l : Fin (r + 1)) :
                                                                                                                                    (forwardRange n r + 1, l, ).dropLast = forwardRange n r, l,
                                                                                                                                    theorem CompPoly.CMlPolynomial.forwardRange_tail (n : ) (r : Fin n) (l : Fin (r + 1)) (h_l_gt_0 : l > 0) :
                                                                                                                                    (forwardRange n r l - 1, ).tail = forwardRange n r l
                                                                                                                                    def CompPoly.CMlPolynomial.monoToLagrangeSegment {R : Type u_2} [AddCommGroup R] (n : ) (r : Fin n) (l : Fin (r + 1)) :
                                                                                                                                    Vector R (2 ^ n)Vector R (2 ^ n)

                                                                                                                                    Performs the zeta-transform (coefficient to evaluation) on a segment of dimensions from l to r. Iteratively applies monoToLagrangeLevel for each dimension in the range. 0 ≤ l ≤ r < n.

                                                                                                                                    Equations
                                                                                                                                      Instances For
                                                                                                                                        def CompPoly.CMlPolynomial.lagrangeToMonoSegment {R : Type u_2} [AddCommGroup R] (n : ) (r : Fin n) (l : Fin (r + 1)) :
                                                                                                                                        Vector R (2 ^ n)Vector R (2 ^ n)

                                                                                                                                        Performs the inverse zeta-transform (evaluation to coefficient) on a segment of dimensions

                                                                                                                                        from l to r.

                                                                                                                                        Iteratively applies lagrangeToMonoLevel for each dimension in the range (in reverse order).

                                                                                                                                        0 ≤ l ≤ r < n.

                                                                                                                                        Equations
                                                                                                                                          Instances For
                                                                                                                                            theorem CompPoly.CMlPolynomial.monoToLagrange_eq_monoToLagrangeSegment {R : Type u_2} [AddCommGroup R] (n : ) [NeZero n] (v : Vector R (2 ^ n)) :
                                                                                                                                            have h_n_ne_zero := ; monoToLagrange n v = monoToLagrangeSegment n n - 1, 0, v
                                                                                                                                            theorem CompPoly.CMlPolynomial.lagrangeToMono_eq_lagrangeToMonoSegment {R : Type u_2} [AddCommGroup R] (n : ) [NeZero n] (v : Vector R (2 ^ n)) :
                                                                                                                                            have h_n_ne_zero := ; lagrangeToMono n v = lagrangeToMonoSegment n n - 1, 0, v
                                                                                                                                            theorem CompPoly.CMlPolynomial.mobius_apply_zeta_apply_eq_id {R : Type u_2} [AddCommGroup R] (n : ) [NeZero n] (r : Fin n) (l : Fin (r + 1)) (v : Vector R (2 ^ n)) :
                                                                                                                                            theorem CompPoly.CMlPolynomial.zeta_apply_mobius_apply_eq_id {R : Type u_2} [AddCommGroup R] (n : ) (r : Fin n) (l : Fin (r + 1)) (v : Vector R (2 ^ n)) :

                                                                                                                                            The equivalence between the monomial basis representation (CMlPolynomial) and the Lagrange basis representation (CMlPolynomialEval) of a multilinear polynomial. The forward map is monoToLagrange (zeta transform) and the inverse is lagrangeToMono (inverse zeta transform/Mobius transform).

                                                                                                                                            Equations
                                                                                                                                              Instances For

                                                                                                                                                #eval Tests #

                                                                                                                                                This section contains tests to verify the functionality of multilinear polynomial operations.