Documentation

CompPoly.Fields.Montgomery.Native64x8Field

Fast eight-limb Montgomery fields #

The bounded carrier, conversions, arithmetic, and field instances built on the raw eight-limb Montgomery operations of Montgomery/Native64x8. This is the multi-limb analogue of Montgomery/Native32Field, for prime moduli below 2 ^ 255.

A carrier element stores the Montgomery residue x * 2 ^ 256 mod q as eight 32-bit limbs; toField divides that residue by 2 ^ 256 again and lands in ZMod modulus. All arithmetic is transported along toField, which is a ring isomorphism onto ZMod modulus.

Main results #

Per-field constants #

Per-field data for a fast eight-limb Montgomery field with radix R = 2 ^ 256. All side conditions are concrete numeral facts, discharged by decide at instantiation.

Instances

    Modulus facts #

    theorem Montgomery.Native64x8.Mont64x8Field.modulus_pos {modulus : } [P : Mont64x8Field modulus] :
    0 < modulus
    theorem Montgomery.Native64x8.Mont64x8Field.modulus_lt {modulus : } [P : Mont64x8Field modulus] :
    modulus < 2 ^ 256
    theorem Montgomery.Native64x8.Mont64x8Field.q_toNat {modulus : } [P : Mont64x8Field modulus] :
    (modulusLimbs modulus).toNat = modulus
    theorem Montgomery.Native64x8.Mont64x8Field.two_mul_q_lt {modulus : } [P : Mont64x8Field modulus] :
    2 * (modulusLimbs modulus).toNat < 2 ^ 256
    theorem Montgomery.Native64x8.Mont64x8Field.negInv_mul_q {modulus : } [P : Mont64x8Field modulus] :
    (montgomeryNegInv modulus).toNat * (modulusLimbs modulus).toNat % 2 ^ 32 = 2 ^ 32 - 1
    theorem Montgomery.Native64x8.Mont64x8Field.r_ne_zero {modulus : } [P : Mont64x8Field modulus] :
    ↑(2 ^ 256) 0

    The carrier #

    @[implicit_reducible]

    The fast carrier for a prime modulus: eight 32-bit limbs holding a value below modulus, interpreted as a Montgomery residue. At runtime this erases to Limbs8.

    Instances For
      @[instance_reducible]
      theorem Montgomery.Native64x8.FastField.val_bounded {modulus : } [P : Mont64x8Field modulus] (x : FastField modulus) :
      (↑x).Bounded
      theorem Montgomery.Native64x8.FastField.val_lt {modulus : } [P : Mont64x8Field modulus] (x : FastField modulus) :

      Arithmetic #

      def Montgomery.Native64x8.FastField.zero (modulus : ) [P : Mont64x8Field modulus] :
      FastField modulus

      The zero element.

      Instances For
        def Montgomery.Native64x8.FastField.one (modulus : ) [P : Mont64x8Field modulus] :
        FastField modulus

        The one element, the Montgomery residue 2 ^ 256 mod modulus.

        Instances For
          @[inline]
          def Montgomery.Native64x8.FastField.add {modulus : } [P : Mont64x8Field modulus] (x y : FastField modulus) :
          FastField modulus

          Fast modular addition in Montgomery form.

          Instances For
            @[inline]
            def Montgomery.Native64x8.FastField.sub {modulus : } [P : Mont64x8Field modulus] (x y : FastField modulus) :
            FastField modulus

            Fast modular subtraction in Montgomery form.

            Instances For
              @[inline]
              def Montgomery.Native64x8.FastField.neg {modulus : } [P : Mont64x8Field modulus] (x : FastField modulus) :
              FastField modulus

              Fast modular negation in Montgomery form.

              Instances For
                @[inline]
                def Montgomery.Native64x8.FastField.mul {modulus : } [P : Mont64x8Field modulus] (x y : FastField modulus) :
                FastField modulus

                Fast Montgomery multiplication.

                Instances For
                  @[inline]
                  def Montgomery.Native64x8.FastField.square {modulus : } [P : Mont64x8Field modulus] (x : FastField modulus) :
                  FastField modulus

                  Fast squaring.

                  Instances For
                    @[specialize #[]]
                    def Montgomery.Native64x8.FastField.pow {modulus : } [P : Mont64x8Field modulus] (x : FastField modulus) (n : ) :
                    FastField modulus

                    Exponentiation by repeated squaring.

                    Instances For
                      @[inline]
                      def Montgomery.Native64x8.FastField.inv {modulus : } [P : Mont64x8Field modulus] (x : FastField modulus) :
                      FastField modulus

                      Inversion by Fermat's little theorem, x⁻¹ = x ^ (modulus - 2).

                      Instances For
                        @[inline]
                        def Montgomery.Native64x8.FastField.div {modulus : } [P : Mont64x8Field modulus] (x y : FastField modulus) :
                        FastField modulus

                        Division through inversion.

                        Instances For

                          Conversions #

                          @[inline]
                          def Montgomery.Native64x8.FastField.toLimbs8 {modulus : } [P : Mont64x8Field modulus] (x : FastField modulus) :

                          The canonical limb representative of a fast element: one Montgomery reduction.

                          Instances For
                            @[inline]
                            def Montgomery.Native64x8.FastField.toNat {modulus : } [P : Mont64x8Field modulus] (x : FastField modulus) :

                            The canonical natural representative of a fast element.

                            Instances For
                              @[inline]
                              def Montgomery.Native64x8.FastField.toField {modulus : } [P : Mont64x8Field modulus] (x : FastField modulus) :
                              ZMod modulus

                              The canonical ZMod value of a fast element.

                              Instances For
                                @[inline]
                                def Montgomery.Native64x8.FastField.ofCanonicalNat {modulus : } [P : Mont64x8Field modulus] (n : ) (h : n < modulus) :
                                FastField modulus

                                Build a fast element from a canonical natural representative.

                                Instances For
                                  @[inline]
                                  def Montgomery.Native64x8.FastField.ofNat (modulus : ) [P : Mont64x8Field modulus] (n : ) :
                                  FastField modulus

                                  Convert a natural number into fast Montgomery form.

                                  Instances For
                                    @[inline]
                                    def Montgomery.Native64x8.FastField.ofField {modulus : } [P : Mont64x8Field modulus] (x : ZMod modulus) :
                                    FastField modulus

                                    Convert from the canonical field into fast Montgomery form.

                                    Instances For
                                      @[inline]
                                      def Montgomery.Native64x8.FastField.ofInt (modulus : ) [P : Mont64x8Field modulus] (n : ) :
                                      FastField modulus

                                      Convert an integer into fast Montgomery form.

                                      Instances For
                                        @[instance_reducible]
                                        instance Montgomery.Native64x8.FastField.instZero {modulus : } [P : Mont64x8Field modulus] :
                                        Zero (FastField modulus)
                                        @[instance_reducible]
                                        instance Montgomery.Native64x8.FastField.instOne {modulus : } [P : Mont64x8Field modulus] :
                                        One (FastField modulus)
                                        @[instance_reducible]
                                        instance Montgomery.Native64x8.FastField.instAdd {modulus : } [P : Mont64x8Field modulus] :
                                        Add (FastField modulus)
                                        @[instance_reducible]
                                        instance Montgomery.Native64x8.FastField.instNeg {modulus : } [P : Mont64x8Field modulus] :
                                        Neg (FastField modulus)
                                        @[instance_reducible]
                                        instance Montgomery.Native64x8.FastField.instSub {modulus : } [P : Mont64x8Field modulus] :
                                        Sub (FastField modulus)
                                        @[instance_reducible]
                                        instance Montgomery.Native64x8.FastField.instMul {modulus : } [P : Mont64x8Field modulus] :
                                        Mul (FastField modulus)
                                        @[instance_reducible]
                                        instance Montgomery.Native64x8.FastField.instInv {modulus : } [P : Mont64x8Field modulus] :
                                        Inv (FastField modulus)
                                        @[instance_reducible]
                                        instance Montgomery.Native64x8.FastField.instDiv {modulus : } [P : Mont64x8Field modulus] :
                                        Div (FastField modulus)
                                        @[instance_reducible]
                                        instance Montgomery.Native64x8.FastField.instNatCast {modulus : } [P : Mont64x8Field modulus] :
                                        NatCast (FastField modulus)
                                        @[instance_reducible]
                                        instance Montgomery.Native64x8.FastField.instIntCast {modulus : } [P : Mont64x8Field modulus] :
                                        IntCast (FastField modulus)
                                        @[instance_reducible]
                                        instance Montgomery.Native64x8.FastField.instPowNat {modulus : } [P : Mont64x8Field modulus] :
                                        Pow (FastField modulus)
                                        @[instance_reducible]
                                        instance Montgomery.Native64x8.FastField.instSMulNat {modulus : } [P : Mont64x8Field modulus] :
                                        SMul (FastField modulus)
                                        @[instance_reducible]
                                        instance Montgomery.Native64x8.FastField.instSMulInt {modulus : } [P : Mont64x8Field modulus] :
                                        SMul (FastField modulus)
                                        @[instance_reducible]
                                        instance Montgomery.Native64x8.FastField.instPowInt {modulus : } [P : Mont64x8Field modulus] :
                                        Pow (FastField modulus)
                                        theorem Montgomery.Native64x8.FastField.zero_def {modulus : } [P : Mont64x8Field modulus] :
                                        0 = zero modulus
                                        theorem Montgomery.Native64x8.FastField.one_def {modulus : } [P : Mont64x8Field modulus] :
                                        1 = one modulus
                                        theorem Montgomery.Native64x8.FastField.add_def {modulus : } [P : Mont64x8Field modulus] (x y : FastField modulus) :
                                        x + y = x.add y
                                        theorem Montgomery.Native64x8.FastField.neg_def {modulus : } [P : Mont64x8Field modulus] (x : FastField modulus) :
                                        -x = x.neg
                                        theorem Montgomery.Native64x8.FastField.sub_def {modulus : } [P : Mont64x8Field modulus] (x y : FastField modulus) :
                                        x - y = x.sub y
                                        theorem Montgomery.Native64x8.FastField.mul_def {modulus : } [P : Mont64x8Field modulus] (x y : FastField modulus) :
                                        x * y = x.mul y
                                        theorem Montgomery.Native64x8.FastField.inv_def {modulus : } [P : Mont64x8Field modulus] (x : FastField modulus) :
                                        theorem Montgomery.Native64x8.FastField.div_def {modulus : } [P : Mont64x8Field modulus] (x y : FastField modulus) :
                                        x / y = x * y⁻¹
                                        theorem Montgomery.Native64x8.FastField.square_def {modulus : } [P : Mont64x8Field modulus] (x : FastField modulus) :
                                        x.square = x * x

                                        Correctness #

                                        @[instance_reducible]
                                        @[instance_reducible]
                                        instance Montgomery.Native64x8.FastField.instRatCast {modulus : } [P : Mont64x8Field modulus] :
                                        RatCast (FastField modulus)
                                        @[instance_reducible]
                                        @[instance_reducible]
                                        instance Montgomery.Native64x8.FastField.instSMulRat {modulus : } [P : Mont64x8Field modulus] :
                                        SMul (FastField modulus)
                                        theorem Montgomery.Native64x8.FastField.toNat_lt {modulus : } [P : Mont64x8Field modulus] (x : FastField modulus) :
                                        x.toNat < modulus
                                        @[simp]
                                        theorem Montgomery.Native64x8.FastField.toField_ofCanonicalNat {modulus : } [P : Mont64x8Field modulus] {n : } (h : n < modulus) :
                                        @[simp]
                                        theorem Montgomery.Native64x8.FastField.toNat_ofCanonicalNat {modulus : } [P : Mont64x8Field modulus] {n : } (h : n < modulus) :
                                        @[simp]
                                        theorem Montgomery.Native64x8.FastField.toField_ofField {modulus : } [P : Mont64x8Field modulus] (x : ZMod modulus) :

                                        Converting from the canonical field to fast form and back is the identity.

                                        @[simp]
                                        theorem Montgomery.Native64x8.FastField.ofField_toField {modulus : } [P : Mont64x8Field modulus] (x : FastField modulus) :

                                        Converting from fast form to the canonical field and back is the identity.

                                        The canonical-field interpretation distinguishes fast values.

                                        Field operations #

                                        @[simp]
                                        @[simp]
                                        @[simp]
                                        theorem Montgomery.Native64x8.FastField.toField_add {modulus : } [P : Mont64x8Field modulus] (x y : FastField modulus) :
                                        @[simp]
                                        theorem Montgomery.Native64x8.FastField.toField_sub {modulus : } [P : Mont64x8Field modulus] (x y : FastField modulus) :
                                        @[simp]
                                        theorem Montgomery.Native64x8.FastField.toField_neg {modulus : } [P : Mont64x8Field modulus] (x : FastField modulus) :
                                        @[simp]
                                        theorem Montgomery.Native64x8.FastField.toField_mul {modulus : } [P : Mont64x8Field modulus] (x y : FastField modulus) :
                                        @[simp]
                                        @[simp]
                                        theorem Montgomery.Native64x8.FastField.toField_pow {modulus : } [P : Mont64x8Field modulus] (x : FastField modulus) (n : ) :
                                        (x.pow n).toField = x.toField ^ n
                                        @[simp]
                                        @[simp]
                                        theorem Montgomery.Native64x8.FastField.toField_div {modulus : } [P : Mont64x8Field modulus] (x y : FastField modulus) :
                                        @[simp]
                                        theorem Montgomery.Native64x8.FastField.toField_natCast {modulus : } [P : Mont64x8Field modulus] (n : ) :
                                        (↑n).toField = n
                                        @[simp]
                                        theorem Montgomery.Native64x8.FastField.toField_intCast {modulus : } [P : Mont64x8Field modulus] (n : ) :
                                        (↑n).toField = n
                                        @[simp]
                                        theorem Montgomery.Native64x8.FastField.toField_nsmul {modulus : } [P : Mont64x8Field modulus] (n : ) (x : FastField modulus) :
                                        (n x).toField = n x.toField
                                        @[simp]
                                        theorem Montgomery.Native64x8.FastField.toField_zsmul {modulus : } [P : Mont64x8Field modulus] (n : ) (x : FastField modulus) :
                                        (n x).toField = n x.toField
                                        @[simp]
                                        theorem Montgomery.Native64x8.FastField.toField_npow {modulus : } [P : Mont64x8Field modulus] (x : FastField modulus) (n : ) :
                                        (x ^ n).toField = x.toField ^ n
                                        @[simp]
                                        theorem Montgomery.Native64x8.FastField.toField_zpow {modulus : } [P : Mont64x8Field modulus] (x : FastField modulus) (n : ) :
                                        (x ^ n).toField = x.toField ^ n
                                        @[simp]
                                        theorem Montgomery.Native64x8.FastField.toField_nnratCast {modulus : } [P : Mont64x8Field modulus] (q : ℚ≥0) :
                                        (↑q).toField = q
                                        @[simp]
                                        theorem Montgomery.Native64x8.FastField.toField_ratCast {modulus : } [P : Mont64x8Field modulus] (q : ) :
                                        (↑q).toField = q
                                        @[simp]
                                        theorem Montgomery.Native64x8.FastField.toField_nnqsmul {modulus : } [P : Mont64x8Field modulus] (q : ℚ≥0) (x : FastField modulus) :
                                        (q x).toField = q x.toField
                                        @[simp]
                                        theorem Montgomery.Native64x8.FastField.toField_qsmul {modulus : } [P : Mont64x8Field modulus] (q : ) (x : FastField modulus) :
                                        (q x).toField = q x.toField

                                        Algebraic structure #

                                        def Montgomery.Native64x8.FastField.ringEquiv (modulus : ) [P : Mont64x8Field modulus] :
                                        FastField modulus ≃+* ZMod modulus

                                        Ring equivalence between the fast Montgomery representation and the canonical field.

                                        Instances For
                                          @[simp]
                                          theorem Montgomery.Native64x8.FastField.ringEquiv_apply {modulus : } [P : Mont64x8Field modulus] {x : FastField modulus} :
                                          (ringEquiv modulus) x = x.toField
                                          @[simp]
                                          theorem Montgomery.Native64x8.FastField.ringEquiv_symm_apply {modulus : } [P : Mont64x8Field modulus] {x : ZMod modulus} :
                                          (ringEquiv modulus).symm x = ofField x
                                          @[instance_reducible]
                                          instance Montgomery.Native64x8.FastField.instField {modulus : } [P : Mont64x8Field modulus] :
                                          Field (FastField modulus)

                                          Field instance transferred from the canonical field through toField.

                                          @[instance_reducible]

                                          A fast eight-limb field is non-binary.