pub mod impl_u64; use crate::dft::DFT; use crate::modulus::prime::Prime; use crate::poly::{Poly, PolyRNS}; use num::traits::Unsigned; pub struct Ring { pub n: usize, pub modulus: Prime, pub dft: Box>, } impl Ring { pub fn n(&self) -> usize { return self.n; } pub fn new_poly(&self) -> Poly { Poly::::new(self.n()) } } pub struct RingRNS<'a, O: Unsigned>(pub &'a [Ring]); impl RingRNS<'_, O> { pub fn n(&self) -> usize { self.0[0].n() } pub fn new_polyrns(&self) -> PolyRNS { PolyRNS::::new(self.n(), self.level()) } pub fn max_level(&self) -> usize { self.0.len() - 1 } pub fn level(&self) -> usize { self.0.len() - 1 } pub fn at_level(&self, level: usize) -> RingRNS { assert!(level <= self.0.len()); RingRNS(&self.0[..level + 1]) } }