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