Documentation

CompPoly.Fields.Montgomery.Native32Field

Fast 32-bit Montgomery Fields #

The bounded carrier, conversions, arithmetic, and field instances built on Native32 reduction.

Per-field data for a fast 32-bit Montgomery field.

  • prime : Nat.Prime modulus

    modulus is prime.

  • modulus32 : UInt32

    modulus as a 32-bit word.

  • modulus64 : UInt64

    modulus as a 64-bit word.

  • rModModulus : UInt32

    2^32 mod modulus, the Montgomery representation of one.

  • r2ModModulus : UInt64

    (2^32)^2 mod modulus, used to enter Montgomery form.

  • montgomeryNegInv : UInt32

    -modulus⁻¹ mod 2^32, used by Montgomery reduction.

  • modulus32_toNat : (modulus32 modulus).toNat = modulus
  • modulus64_toNat : (modulus64 modulus).toNat = modulus
  • two_lt_modulus : 2 < modulus
  • modulus_lt_two_pow_31 : modulus < 2 ^ 31
  • rModModulus_toNat : (rModModulus modulus).toNat = 2 ^ 32 % modulus
  • r2ModModulus_toNat : (r2ModModulus modulus).toNat = (2 ^ 32) ^ 2 % modulus
  • montgomeryNegInv_mul_modulus_mod_two_pow_32 : (montgomeryNegInv modulus).toNat * modulus % 2 ^ 32 = 2 ^ 32 - 1
Instances
    @[implicit_reducible]

    The fast carrier for a prime modulus: a native word below modulus, interpreted as a Montgomery residue. At runtime this erases to UInt32.

    Instances For
      @[instance_reducible]
      @[simp]
      theorem Montgomery.Native32.Mont32Field.modulus_pos {modulus : } [P : Mont32Field modulus] :
      0 < modulus
      @[simp]
      theorem Montgomery.Native32.Mont32Field.modulus32_pos {modulus : } [P : Mont32Field modulus] :
      0 < (modulus32 modulus).toNat
      @[simp]
      theorem Montgomery.Native32.Mont32Field.modulus64_pos {modulus : } [P : Mont32Field modulus] :
      0 < (modulus64 modulus).toNat
      @[simp]
      @[simp]
      @[simp]
      theorem Montgomery.Native32.Mont32Field.modulus_lt_two_pow_32 {modulus : } [P : Mont32Field modulus] :
      modulus < 2 ^ 32
      theorem Montgomery.Native32.Mont32Field.modulus_sq_lt_two_pow_64 {modulus : } [P : Mont32Field modulus] :
      modulus ^ 2 < 2 ^ 64
      theorem Montgomery.Native32.Mont32Field.two_pow_32_ne_zero {modulus : } [P : Mont32Field modulus] :
      ↑(2 ^ 32) 0
      theorem Montgomery.Native32.Mont32Field.r2ModModulus_lt_modulus {modulus : } [P : Mont32Field modulus] :
      (2 ^ 32) ^ 2 % modulus < modulus
      instance Montgomery.Native32.instNeZeroNat_compPoly {modulus : } [P : Mont32Field modulus] :
      NeZero modulus

      Implementation #

      @[inline]
      def Montgomery.Native32.reduce {modulus : } [P : Mont32Field modulus] (x : UInt64) (h : x.toNat < modulus * 2 ^ 32) :
      FastField modulus

      Montgomery reduction for inputs known to be below p * 2^32.

      Instances For

        Conversions #

        @[inline]
        def Montgomery.Native32.FastField.ofCanonicalNat {modulus : } [P : Mont32Field modulus] (n : ) (h : n < modulus) :
        FastField modulus

        Build a fast element from a canonical natural representative.

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

          Convert a natural number into fast Montgomery representation.

          Instances For
            @[inline]
            def Montgomery.Native32.FastField.ofUInt32 (modulus : ) [P : Mont32Field modulus] (x : UInt32) :
            FastField modulus

            Convert a 32-bit word into fast Montgomery representation.

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

              Convert from the canonical ZMod field into fast Montgomery form.

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

                Convert an integer into fast Montgomery representation.

                Instances For
                  @[inline]
                  def Montgomery.Native32.FastField.toUInt32 {modulus : } [P : Mont32Field modulus] (x : FastField modulus) :

                  Convert a fast element to its canonical native-word representative.

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

                    Convert a fast element to its canonical natural representative.

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

                      Convert a fast element to the canonical ZMod field.

                      Instances For

                        Field operations #

                        def Montgomery.Native32.zero (modulus : ) [P : Mont32Field modulus] :
                        FastField modulus

                        The zero fast element.

                        Instances For
                          def Montgomery.Native32.one (modulus : ) [P : Mont32Field modulus] :
                          FastField modulus

                          The one fast element.

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

                            Fast modular addition in Montgomery form.

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

                              Fast modular negation in Montgomery form.

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

                                Fast modular subtraction in Montgomery form.

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

                                  Fast modular multiplication in Montgomery form.

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

                                    Fast squaring.

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

                                      Exponentiation over the fast representation using repeated squaring.

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

                                        Inversion in Montgomery form via Fermat's little theorem (x⁻¹ = x^(p-2)), by binary exponentiation (pow).

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

                                          Division through inversion and fast multiplication.

                                          Instances For
                                            @[instance_reducible]
                                            instance Montgomery.Native32.instZeroFastField {modulus : } [P : Mont32Field modulus] :
                                            Zero (FastField modulus)
                                            @[instance_reducible]
                                            instance Montgomery.Native32.instOneFastField {modulus : } [P : Mont32Field modulus] :
                                            One (FastField modulus)
                                            @[instance_reducible]
                                            instance Montgomery.Native32.instAddFastField {modulus : } [P : Mont32Field modulus] :
                                            Add (FastField modulus)
                                            @[instance_reducible]
                                            instance Montgomery.Native32.instNegFastField {modulus : } [P : Mont32Field modulus] :
                                            Neg (FastField modulus)
                                            @[instance_reducible]
                                            instance Montgomery.Native32.instSubFastField {modulus : } [P : Mont32Field modulus] :
                                            Sub (FastField modulus)
                                            @[instance_reducible]
                                            instance Montgomery.Native32.instMulFastField {modulus : } [P : Mont32Field modulus] :
                                            Mul (FastField modulus)
                                            @[instance_reducible]
                                            instance Montgomery.Native32.instInvFastField {modulus : } [P : Mont32Field modulus] :
                                            Inv (FastField modulus)
                                            @[instance_reducible]
                                            instance Montgomery.Native32.instDivFastField {modulus : } [P : Mont32Field modulus] :
                                            Div (FastField modulus)
                                            theorem Montgomery.Native32.zero_def {modulus : } [P : Mont32Field modulus] :
                                            0 = zero modulus
                                            theorem Montgomery.Native32.one_def {modulus : } [P : Mont32Field modulus] :
                                            1 = one modulus
                                            theorem Montgomery.Native32.add_def {modulus : } [P : Mont32Field modulus] (x y : FastField modulus) :
                                            x + y = add x y
                                            theorem Montgomery.Native32.neg_def {modulus : } [P : Mont32Field modulus] (x : FastField modulus) :
                                            -x = neg x
                                            theorem Montgomery.Native32.sub_def {modulus : } [P : Mont32Field modulus] (x y : FastField modulus) :
                                            x - y = sub x y
                                            theorem Montgomery.Native32.mul_def {modulus : } [P : Mont32Field modulus] (x y : FastField modulus) :
                                            x * y = mul x y
                                            theorem Montgomery.Native32.inv_def {modulus : } [P : Mont32Field modulus] (x : FastField modulus) :
                                            theorem Montgomery.Native32.div_def {modulus : } [P : Mont32Field modulus] (x y : FastField modulus) :
                                            x / y = x * y⁻¹
                                            theorem Montgomery.Native32.square_def {modulus : } [P : Mont32Field modulus] (x : FastField modulus) :
                                            square x = x * x
                                            @[instance_reducible]
                                            instance Montgomery.Native32.instNatCastFastField {modulus : } [P : Mont32Field modulus] :
                                            NatCast (FastField modulus)
                                            @[instance_reducible]
                                            instance Montgomery.Native32.instIntCastFastField {modulus : } [P : Mont32Field modulus] :
                                            IntCast (FastField modulus)
                                            @[instance_reducible]
                                            instance Montgomery.Native32.instSMulNatFastField {modulus : } [P : Mont32Field modulus] :
                                            SMul (FastField modulus)
                                            @[instance_reducible]
                                            instance Montgomery.Native32.instSMulIntFastField {modulus : } [P : Mont32Field modulus] :
                                            SMul (FastField modulus)
                                            @[instance_reducible]
                                            instance Montgomery.Native32.instPowFastFieldNat {modulus : } [P : Mont32Field modulus] :
                                            Pow (FastField modulus)
                                            @[instance_reducible]
                                            instance Montgomery.Native32.instPowFastFieldInt {modulus : } [P : Mont32Field modulus] :
                                            Pow (FastField modulus)
                                            @[instance_reducible]
                                            instance Montgomery.Native32.instNNRatCastFastField {modulus : } [P : Mont32Field modulus] :
                                            @[instance_reducible]
                                            instance Montgomery.Native32.instRatCastFastField {modulus : } [P : Mont32Field modulus] :
                                            RatCast (FastField modulus)
                                            @[instance_reducible]
                                            instance Montgomery.Native32.instSMulNNRatFastField {modulus : } [P : Mont32Field modulus] :
                                            @[instance_reducible]
                                            instance Montgomery.Native32.instSMulRatFastField {modulus : } [P : Mont32Field modulus] :
                                            SMul (FastField modulus)

                                            Correctness #

                                            Reduction and conversions #

                                            @[simp]
                                            theorem Montgomery.Native32.FastField.val_toNat_lt {modulus : } [P : Mont32Field modulus] (x : FastField modulus) :
                                            (↑x).toNat < modulus
                                            theorem Montgomery.Native32.toNat_lt_modulus {modulus : } [P : Mont32Field modulus] {x : FastField modulus} :
                                            x.toNat < modulus
                                            @[simp]
                                            theorem Montgomery.Native32.toField_ofCanonicalNat {modulus : } [P : Mont32Field modulus] {n : } (h : n < modulus) :
                                            @[simp]
                                            theorem Montgomery.Native32.toNat_ofCanonicalNat {modulus : } [P : Mont32Field modulus] {n : } (h : n < modulus) :
                                            @[simp]
                                            theorem Montgomery.Native32.toField_ofField {modulus : } [P : Mont32Field modulus] (x : ZMod modulus) :

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

                                            @[simp]
                                            theorem Montgomery.Native32.ofField_toField {modulus : } [P : Mont32Field 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]
                                            theorem Montgomery.Native32.toField_zero {modulus : } [P : Mont32Field modulus] :

                                            toField maps fast zero to canonical zero.

                                            @[simp]
                                            theorem Montgomery.Native32.toField_one {modulus : } [P : Mont32Field modulus] :

                                            toField maps fast one to canonical one.

                                            @[simp]
                                            theorem Montgomery.Native32.toField_add {modulus : } [P : Mont32Field modulus] (x y : FastField modulus) :

                                            Fast addition agrees with addition in the canonical field.

                                            @[simp]
                                            theorem Montgomery.Native32.toField_sub {modulus : } [P : Mont32Field modulus] (x y : FastField modulus) :

                                            Fast subtraction agrees with subtraction in the canonical field.

                                            @[simp]
                                            theorem Montgomery.Native32.toField_neg {modulus : } [P : Mont32Field modulus] (x : FastField modulus) :

                                            Fast negation agrees with negation in the canonical field.

                                            @[simp]
                                            theorem Montgomery.Native32.toField_mul {modulus : } [P : Mont32Field modulus] (x y : FastField modulus) :
                                            @[simp]
                                            theorem Montgomery.Native32.toField_square {modulus : } [P : Mont32Field modulus] (x : FastField modulus) :

                                            Fast squaring agrees with multiplication by itself in the canonical field.

                                            @[simp]
                                            theorem Montgomery.Native32.toField_pow {modulus : } [P : Mont32Field modulus] (x : FastField modulus) (n : ) :
                                            (pow x n).toField = x.toField ^ n

                                            Fast natural-power computation agrees with powers in the canonical field.

                                            @[simp]
                                            theorem Montgomery.Native32.toField_inv {modulus : } [P : Mont32Field modulus] (x : FastField modulus) :

                                            Fast inversion agrees with inversion in the canonical field.

                                            @[simp]
                                            theorem Montgomery.Native32.toField_div {modulus : } [P : Mont32Field modulus] (x y : FastField modulus) :

                                            Fast division agrees with division in the canonical field.

                                            @[simp]
                                            theorem Montgomery.Native32.toField_natCast {modulus : } [P : Mont32Field modulus] (n : ) :
                                            (↑n).toField = n

                                            Natural casts into fast form agree with natural casts into the canonical field.

                                            @[simp]
                                            theorem Montgomery.Native32.toField_intCast {modulus : } [P : Mont32Field modulus] (n : ) :
                                            (↑n).toField = n

                                            Integer casts into fast form agree with integer casts into the canonical field.

                                            @[simp]
                                            theorem Montgomery.Native32.toField_nsmul {modulus : } [P : Mont32Field modulus] (n : ) (x : FastField modulus) :
                                            (n x).toField = n x.toField

                                            Natural scalar multiplication is preserved by toField.

                                            @[simp]
                                            theorem Montgomery.Native32.toField_zsmul {modulus : } [P : Mont32Field modulus] (n : ) (x : FastField modulus) :
                                            (n x).toField = n x.toField

                                            Integer scalar multiplication is preserved by toField.

                                            @[simp]
                                            theorem Montgomery.Native32.toField_npow {modulus : } [P : Mont32Field modulus] (x : FastField modulus) (n : ) :
                                            (x ^ n).toField = x.toField ^ n

                                            Natural powers through the Pow instance are preserved by toField.

                                            @[simp]
                                            theorem Montgomery.Native32.toField_zpow {modulus : } [P : Mont32Field modulus] (x : FastField modulus) (n : ) :
                                            (x ^ n).toField = x.toField ^ n

                                            Integer powers through the Pow instance are preserved by toField.

                                            @[simp]
                                            theorem Montgomery.Native32.toField_nnratCast {modulus : } [P : Mont32Field modulus] (q : ℚ≥0) :
                                            (↑q).toField = q

                                            Nonnegative rational casts into fast form agree with canonical-field casts.

                                            @[simp]
                                            theorem Montgomery.Native32.toField_ratCast {modulus : } [P : Mont32Field modulus] (q : ) :
                                            (↑q).toField = q

                                            Rational casts into fast form agree with canonical-field casts.

                                            @[simp]
                                            theorem Montgomery.Native32.toField_nnqsmul {modulus : } [P : Mont32Field modulus] (q : ℚ≥0) (x : FastField modulus) :
                                            (q x).toField = q x.toField

                                            Nonnegative rational scalar multiplication is preserved by toField.

                                            @[simp]
                                            theorem Montgomery.Native32.toField_qsmul {modulus : } [P : Mont32Field modulus] (q : ) (x : FastField modulus) :
                                            (q x).toField = q x.toField

                                            Rational scalar multiplication is preserved by toField.

                                            Algebraic structure #

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

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

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

                                              Field instance transferred from the canonical field through toField.

                                              @[instance_reducible]
                                              instance Montgomery.Native32.instNonBinaryField {modulus : } [P : Mont32Field modulus] :

                                              A fast 32-bit-word field is non-binary.