pub mod impl_u64; use crate::dft::DFT; use crate::modulus::prime::Prime; use crate::modulus::WordOps; use crate::poly::{Poly, PolyRNS}; use num::traits::Unsigned; use std::rc::Rc; pub struct Ring { pub n: usize, pub modulus: Prime, pub dft: Box>, } impl Ring { pub fn log_n(&self) -> usize { return self.n().log2(); } pub fn n(&self) -> usize { return self.n; } pub fn new_poly(&self) -> Poly { Poly::::new(self.n()) } } pub struct RingRNS(pub Vec>>); impl RingRNS { pub fn log_n(&self) -> usize { return self.n().log2(); } pub fn n(&self) -> usize { self.0[0].n() } pub fn new_polyrns(&self) -> PolyRNS { PolyRNS::::new(self.n(), self.level()) } pub fn new_poly(&self) -> Poly { Poly::::new(self.n()) } 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].to_vec()) } }