p3_monty_31/
extension.rs

1use p3_field::extension::{BinomiallyExtendable, HasTwoAdicBinomialExtension};
2use p3_field::{field_to_array, TwoAdicField};
3
4use crate::{BinomialExtensionData, FieldParameters, MontyField31, TwoAdicData};
5
6// 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.
10
11impl<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}