use super::field::PrimeField;
use super::{algebra::Field, comp::ParallelCmp};
pub trait FftField: PrimeField + ParallelCmp + From<[u64; 4]> {
const S: usize;
const ROOT_OF_UNITY: Self;
const MULTIPLICATIVE_GENERATOR: Self;
fn is_even(&self) -> bool;
fn pow(self, val: u64) -> Self;
fn pow_of_2(by: u64) -> Self;
fn divn(&mut self, n: u32);
fn mod_2_pow_k(&self, k: u8) -> u8;
fn mods_2_pow_k(&self, w: u8) -> i8;
fn from_bytes_wide(bytes: &[u8; 64]) -> Self;
fn reduce(&self) -> Self;
fn from_hash(hash: &[u8; 64]) -> Self;
fn to_raw_bytes(&self) -> [u8; 32];
}
pub trait Polynomial: Field + ParallelCmp {
type Domain: FftField;
fn evaluate(self, at: Self::Domain) -> Self::Domain;
}