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}