ark-curves-cherry-picked/bw6_767/src/fields/fq3.rs
bw6_767/src/fields/fq3.rsRaw
1use ark_ff::{
2 fields::fp3::{Fp3, Fp3Config},
3 AdditiveGroup, Field, MontFp,
4};
5
6use crate::Fq;
7
8pub type Fq3 = Fp3<Fq3Config>;
9
10pub struct Fq3Config;
11
12impl Fp3Config for Fq3Config {
13 type Fp = Fq;
14
15 /// NONRESIDUE = 3
16 // Fq3 = Fq\[u\]/u^3-3
17 const NONRESIDUE: Fq = MontFp!("3");
18
19 // (MODULUS^3 - 1) % 2^TWO_ADICITY == 0
20 const TWO_ADICITY: u32 = 1;
21
22 // (T-1)/2 with T = (MODULUS^3-1) / 2^TWO_ADICITY
23 #[rustfmt::skip]
24 const TRACE_MINUS_ONE_DIV_TWO: &'static [u64] = &[
25 0x22d18a101ce54f7d,
26 0x354335b0e7c460e8,
27 0x8014efd2b7ade04d,
28 0x3a3c62ab52e0a2c1,
29 0x79ce8405b95dd2ee,
30 0x24f75cbd8559a2b6,
31 0x2519d1267e548214,
32 0xea0034421965f6c8,
33 0xbbaa92b6aca7d134,
34 0x9ec0892af11e70cc,
35 0x06e6ab40a2fd09ec,
36 0xd333987617c1542a,
37 0xdcb52167b1f0ae0f,
38 0xeffa098d77a86e52,
39 0x9fe0d744c24ed062,
40 0x7df249c9ef981da1,
41 0x01337d754cef36fa,
42 0xf84c4f79c259bd8b,
43 0x6552e19d7dc57335,
44 0x9f2cab11727d9c89,
45 0xe5cc4da17a684263,
46 0xaab0632027470c14,
47 0xb841a2fe447f48a3,
48 0x6e705db09cb2c6c9,
49 0x51d3c82bd5de018d,
50 0xf0bb21ffbef26bd1,
51 0x294ce678e6a4c0ff,
52 0x130ad731f57d4c85,
53 0xa1e367e5eb70a85b,
54 0xd1b2d73d567515cd,
55 0x0527dddbc3e9f165,
56 0x1d9c04e0098344e7,
57 0x5db616f391729475,
58 0xd2834b1fae1c2c1b,
59 0x7cf1b8c728557851,
60 0x218325db61d6ebd,
61 ];
62
63 // NONRESIDUE^T % q
64 const QUADRATIC_NONRESIDUE_TO_T: Fq3 = Fq3::new(Fq::ONE, Fq::ZERO, Fq::ZERO);
65
66 // NQR ^ (MODULUS^i - 1)/3, i=0,1,2 with NQR = u = (0,1,0)
67 const FROBENIUS_COEFF_FP3_C1: &'static [Fq] = &[
68 Fq::ONE,
69 MontFp!("451452499708746243421442696394275804592767119751118962106882058158528025766103643615697202253207413006991058800455542766924935899310685166148099708594514571753800103096705086912881023032622324847956780035251378028187894066092550170"),
70 MontFp!("45145249970874624351989341074938425649635187579061891330552522940808608853609996870081473355016347159316471246898921838485114512270394210846704144343327596979902763990851861938135223607962336094530115195266656782121333243874349260"),
71 ];
72
73 // NQR ^ (2*MODULUS^i - 2)/3, i=0,1,2 with NQR = u = (0,1,0)
74 const FROBENIUS_COEFF_FP3_C2: &'static [Fq] = &[
75 Fq::ONE,
76 MontFp!("45145249970874624351989341074938425649635187579061891330552522940808608853609996870081473355016347159316471246898921838485114512270394210846704144343327596979902763990851861938135223607962336094530115195266656782121333243874349260"),
77 MontFp!("451452499708746243421442696394275804592767119751118962106882058158528025766103643615697202253207413006991058800455542766924935899310685166148099708594514571753800103096705086912881023032622324847956780035251378028187894066092550170"),
78 ];
79}