fixed automorphism
Jean-Philippe Bossuat jeanphilippe.bossuat@gmail.com
Fri, 20 Dec 2024 14:07:47 +0100
3 files changed,
19 insertions(+),
7 deletions(-)
M
examples/main.rs
→
examples/main.rs
@@ -5,9 +5,9 @@ use math::dft::ntt::Table;
fn main() { // Example usage of `Prime<u64>` - let q_base: u64 = 0x1fffffffffe00001; // Example prime base + let q_base: u64 = 65537; // Example prime base let q_power: usize = 1; // Example power - let mut prime_instance: Prime<u64> = Prime::<u64>::new(q_base, q_power); + let prime_instance: Prime<u64> = Prime::<u64>::new(q_base, q_power); // Display the fields of `Prime` to verify println!("Prime instance created:");@@ -15,7 +15,7 @@ println!("q: {}", prime_instance.q());
println!("q_base: {}", prime_instance.q_base()); println!("q_power: {}", prime_instance.q_power()); - let n: u64 = 1024; + let n: u64 = 32; let nth_root: u64 = n<<1; let ntt_table: Table<u64> = Table::<u64>::new(prime_instance, nth_root);@@ -37,5 +37,16 @@
println!("{:?}", a); let r : Ring<u64> = Ring::<u64>::new(n as usize, q_base, q_power); + + let mut p0: math::poly::Poly<u64> = r.new_poly(); + let mut p1: math::poly::Poly<u64> = r.new_poly(); + + for i in 0..p0.n(){ + p0.0[i] = i as u64 + } + + r.automorphism(p0, (2*r.n-1) as u64, &mut p1); + + println!("{:?}", p1); }
M
src/poly.rs
→
src/poly.rs
@@ -1,5 +1,6 @@
pub mod poly; +#[derive(Clone, Debug, PartialEq, Eq)] pub struct Poly<O>(pub Vec<O>); impl Poly<u64>{
M
src/ring/impl_u64/automorphism.rs
→
src/ring/impl_u64/automorphism.rs
@@ -34,10 +34,10 @@ let b_vec: &mut _ = &mut b.0;
let a_vec: &_ = &a.0; for i in 0..n{ - let i_in: u64 = i as u64 * gal_el; - let i_out: u64 = i_in & mask; - let sign: u64 = (i_in>>log_n) & 1; - b_vec[i_out as usize] = a_vec[i_in as usize] * (sign^1) | (q - a_vec[i_in as usize]) * sign + let gal_el_i: u64 = i as u64 * gal_el; + let i_out: u64 = gal_el_i & mask; + let sign: u64 = (gal_el_i>>log_n) & 1; + b_vec[i_out as usize] = a_vec[i] * (sign^1) | (q - a_vec[i]) * sign } } }