use core::fmt::Debug;
use core::hash::Hash;
use p3_field::{Algebra, PrimeCharacteristicRing};
use crate::MontyField31;
pub trait MontyParameters:
Copy + Default + Debug + Eq + PartialEq + Sync + Send + Hash + 'static
{
const PRIME: u32;
const MONTY_BITS: u32;
const MONTY_MU: u32;
const MONTY_MASK: u32 = ((1u64 << Self::MONTY_BITS) - 1) as u32;
}
#[cfg(all(target_arch = "aarch64", target_feature = "neon"))]
pub trait PackedMontyParameters: crate::MontyParametersNeon + MontyParameters {}
#[cfg(all(
target_arch = "x86_64",
target_feature = "avx2",
not(target_feature = "avx512f")
))]
pub trait PackedMontyParameters: crate::MontyParametersAVX2 + MontyParameters {}
#[cfg(all(target_arch = "x86_64", target_feature = "avx512f"))]
pub trait PackedMontyParameters: crate::MontyParametersAVX512 + MontyParameters {}
#[cfg(not(any(
all(target_arch = "aarch64", target_feature = "neon"),
all(
target_arch = "x86_64",
target_feature = "avx2",
not(target_feature = "avx512f")
),
all(target_arch = "x86_64", target_feature = "avx512f"),
)))]
pub trait PackedMontyParameters: MontyParameters {}
pub trait BarrettParameters: MontyParameters {
const N: usize = 40; const PRIME_I128: i128 = Self::PRIME as i128;
const PSEUDO_INV: i64 = (((1_i128) << (2 * Self::N)) / Self::PRIME_I128) as i64; const MASK: i64 = !((1 << 10) - 1); }
pub trait FieldParameters: PackedMontyParameters + Sized {
const MONTY_ZERO: MontyField31<Self> = MontyField31::new(0);
const MONTY_ONE: MontyField31<Self> = MontyField31::new(1);
const MONTY_TWO: MontyField31<Self> = MontyField31::new(2);
const MONTY_NEG_ONE: MontyField31<Self> = MontyField31::new(Self::PRIME - 1);
const MONTY_GEN: MontyField31<Self>;
const HALF_P_PLUS_1: u32 = (Self::PRIME + 1) >> 1;
}
pub trait RelativelyPrimePower<const D: u64> {
fn exp_root_d<R: PrimeCharacteristicRing>(val: R) -> R;
}
pub trait TwoAdicData: MontyParameters {
const TWO_ADICITY: usize;
const ODD_FACTOR: i32 = (Self::PRIME >> Self::TWO_ADICITY) as i32;
type ArrayLike: AsRef<[MontyField31<Self>]> + Sized;
const TWO_ADIC_GENERATORS: Self::ArrayLike;
const ROOTS_8: Self::ArrayLike;
const INV_ROOTS_8: Self::ArrayLike;
const ROOTS_16: Self::ArrayLike;
const INV_ROOTS_16: Self::ArrayLike;
}
pub trait BinomialExtensionData<const DEG: usize>: MontyParameters + Sized {
const W: MontyField31<Self>;
fn mul_w<A: Algebra<MontyField31<Self>>>(a: A) -> A {
a * Self::W
}
const DTH_ROOT: MontyField31<Self>;
const EXT_GENERATOR: [MontyField31<Self>; DEG];
const EXT_TWO_ADICITY: usize;
type ArrayLike: AsRef<[[MontyField31<Self>; DEG]]> + Sized;
const TWO_ADIC_EXTENSION_GENERATORS: Self::ArrayLike;
}
pub trait TrinomialQuinticData: MontyParameters + Sized {
const EXT_GENERATOR: [MontyField31<Self>; 5];
const EXT_TWO_ADICITY: usize;
const FROBENIUS_COEFFS: [[MontyField31<Self>; 5]; 4];
type ArrayLike: AsRef<[[MontyField31<Self>; 5]]> + Sized;
const TWO_ADIC_EXTENSION_GENERATORS: Self::ArrayLike;
}