1use p3_field::extension::{BinomiallyExtendable, HasTwoAdicBinomialExtension};
2use p3_field::{field_to_array, TwoAdicField};
34use crate::{BinomialExtensionData, FieldParameters, MontyField31, TwoAdicData};
56// If a field implements BinomialExtensionData<WIDTH> then there is a natural
7// field extension of degree WIDTH we can define.
8// We perform no checks to make sure the data given in BinomialExtensionData<WIDTH> is valid and
9// corresponds to an actual field extension. Ensuring that is left to the implementor.
1011impl<const WIDTH: usize, FP> BinomiallyExtendable<WIDTH> for MontyField31<FP>
12where
13FP: BinomialExtensionData<WIDTH> + FieldParameters,
14{
15const W: Self = <FP as BinomialExtensionData<WIDTH>>::W;
1617const DTH_ROOT: Self = <FP as BinomialExtensionData<WIDTH>>::DTH_ROOT;
1819const EXT_GENERATOR: [Self; WIDTH] = FP::EXT_GENERATOR;
20}
2122impl<const WIDTH: usize, FP> HasTwoAdicBinomialExtension<WIDTH> for MontyField31<FP>
23where
24FP: BinomialExtensionData<WIDTH> + TwoAdicData + FieldParameters,
25{
26const EXT_TWO_ADICITY: usize = <FP as BinomialExtensionData<WIDTH>>::EXT_TWO_ADICITY;
2728fn ext_two_adic_generator(bits: usize) -> [Self; WIDTH] {
29assert!(bits <= Self::EXT_TWO_ADICITY);
30if 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}