phantom-zone/src/bool/parameters.rs
src/bool/parameters.rsRaw
1use crate::decomposer::Decomposer;
2
3#[derive(Clone, PartialEq)]
4pub(super) struct BoolParameters<El> {
5 rlwe_q: Modulus<El>,
6 lwe_q: Modulus<El>,
7 br_q: Modulus<El>,
8 rlwe_n: PolynomialSize,
9 lwe_n: LweDimension,
10 lwe_decomposer_base: DecompostionLogBase,
11 lwe_decomposer_count: DecompositionCount,
12 rlrg_decomposer_base: DecompostionLogBase,
13 /// RLWE x RGSW decomposition count for (part A, part B)
14 rlrg_decomposer_count: (DecompositionCount, DecompositionCount),
15 rgrg_decomposer_base: DecompostionLogBase,
16 /// RGSW x RGSW decomposition count for (part A, part B)
17 rgrg_decomposer_count: (DecompositionCount, DecompositionCount),
18 auto_decomposer_base: DecompostionLogBase,
19 auto_decomposer_count: DecompositionCount,
20 g: usize,
21 w: usize,
22}
23
24impl<El> BoolParameters<El> {
25 pub(crate) fn rlwe_q(&self) -> &Modulus<El> {
26 &self.rlwe_q
27 }
28
29 pub(crate) fn lwe_q(&self) -> &Modulus<El> {
30 &self.lwe_q
31 }
32
33 pub(crate) fn br_q(&self) -> &Modulus<El> {
34 &self.br_q
35 }
36
37 pub(crate) fn rlwe_n(&self) -> &PolynomialSize {
38 &self.rlwe_n
39 }
40
41 pub(crate) fn lwe_n(&self) -> &LweDimension {
42 &self.lwe_n
43 }
44
45 pub(crate) fn g(&self) -> usize {
46 self.g
47 }
48
49 pub(crate) fn w(&self) -> usize {
50 self.w
51 }
52
53 pub(crate) fn rlwe_rgsw_decomposition_base(&self) -> DecompostionLogBase {
54 self.rlrg_decomposer_base
55 }
56
57 pub(crate) fn rlwe_rgsw_decomposition_count(&self) -> (DecompositionCount, DecompositionCount) {
58 self.rlrg_decomposer_count
59 }
60
61 pub(crate) fn rgsw_rgsw_decomposition_base(&self) -> DecompostionLogBase {
62 self.rgrg_decomposer_base
63 }
64
65 pub(crate) fn rgsw_rgsw_decomposition_count(&self) -> (DecompositionCount, DecompositionCount) {
66 self.rgrg_decomposer_count
67 }
68
69 pub(crate) fn auto_decomposition_base(&self) -> DecompostionLogBase {
70 self.auto_decomposer_base
71 }
72
73 pub(crate) fn auto_decomposition_count(&self) -> DecompositionCount {
74 self.auto_decomposer_count
75 }
76
77 pub(crate) fn lwe_decomposition_base(&self) -> DecompostionLogBase {
78 self.lwe_decomposer_base
79 }
80
81 pub(crate) fn lwe_decomposition_count(&self) -> DecompositionCount {
82 self.lwe_decomposer_count
83 }
84
85 pub(crate) fn rgsw_rgsw_decomposer<D: Decomposer<Element = El>>(&self) -> (D, D)
86 where
87 El: Copy,
88 {
89 (
90 // A
91 D::new(
92 self.rlwe_q.0,
93 self.rgrg_decomposer_base.0,
94 self.rgrg_decomposer_count.0 .0,
95 ),
96 // B
97 D::new(
98 self.rlwe_q.0,
99 self.rgrg_decomposer_base.0,
100 self.rgrg_decomposer_count.1 .0,
101 ),
102 )
103 }
104
105 pub(crate) fn auto_decomposer<D: Decomposer<Element = El>>(&self) -> D
106 where
107 El: Copy,
108 {
109 D::new(
110 self.rlwe_q.0,
111 self.auto_decomposer_base.0,
112 self.auto_decomposer_count.0,
113 )
114 }
115
116 pub(crate) fn lwe_decomposer<D: Decomposer<Element = El>>(&self) -> D
117 where
118 El: Copy,
119 {
120 D::new(
121 self.lwe_q.0,
122 self.lwe_decomposer_base.0,
123 self.lwe_decomposer_count.0,
124 )
125 }
126
127 pub(crate) fn rlwe_rgsw_decomposer<D: Decomposer<Element = El>>(&self) -> (D, D)
128 where
129 El: Copy,
130 {
131 (
132 // A
133 D::new(
134 self.rlwe_q.0,
135 self.rlrg_decomposer_base.0,
136 self.rlrg_decomposer_count.0 .0,
137 ),
138 // B
139 D::new(
140 self.rlwe_q.0,
141 self.rlrg_decomposer_base.0,
142 self.rlrg_decomposer_count.1 .0,
143 ),
144 )
145 }
146}
147
148#[derive(Clone, Copy, PartialEq)]
149pub(crate) struct DecompostionLogBase(pub(crate) usize);
150impl AsRef<usize> for DecompostionLogBase {
151 fn as_ref(&self) -> &usize {
152 &self.0
153 }
154}
155#[derive(Clone, Copy, PartialEq)]
156pub(crate) struct DecompositionCount(pub(crate) usize);
157impl AsRef<usize> for DecompositionCount {
158 fn as_ref(&self) -> &usize {
159 &self.0
160 }
161}
162#[derive(Clone, Copy, PartialEq)]
163pub(crate) struct LweDimension(pub(crate) usize);
164#[derive(Clone, Copy, PartialEq)]
165pub(crate) struct PolynomialSize(pub(crate) usize);
166#[derive(Clone, Copy, PartialEq)]
167pub(crate) struct Modulus<T>(pub(crate) T);
168
169pub(super) const SP_BOOL_PARAMS: BoolParameters<u64> = BoolParameters::<u64> {
170 rlwe_q: Modulus(268369921u64),
171 lwe_q: Modulus(1 << 16),
172 br_q: Modulus(1 << 10),
173 rlwe_n: PolynomialSize(1 << 10),
174 lwe_n: LweDimension(493),
175 lwe_decomposer_base: DecompostionLogBase(4),
176 lwe_decomposer_count: DecompositionCount(4),
177 rlrg_decomposer_base: DecompostionLogBase(7),
178 rlrg_decomposer_count: (DecompositionCount(4), DecompositionCount(4)),
179 rgrg_decomposer_base: DecompostionLogBase(7),
180 rgrg_decomposer_count: (DecompositionCount(4), DecompositionCount(4)),
181 auto_decomposer_base: DecompostionLogBase(7),
182 auto_decomposer_count: DecompositionCount(4),
183 g: 5,
184 w: 1,
185};
186
187pub(super) const MP_BOOL_PARAMS: BoolParameters<u64> = BoolParameters::<u64> {
188 rlwe_q: Modulus(1152921504606830593),
189 lwe_q: Modulus(1 << 20),
190 br_q: Modulus(1 << 11),
191 rlwe_n: PolynomialSize(1 << 11),
192 lwe_n: LweDimension(500),
193 lwe_decomposer_base: DecompostionLogBase(4),
194 lwe_decomposer_count: DecompositionCount(5),
195 rlrg_decomposer_base: DecompostionLogBase(12),
196 rlrg_decomposer_count: (DecompositionCount(5), DecompositionCount(5)),
197 rgrg_decomposer_base: DecompostionLogBase(12),
198 rgrg_decomposer_count: (DecompositionCount(5), DecompositionCount(5)),
199 auto_decomposer_base: DecompostionLogBase(12),
200 auto_decomposer_count: DecompositionCount(5),
201 g: 5,
202 w: 1,
203};
204
205#[cfg(test)]
206mod tests {
207 use crate::utils::generate_prime;
208
209 #[test]
210 fn find_prime() {
211 let bits = 61;
212 let ring_size = 1 << 11;
213 let prime = generate_prime(bits, ring_size * 2, 1 << bits).unwrap();
214 dbg!(prime);
215 }
216}