poulpy/rlwe/src/parameters.rs
rlwe/src/parameters.rsRaw
1use base2k::module::{MODULETYPE, Module};
2
3pub struct ParametersLiteral {
4 pub log_n: usize,
5 pub log_q: usize,
6 pub log_p: usize,
7 pub log_base2k: usize,
8 pub log_scale: usize,
9 pub xe: f64,
10 pub xs: usize,
11}
12
13pub struct Parameters {
14 log_n: usize,
15 log_q: usize,
16 log_p: usize,
17 log_scale: usize,
18 log_base2k: usize,
19 xe: f64,
20 xs: usize,
21 module: Module,
22}
23
24impl Parameters {
25 pub fn new<const MTYPE: MODULETYPE>(p: &ParametersLiteral) -> Self {
26 assert!(
27 p.log_n + 2 * p.log_base2k <= 53,
28 "invalid parameters: p.log_n + 2*p.log_base2k > 53"
29 );
30 Self {
31 log_n: p.log_n,
32 log_q: p.log_q,
33 log_p: p.log_p,
34 log_scale: p.log_scale,
35 log_base2k: p.log_base2k,
36 xe: p.xe,
37 xs: p.xs,
38 module: Module::new::<MTYPE>(1 << p.log_n),
39 }
40 }
41
42 pub fn n(&self) -> usize {
43 1 << self.log_n
44 }
45
46 pub fn log_scale(&self) -> usize {
47 self.log_scale
48 }
49
50 pub fn log_q(&self) -> usize {
51 self.log_q
52 }
53
54 pub fn log_p(&self) -> usize {
55 self.log_p
56 }
57
58 pub fn log_qp(&self) -> usize {
59 self.log_q + self.log_p
60 }
61
62 pub fn cols_q(&self) -> usize {
63 (self.log_q + self.log_base2k - 1) / self.log_base2k
64 }
65
66 pub fn cols_qp(&self) -> usize {
67 (self.log_q + self.log_p + self.log_base2k - 1) / self.log_base2k
68 }
69
70 pub fn log_base2k(&self) -> usize {
71 self.log_base2k
72 }
73
74 pub fn module(&self) -> &Module {
75 &self.module
76 }
77
78 pub fn xe(&self) -> f64 {
79 self.xe
80 }
81
82 pub fn xs(&self) -> usize {
83 self.xs
84 }
85}