pub mod impl_u64; use crate::modulus::prime::Prime; use crate::poly::{Poly, PolyRNS}; use num_bigint::BigInt; use crate::dft::DFT; 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>(& '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]) } }