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