arnaucube
arnaucube/poulpyPublic Self-hosted repository
poulpy/math/src/ring.rs
math/src/ring.rsRaw
 1pub mod impl_u64;
 2
 3use crate::dft::DFT;
 4use crate::modulus::prime::Prime;
 5use crate::modulus::WordOps;
 6use crate::poly::{Poly, PolyRNS};
 7use num::traits::Unsigned;
 8use std::rc::Rc;
 9
10pub struct Ring<O: Unsigned> {
11    pub n: usize,
12    pub modulus: Prime<O>,
13    pub dft: Box<dyn DFT<O>>,
14}
15
16impl<O: Unsigned> Ring<O> {
17    pub fn log_n(&self) -> usize {
18        return self.n().log2();
19    }
20
21    pub fn n(&self) -> usize {
22        return self.n;
23    }
24
25    pub fn new_poly(&self) -> Poly<u64> {
26        Poly::<u64>::new(self.n())
27    }
28}
29
30pub struct RingRNS<O: Unsigned>(pub Vec<Rc<Ring<O>>>);
31
32impl<O: Unsigned> RingRNS<O> {
33    pub fn log_n(&self) -> usize {
34        return self.n().log2();
35    }
36
37    pub fn n(&self) -> usize {
38        self.0[0].n()
39    }
40
41    pub fn new_polyrns(&self) -> PolyRNS<u64> {
42        PolyRNS::<u64>::new(self.n(), self.level())
43    }
44
45    pub fn new_poly(&self) -> Poly<u64> {
46        Poly::<u64>::new(self.n())
47    }
48
49    pub fn max_level(&self) -> usize {
50        self.0.len() - 1
51    }
52
53    pub fn level(&self) -> usize {
54        self.0.len() - 1
55    }
56
57    pub fn at_level(&self, level: usize) -> RingRNS<O> {
58        assert!(level <= self.0.len());
59        RingRNS(self.0[..level + 1].to_vec())
60    }
61}