ark-curves-cherry-picked/mnt4_753/src/fields/fr.rs
mnt4_753/src/fields/fr.rsRaw
1use ark_ff::{
2 biginteger::{BigInt, BigInteger768 as BigInteger},
3 fields::{FftParameters, Fp768, Fp768Parameters, FpParameters},
4};
5
6pub type Fr = Fp768<FrParameters>;
7
8pub struct FrParameters;
9
10impl Fp768Parameters for FrParameters {}
11impl FftParameters for FrParameters {
12 type BigInt = BigInteger;
13
14 const TWO_ADICITY: u32 = 30;
15
16 const TWO_ADIC_ROOT_OF_UNITY: BigInteger = BigInt::new([
17 0x307f66b297671883,
18 0xd72a7f2b1e645f4e,
19 0x67079daa9a902283,
20 0xf33f7620a86c668b,
21 0x8878570d66464c12,
22 0xa557af5b524f522b,
23 0x5fafa3f6ef19319d,
24 0x1eb9e04110a65629,
25 0x3f96feb3c639a0b0,
26 0x4d4fe37df3ffd732,
27 0xadc831bd55bcf3e9,
28 0x1b9f32a8bd6ab,
29 ]);
30}
31impl FpParameters for FrParameters {
32 /// MODULUS = 41898490967918953402344214791240637128170709919953949071783502921025352812571106773058893763790338921418070971888458477323173057491593855069696241854796396165721416325350064441470418137846398469611935719059908164220784476160001
33 const MODULUS: BigInteger = BigInt::new([
34 0xd90776e240000001,
35 0x4ea099170fa13a4f,
36 0xd6c381bc3f005797,
37 0xb9dff97634993aa4,
38 0x3eebca9429212636,
39 0xb26c5c28c859a99b,
40 0x99d124d9a15af79d,
41 0x7fdb925e8a0ed8d,
42 0x5eb7e8f96c97d873,
43 0xb7f997505b8fafed,
44 0x10229022eee2cdad,
45 0x1c4c62d92c411,
46 ]);
47
48 const MODULUS_BITS: u32 = 753;
49
50 const CAPACITY: u32 = Self::MODULUS_BITS - 1;
51
52 const REPR_SHAVE_BITS: u32 = 15;
53
54 const R: BigInteger = BigInt::new([
55 0xb99680147fff6f42,
56 0x4eb16817b589cea8,
57 0xa1ebd2d90c79e179,
58 0xf725caec549c0da,
59 0xab0c4ee6d3e6dad4,
60 0x9fbca908de0ccb62,
61 0x320c3bb713338498,
62 0x598b4302d2f00a62,
63 0x4074c9cbfd8ca621,
64 0xfa47edb3865e88c,
65 0x95455fb31ff9a195,
66 0x7b479ec8e242,
67 ]);
68
69 const R2: BigInteger = BigInt::new([
70 0x3f9c69c7b7f4c8d1,
71 0x70a50fa9ee48d127,
72 0xcdbe6702009569cb,
73 0x6bd8c6c6c49edc38,
74 0x7955876cc35ee94e,
75 0xc7285529be54a3f4,
76 0xded52121ecec77cf,
77 0x99be80f2ee12ee8e,
78 0xc8a0ff01493bdcef,
79 0xacc27988f3d9a316,
80 0xd9e817a8fb44b3c9,
81 0x5b58037e0e4,
82 ]);
83
84 const INV: u64 = 0xc90776e23fffffff;
85
86 const GENERATOR: BigInteger = BigInt::new([
87 0xeee0a5d37ff6635e,
88 0xff458536cfa1cff4,
89 0x659af978d8169ab0,
90 0x1f1841c24780e3f1,
91 0x602213036dcfef3a,
92 0xd1d5c8f39d72db20,
93 0xeb8b63c1c0ffefab,
94 0xd2488e985f6cfa4e,
95 0xcce1c2a623f7a66a,
96 0x2a060f4d5085b19a,
97 0xa9111a596408842f,
98 0x11ca8d50bf627,
99 ]);
100
101 const MODULUS_MINUS_ONE_DIV_TWO: BigInteger = BigInt::new([
102 0xec83bb7120000000,
103 0xa7504c8b87d09d27,
104 0x6b61c0de1f802bcb,
105 0x5ceffcbb1a4c9d52,
106 0x9f75e54a1490931b,
107 0xd9362e14642cd4cd,
108 0xcce8926cd0ad7bce,
109 0x83fedc92f45076c6,
110 0xaf5bf47cb64bec39,
111 0xdbfccba82dc7d7f6,
112 0x88114811777166d6,
113 0xe26316c96208,
114 ]);
115
116 // T and T_MINUS_ONE_DIV_TWO, where MODULUS - 1 = 2^S * T
117
118 /// T = (MODULUS - 1) / 2^S =
119 /// 39021010480745652133919498688765463538626870065884617224134041854204007249857398469987226430131438115069708760723898631821547688442835449306011425196003537779414482717728302293895201885929702287178426719326440397855625
120 const T: BigInteger = BigInt::new([
121 0x3e84e93f641ddb89,
122 0xfc015e5d3a82645c,
123 0xd264ea935b0e06f0,
124 0xa48498dae77fe5d8,
125 0x2166a66cfbaf2a50,
126 0x856bde76c9b170a3,
127 0xa283b63667449366,
128 0xb25f61cc1ff6e497,
129 0x6e3ebfb57adfa3e5,
130 0xbb8b36b6dfe65d41,
131 0xb64b1044408a408b,
132 0x71318,
133 ]);
134
135 /// (T - 1) / 2 =
136 /// 19510505240372826066959749344382731769313435032942308612067020927102003624928699234993613215065719057534854380361949315910773844221417724653005712598001768889707241358864151146947600942964851143589213359663220198927812
137 const T_MINUS_ONE_DIV_TWO: BigInteger = BigInt::new([
138 0x1f42749fb20eedc4,
139 0x7e00af2e9d41322e,
140 0x69327549ad870378,
141 0x52424c6d73bff2ec,
142 0x90b353367dd79528,
143 0x42b5ef3b64d8b851,
144 0xd141db1b33a249b3,
145 0xd92fb0e60ffb724b,
146 0xb71f5fdabd6fd1f2,
147 0xddc59b5b6ff32ea0,
148 0x5b25882220452045,
149 0x3898c,
150 ]);
151}