arnaucube
arnaucube/ark-curves-cherry-pickedPublic Self-hosted repository
ark-curves-cherry-picked/bls12_377/src/fields/fq.rs
bls12_377/src/fields/fq.rsRaw
  1use ark_ff::{biginteger::BigInteger384 as BigInteger, field_new, fields::*};
  2
  3pub type Fq = Fp384<FqParameters>;
  4
  5pub struct FqParameters;
  6
  7impl Fp384Parameters for FqParameters {}
  8impl FftParameters for FqParameters {
  9    type BigInt = BigInteger;
 10
 11    const TWO_ADICITY: u32 = 46u32;
 12
 13    #[rustfmt::skip]
 14    const TWO_ADIC_ROOT_OF_UNITY: BigInteger = BigInteger([
 15        2022196864061697551u64,
 16        17419102863309525423u64,
 17        8564289679875062096u64,
 18        17152078065055548215u64,
 19        17966377291017729567u64,
 20        68610905582439508u64,
 21    ]);
 22}
 23impl FpParameters for FqParameters {
 24    /// MODULUS = 258664426012969094010652733694893533536393512754914660539884262666720468348340822774968888139573360124440321458177
 25    #[rustfmt::skip]
 26    const MODULUS: BigInteger = BigInteger([
 27        0x8508c00000000001,
 28        0x170b5d4430000000,
 29        0x1ef3622fba094800,
 30        0x1a22d9f300f5138f,
 31        0xc63b05c06ca1493b,
 32        0x1ae3a4617c510ea,
 33    ]);
 34
 35    const MODULUS_BITS: u32 = 377;
 36
 37    const CAPACITY: u32 = Self::MODULUS_BITS - 1;
 38
 39    const REPR_SHAVE_BITS: u32 = 7;
 40
 41    #[rustfmt::skip]
 42    const R: BigInteger = BigInteger([
 43        202099033278250856u64,
 44        5854854902718660529u64,
 45        11492539364873682930u64,
 46        8885205928937022213u64,
 47        5545221690922665192u64,
 48        39800542322357402u64,
 49    ]);
 50
 51    #[rustfmt::skip]
 52    const R2: BigInteger = BigInteger([
 53        0xb786686c9400cd22,
 54        0x329fcaab00431b1,
 55        0x22a5f11162d6b46d,
 56        0xbfdf7d03827dc3ac,
 57        0x837e92f041790bf9,
 58        0x6dfccb1e914b88,
 59    ]);
 60
 61    const INV: u64 = 9586122913090633727u64;
 62
 63    // GENERATOR = -5
 64    #[rustfmt::skip]
 65    const GENERATOR: BigInteger = BigInteger([
 66        0xfc0b8000000002fa,
 67        0x97d39cf6e000018b,
 68        0x2072420fbfa05044,
 69        0xcbbcbd50d97c3802,
 70        0xbaf1ec35813f9eb,
 71        0x9974a2c0945ad2,
 72    ]);
 73
 74    #[rustfmt::skip]
 75    const MODULUS_MINUS_ONE_DIV_TWO: BigInteger = BigInteger([
 76        0x4284600000000000,
 77        0xb85aea218000000,
 78        0x8f79b117dd04a400,
 79        0x8d116cf9807a89c7,
 80        0x631d82e03650a49d,
 81        0xd71d230be28875,
 82    ]);
 83
 84    // T and T_MINUS_ONE_DIV_TWO, where MODULUS - 1 = 2^S * T
 85
 86    // T = (MODULUS - 1) // 2^S =
 87    // 3675842578061421676390135839012792950148785745837396071634149488243117337281387659330802195819009059
 88    #[rustfmt::skip]
 89    const T: BigInteger = BigInteger([
 90        0x7510c00000021423,
 91        0x88bee82520005c2d,
 92        0x67cc03d44e3c7bcd,
 93        0x1701b28524ec688b,
 94        0xe9185f1443ab18ec,
 95        0x6b8,
 96    ]);
 97
 98    // (T - 1) // 2 =
 99    // 1837921289030710838195067919506396475074392872918698035817074744121558668640693829665401097909504529
100    #[rustfmt::skip]
101    const T_MINUS_ONE_DIV_TWO: BigInteger = BigInteger([
102        0xba88600000010a11,
103        0xc45f741290002e16,
104        0xb3e601ea271e3de6,
105        0xb80d94292763445,
106        0x748c2f8a21d58c76,
107        0x35c,
108    ]);
109}
110
111#[allow(dead_code)]
112pub const FQ_ONE: Fq = field_new!(Fq, FqParameters::R);
113#[allow(dead_code)]
114pub const FQ_ZERO: Fq = field_new!(Fq, BigInteger([0, 0, 0, 0, 0, 0]));