Documentation

CompPoly.Univariate.Raw.Ops

Raw Univariate Polynomial Operations #

Operations and evaluation lemmas for raw computable univariate polynomials.

def CompPoly.CPolynomial.Raw.eval₂ {R : Type u_1} {S : Type u_3} [Semiring R] [Semiring S] (f : R →+* S) (x : S) (p : Raw R) :
S

Evaluates a CPolynomial.Raw at x : S using a ring homomorphism f : R →+* S.

Computes f(a₀) + f(a₁) * x + f(a₂) * x² + ... where aᵢ are the coefficients.

TODO: define an efficient version of this with caching

Instances For
    @[inline, specialize #[]]
    def CompPoly.CPolynomial.Raw.eval {R : Type u_1} [Semiring R] (x : R) (p : Raw R) :
    R

    Evaluates a CPolynomial.Raw at a given value

    Instances For
      @[inline, specialize #[]]
      def CompPoly.CPolynomial.Raw.addRaw {R : Type u_1} [Zero R] [Add R] (p q : Raw R) :
      Raw R

      Raw addition: pointwise sum of coefficient arrays (padded to equal length).

      The result may have trailing zeros and should be trimmed for canonical form.

      Instances For
        @[inline, specialize #[]]
        def CompPoly.CPolynomial.Raw.add {R : Type u_1} [Zero R] [Add R] [BEq R] (p q : Raw R) :
        Raw R

        Addition of two CPolynomial.Raws, with result trimmed.

        Instances For
          @[inline, specialize #[]]
          def CompPoly.CPolynomial.Raw.smul {R : Type u_1} [Mul R] (r : R) (p : Raw R) :
          Raw R

          Scalar multiplication: multiplies each coefficient by r.

          Instances For
            @[inline, specialize #[]]
            def CompPoly.CPolynomial.Raw.nsmulRaw {R : Type u_1} [Semiring R] (n : ) (p : Raw R) :
            Raw R

            Raw scalar multiplication by a natural number (may have trailing zeros).

            Instances For
              @[inline, specialize #[]]
              def CompPoly.CPolynomial.Raw.nsmul {R : Type u_1} [Semiring R] [BEq R] (n : ) (p : Raw R) :
              Raw R

              Scalar multiplication of CPolynomial.Raw by a natural number, with result trimmed.

              Instances For
                @[inline, specialize #[]]
                def CompPoly.CPolynomial.Raw.mulPowX {R : Type u_1} [Zero R] (i : ) (p : Raw R) :
                Raw R

                Multiplication by X^i: shifts coefficients right by i positions (prepends i zeros).

                Instances For
                  @[inline, specialize #[]]
                  def CompPoly.CPolynomial.Raw.mulX {R : Type u_1} [Zero R] (p : Raw R) :
                  Raw R

                  Multiplication of a CPolynomial.Raw by X, reduces to mulPowX 1.

                  Instances For
                    @[inline, specialize #[]]
                    def CompPoly.CPolynomial.Raw.mul {R : Type u_1} [Semiring R] [BEq R] (p q : Raw R) :
                    Raw R

                    Multiplication using the naive O(n²) algorithm: Σᵢ (aᵢ * q) * X^i.

                    Instances For
                      @[inline, specialize #[]]
                      def CompPoly.CPolynomial.Raw.pow {R : Type u_1} [Semiring R] [BEq R] (p : Raw R) (n : ) :
                      Raw R

                      Exponentiation of a CPolynomial.Raw by a natural number n via repeated multiplication. This is the specification; powBySq is the efficient O(log n) implementation.

                      Instances For
                        @[irreducible, inline, specialize #[]]
                        def CompPoly.CPolynomial.Raw.powBySq {R : Type u_1} [Semiring R] [BEq R] (p : Raw R) :
                        Raw R

                        Exponentiation via repeated squaring: $ O(\log n) $ multiplications instead of $ O(n) $.

                        For $ n > 0 $, computes $ p ^ n $ by recursing on $ n / 2 $:

                        • If $ n $ is even: $ (p ^ {n/2})^2 $
                        • If $ n $ is odd: $ p \cdot (p ^ {n/2})^2 $
                        Instances For
                          @[implicit_reducible]
                          @[implicit_reducible]
                          instance CompPoly.CPolynomial.Raw.instOne {R : Type u_1} [One R] :
                          One (Raw R)
                          @[implicit_reducible]
                          instance CompPoly.CPolynomial.Raw.instAddOfZeroOfBEq {R : Type u_1} [Zero R] [Add R] [BEq R] :
                          Add (Raw R)
                          @[implicit_reducible]
                          @[implicit_reducible]
                          @[implicit_reducible]
                          @[implicit_reducible]
                          @[implicit_reducible]

                          Upper bound on degree: size - 1 if non-empty, if empty.

                          Instances For

                            Convert degreeBound to a natural number by sending to 0.

                            Instances For
                              def CompPoly.CPolynomial.Raw.monic {R : Type u_1} [Zero R] [One R] [BEq R] (p : Raw R) :

                              Check if a CPolynomial.Raw is monic, i.e. its leading coefficient is 1.

                              Instances For
                                def CompPoly.CPolynomial.Raw.divX {R : Type u_1} (p : Raw R) :
                                Raw R

                                Pseudo-division by X: removes the constant term and shifts remaining coefficients left.

                                Instances For
                                  @[inline, specialize #[]]
                                  def CompPoly.CPolynomial.Raw.neg {R : Type u_1} [Neg R] (p : Raw R) :
                                  Raw R

                                  Negation of a CPolynomial.Raw.

                                  Instances For
                                    @[inline, specialize #[]]
                                    def CompPoly.CPolynomial.Raw.sub {R : Type u_1} [Zero R] [Add R] [Neg R] [BEq R] (p q : Raw R) :
                                    Raw R

                                    Subtraction of two CPolynomial.Raws.

                                    Instances For
                                      @[implicit_reducible]
                                      instance CompPoly.CPolynomial.Raw.instNeg {R : Type u_1} [Neg R] :
                                      Neg (Raw R)
                                      @[implicit_reducible]
                                      @[implicit_reducible]
                                      def CompPoly.CPolynomial.Raw.erase {R : Type u_1} [Zero R] [Add R] [Neg R] [BEq R] [DecidableEq R] (n : ) (p : Raw R) :
                                      Raw R

                                      Erase the coefficient at index n: same as p except coeff n = 0, then trimmed.

                                      Instances For