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