arnaucube
arnaucube/poulpyPublic Self-hosted repository
poulpy/math/examples/main.rs
math/examples/main.rsRaw
 1use math::ring::Ring;
 2use math::modulus::prime::Prime;
 3use math::dft::ntt::Table;
 4
 5fn main() {
 6    // Example usage of `Prime<u64>`
 7    let q_base: u64 = 65537;      // Example prime base
 8    let q_power: usize = 1;     // Example power
 9    let prime_instance: Prime<u64> = Prime::<u64>::new(q_base, q_power);
10    
11    // Display the fields of `Prime` to verify
12    println!("Prime instance created:");
13    println!("q: {}", prime_instance.q());
14    println!("q_base: {}", prime_instance.q_base());
15    println!("q_power: {}", prime_instance.q_power());
16
17    let n: u64 = 32;
18    let nth_root: u64 = n<<1;
19
20    let ntt_table: Table<u64> = Table::<u64>::new(prime_instance, nth_root);
21
22    let mut a: Vec<u64> = vec![0; (nth_root >> 1) as usize];
23
24    for i in 0..a.len(){
25        a[i] = i as u64;
26    }
27
28    println!("{:?}", a);
29
30    ntt_table.forward_inplace::<false>(&mut a);
31
32    println!("{:?}", a);
33
34    ntt_table.backward_inplace::<false>(&mut a);
35
36    println!("{:?}", a);
37
38    let r : Ring<u64> = Ring::<u64>::new(n as usize, q_base, q_power);
39
40    let mut p0: math::poly::Poly<u64> = r.new_poly();
41    let mut p1: math::poly::Poly<u64> = r.new_poly();
42
43    for i in 0..p0.n(){
44        p0.0[i] = i as u64
45    }
46
47    r.automorphism(p0, (2*r.n-1) as u64, &mut p1);
48
49    println!("{:?}", p1);
50
51}