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