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
24pub struct RingRNS<'a, O>(& 'a [Ring<O>]);
25
26impl<O: Copy> RingRNS<'_, O> {
27
28 pub fn n(&self) -> usize{
29 self.0[0].n()
30 }
31
32 pub fn new_polyrns(&self) -> PolyRNS<u64>{
33 PolyRNS::<u64>::new(self.n(), self.level())
34 }
35
36 pub fn max_level(&self) -> usize{
37 self.0.len()-1
38 }
39
40 pub fn level(&self) -> usize{
41 self.0.len()-1
42 }
43
44 pub fn at_level(&self, level:usize) -> RingRNS<O>{
45 assert!(level <= self.0.len());
46 RingRNS(&self.0[..level+1])
47 }
48}