ark_ff/fields/models/
fp3.rs1use super::cubic_extension::*;
2use crate::fields::*;
3use core::marker::PhantomData;
4
5pub trait Fp3Config: 'static + Send + Sync + Sized {
7 type Fp: PrimeField;
9 const NONRESIDUE: Self::Fp;
13
14 const FROBENIUS_COEFF_FP3_C1: &'static [Self::Fp];
15 const FROBENIUS_COEFF_FP3_C2: &'static [Self::Fp];
16
17 const TWO_ADICITY: u32;
19 const TRACE_MINUS_ONE_DIV_TWO: &'static [u64];
20 const QUADRATIC_NONRESIDUE_TO_T: Fp3<Self>;
22
23 #[inline(always)]
27 fn mul_fp_by_nonresidue_in_place(fe: &mut Self::Fp) -> &mut Self::Fp {
28 *fe *= Self::NONRESIDUE;
29 fe
30 }
31}
32
33pub struct Fp3ConfigWrapper<P: Fp3Config>(PhantomData<P>);
35
36impl<P: Fp3Config> CubicExtConfig for Fp3ConfigWrapper<P> {
37 type BasePrimeField = P::Fp;
38 type BaseField = P::Fp;
39 type FrobCoeff = P::Fp;
40
41 const DEGREE_OVER_BASE_PRIME_FIELD: usize = 3;
42
43 const NONRESIDUE: Self::BaseField = P::NONRESIDUE;
44
45 const SQRT_PRECOMP: Option<SqrtPrecomputation<CubicExtField<Self>>> =
46 Some(SqrtPrecomputation::TonelliShanks {
47 two_adicity: P::TWO_ADICITY,
48 quadratic_nonresidue_to_trace: P::QUADRATIC_NONRESIDUE_TO_T,
49 trace_of_modulus_minus_one_div_two: P::TRACE_MINUS_ONE_DIV_TWO,
50 });
51
52 const FROBENIUS_COEFF_C1: &'static [Self::FrobCoeff] = P::FROBENIUS_COEFF_FP3_C1;
53 const FROBENIUS_COEFF_C2: &'static [Self::FrobCoeff] = P::FROBENIUS_COEFF_FP3_C2;
54
55 #[inline(always)]
56 fn mul_base_field_by_nonresidue_in_place(fe: &mut Self::BaseField) -> &mut Self::BaseField {
57 P::mul_fp_by_nonresidue_in_place(fe)
58 }
59
60 fn mul_base_field_by_frob_coeff(
61 c1: &mut Self::BaseField,
62 c2: &mut Self::BaseField,
63 power: usize,
64 ) {
65 *c1 *= &Self::FROBENIUS_COEFF_C1[power % Self::DEGREE_OVER_BASE_PRIME_FIELD];
66 *c2 *= &Self::FROBENIUS_COEFF_C2[power % Self::DEGREE_OVER_BASE_PRIME_FIELD];
67 }
68}
69
70pub type Fp3<P> = CubicExtField<Fp3ConfigWrapper<P>>;
71
72impl<P: Fp3Config> Fp3<P> {
73 pub fn mul_assign_by_fp(&mut self, value: &P::Fp) {
96 self.c0.mul_assign(value);
97 self.c1.mul_assign(value);
98 self.c2.mul_assign(value);
99 }
100}
101
102impl<P: Fp3Config> CyclotomicMultSubgroup for Fp3<P> {}