arnaucube
arnaucube/poulpyPublic Self-hosted repository
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}