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]));