pub mod berlekamp;
mod bridge;
mod element;
mod gcd;
mod ntt;
mod poly;
use std::fmt;
#[derive(Debug, Clone, PartialEq)]
pub enum FiniteFieldError {
NonPrimeModulus { modulus: u64 },
DivisionByZero,
NoInverse { element: u64, modulus: u64 },
EmptyPolynomial,
DegreeMismatch {
expected: usize,
got: usize,
operation: &'static str,
},
Overflow { operation: &'static str },
InvalidEvaluationPoint { reason: String },
}
impl fmt::Display for FiniteFieldError {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
match self {
FiniteFieldError::NonPrimeModulus { modulus } => {
write!(f, "modulus {} is not prime", modulus)
}
FiniteFieldError::DivisionByZero => {
write!(f, "division by zero in finite field")
}
FiniteFieldError::NoInverse { element, modulus } => {
write!(
f,
"no multiplicative inverse for {} mod {} (gcd != 1)",
element, modulus
)
}
FiniteFieldError::EmptyPolynomial => {
write!(f, "polynomial has no coefficients")
}
FiniteFieldError::DegreeMismatch {
expected,
got,
operation,
} => {
write!(f, "{} expected degree {}, got {}", operation, expected, got)
}
FiniteFieldError::Overflow { operation } => {
write!(f, "overflow during {}", operation)
}
FiniteFieldError::InvalidEvaluationPoint { reason } => {
write!(f, "invalid evaluation point: {}", reason)
}
}
}
}
impl std::error::Error for FiniteFieldError {}
pub type FiniteFieldResult<T> = Result<T, FiniteFieldError>;
pub use bridge::educational;
pub use element::{extended_gcd, is_prime, Zp};
pub use gcd::content;
pub use ntt::{multiply_auto, ntt_multiply, NTT_PRIME_1, NTT_PRIME_2, NTT_PRIME_3, NTT_THRESHOLD};
pub use poly::PolyZp;