arnaucube
arnaucube/poulpyPublic Self-hosted repository
poulpy/core/src/blind_rotation/test/lut.rs
core/src/blind_rotation/test/lut.rsRaw
 1use std::vec;
 2
 3use backend::{
 4    hal::{
 5        api::{ModuleNew, ZnxView},
 6        layouts::Module,
 7    },
 8    implementation::cpu_spqlios::FFT64,
 9};
10
11use crate::blind_rotation::lut::{DivRound, LookUpTable};
12
13#[test]
14fn standard() {
15    let module: Module<FFT64> = Module::<FFT64>::new(32);
16    let basek: usize = 20;
17    let k_lut: usize = 40;
18    let message_modulus: usize = 16;
19    let extension_factor: usize = 1;
20
21    let log_scale: usize = basek + 1;
22
23    let mut f: Vec<i64> = vec![0i64; message_modulus];
24    f.iter_mut()
25        .enumerate()
26        .for_each(|(i, x)| *x = (i as i64) - 8);
27
28    let mut lut: LookUpTable = LookUpTable::alloc(&module, basek, k_lut, extension_factor);
29    lut.set(&module, &f, log_scale);
30
31    let half_step: i64 = lut.domain_size().div_round(message_modulus << 1) as i64;
32    lut.rotate(&module, half_step);
33
34    let step: usize = lut.domain_size().div_round(message_modulus);
35
36    (0..lut.domain_size()).step_by(step).for_each(|i| {
37        (0..step).for_each(|_| {
38            assert_eq!(
39                f[i / step] % message_modulus as i64,
40                lut.data[0].raw()[0] / (1 << (log_scale % basek)) as i64
41            );
42            lut.rotate(&module, -1);
43        });
44    });
45}
46
47#[test]
48fn extended() {
49    let module: Module<FFT64> = Module::<FFT64>::new(32);
50    let basek: usize = 20;
51    let k_lut: usize = 40;
52    let message_modulus: usize = 16;
53    let extension_factor: usize = 4;
54
55    let log_scale: usize = basek + 1;
56
57    let mut f: Vec<i64> = vec![0i64; message_modulus];
58    f.iter_mut()
59        .enumerate()
60        .for_each(|(i, x)| *x = (i as i64) - 8);
61
62    let mut lut: LookUpTable = LookUpTable::alloc(&module, basek, k_lut, extension_factor);
63    lut.set(&module, &f, log_scale);
64
65    let half_step: i64 = lut.domain_size().div_round(message_modulus << 1) as i64;
66    lut.rotate(&module, half_step);
67
68    let step: usize = lut.domain_size().div_round(message_modulus);
69
70    (0..lut.domain_size()).step_by(step).for_each(|i| {
71        (0..step).for_each(|_| {
72            assert_eq!(
73                f[i / step] % message_modulus as i64,
74                lut.data[0].raw()[0] / (1 << (log_scale % basek)) as i64
75            );
76            lut.rotate(&module, -1);
77        });
78    });
79}