p3_monty_31/
data_traits.rs1use core::fmt::Debug;
2use core::hash::Hash;
3
4use p3_field::{Field, FieldAlgebra};
5
6use crate::MontyField31;
7
8pub trait MontyParameters:
11 Copy + Clone + Default + Debug + Eq + PartialEq + Sync + Send + Hash + 'static
12{
13 const PRIME: u32;
15
16 const MONTY_BITS: u32;
18
19 const MONTY_MU: u32;
22
23 const MONTY_MASK: u32 = ((1u64 << Self::MONTY_BITS) - 1) as u32;
24}
25
26#[cfg(all(target_arch = "aarch64", target_feature = "neon"))]
28pub trait PackedMontyParameters: crate::MontyParametersNeon + MontyParameters {}
29#[cfg(all(
30 target_arch = "x86_64",
31 target_feature = "avx2",
32 not(all(feature = "nightly-features", target_feature = "avx512f"))
33))]
34pub trait PackedMontyParameters: crate::MontyParametersAVX2 + MontyParameters {}
36#[cfg(all(
37 feature = "nightly-features",
38 target_arch = "x86_64",
39 target_feature = "avx512f"
40))]
41pub trait PackedMontyParameters: crate::MontyParametersAVX512 + MontyParameters {}
43#[cfg(not(any(
44 all(target_arch = "aarch64", target_feature = "neon"),
45 all(
46 target_arch = "x86_64",
47 target_feature = "avx2",
48 not(all(feature = "nightly-features", target_feature = "avx512f"))
49 ),
50 all(
51 feature = "nightly-features",
52 target_arch = "x86_64",
53 target_feature = "avx512f"
54 ),
55)))]
56pub trait PackedMontyParameters: MontyParameters {}
58
59pub trait BarrettParameters: MontyParameters {
61 const N: usize = 40; const PRIME_I128: i128 = Self::PRIME as i128;
63 const PSEUDO_INV: i64 = (((1_i128) << (2 * Self::N)) / Self::PRIME_I128) as i64; const MASK: i64 = !((1 << 10) - 1); }
66
67pub trait FieldParameters: PackedMontyParameters + Sized {
69 const MONTY_ZERO: MontyField31<Self> = MontyField31::new(0);
71 const MONTY_ONE: MontyField31<Self> = MontyField31::new(1);
72 const MONTY_TWO: MontyField31<Self> = MontyField31::new(2);
73 const MONTY_NEG_ONE: MontyField31<Self> = MontyField31::new(Self::PRIME - 1);
74
75 const MONTY_GEN: MontyField31<Self>;
77
78 const HALF_P_PLUS_1: u32 = (Self::PRIME + 1) >> 1;
79
80 fn exp_u64_generic<FA: FieldAlgebra>(val: FA, power: u64) -> FA;
81 fn try_inverse<F: Field>(p1: F) -> Option<F>;
82}
83
84pub trait TwoAdicData: MontyParameters {
86 const TWO_ADICITY: usize;
88
89 const ODD_FACTOR: i32 = (Self::PRIME >> Self::TWO_ADICITY) as i32;
91
92 type ArrayLike: AsRef<[MontyField31<Self>]> + Sized;
94
95 const TWO_ADIC_GENERATORS: Self::ArrayLike;
98
99 const ROOTS_8: Self::ArrayLike;
104
105 const INV_ROOTS_8: Self::ArrayLike;
107
108 const ROOTS_16: Self::ArrayLike;
113
114 const INV_ROOTS_16: Self::ArrayLike;
116}
117
118pub trait BinomialExtensionData<const DEG: usize>: MontyParameters + Sized {
121 const W: MontyField31<Self>;
123
124 const DTH_ROOT: MontyField31<Self>;
126
127 const EXT_GENERATOR: [MontyField31<Self>; DEG];
129
130 const EXT_TWO_ADICITY: usize;
131
132 type ArrayLike: AsRef<[[MontyField31<Self>; DEG]]> + Sized;
134
135 const TWO_ADIC_EXTENSION_GENERATORS: Self::ArrayLike;
137}