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