1use p3_field::extension::{BinomiallyExtendable, HasTwoAdicBinomialExtension};
2use p3_field::{field_to_array, TwoAdicField};
3
4use crate::{BinomialExtensionData, FieldParameters, MontyField31, TwoAdicData};
5
6impl<const WIDTH: usize, FP> BinomiallyExtendable<WIDTH> for MontyField31<FP>
12where
13 FP: BinomialExtensionData<WIDTH> + FieldParameters,
14{
15 const W: Self = <FP as BinomialExtensionData<WIDTH>>::W;
16
17 const DTH_ROOT: Self = <FP as BinomialExtensionData<WIDTH>>::DTH_ROOT;
18
19 const EXT_GENERATOR: [Self; WIDTH] = FP::EXT_GENERATOR;
20}
21
22impl<const WIDTH: usize, FP> HasTwoAdicBinomialExtension<WIDTH> for MontyField31<FP>
23where
24 FP: BinomialExtensionData<WIDTH> + TwoAdicData + FieldParameters,
25{
26 const EXT_TWO_ADICITY: usize = <FP as BinomialExtensionData<WIDTH>>::EXT_TWO_ADICITY;
27
28 fn ext_two_adic_generator(bits: usize) -> [Self; WIDTH] {
29 assert!(bits <= Self::EXT_TWO_ADICITY);
30 if bits <= FP::TWO_ADICITY {
31 field_to_array(Self::two_adic_generator(bits))
32 } else {
33 FP::TWO_ADIC_EXTENSION_GENERATORS.as_ref()[bits - FP::TWO_ADICITY - 1]
34 }
35 }
36}