arnaucube
arnaucube/ark-curves-cherry-pickedPublic Self-hosted repository
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}