From ee89227945e543edbb752a26145b5f43c5d173ad Mon Sep 17 00:00:00 2001 From: Jackson Walters Date: Sun, 16 Feb 2025 18:55:11 -0500 Subject: [PATCH 1/5] debug statements --- src/lib.rs | 2 ++ src/main.rs | 4 ++++ 2 files changed, 6 insertions(+) diff --git a/src/lib.rs b/src/lib.rs index 91f4696..9e45f3d 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -156,7 +156,9 @@ fn factorize(n: i64) -> HashMap { /// Fast computation of a primitive root mod p^e pub fn primitive_root(p: i64, e: u32) -> i64 { + println!("primitive_root called"); let g = primitive_root_mod_p(p); + println!("g: {}", g); let mut g_lifted = g; // Lift it to p^e for _ in 1..e { if g_lifted.pow((p - 1) as u32) % p.pow(e) == 1 { diff --git a/src/main.rs b/src/main.rs index e7bb1f6..87db369 100644 --- a/src/main.rs +++ b/src/main.rs @@ -45,4 +45,8 @@ fn main() { println!("Standard polynomial mult. result: {:?}", c_std); println!("Polynomial multiplication method using NTT: {:?}", c_fast); + let q = 12289; + let n = 512; + println!("omega = {}", ntt::omega(q*q, n)); + } From ba42bcb9c1038622563180dfae103601204bab2f Mon Sep 17 00:00:00 2001 From: Jackson Walters Date: Sun, 16 Feb 2025 19:00:45 -0500 Subject: [PATCH 2/5] debug statements it's probably g_lifted.pow((p-1) as u32). this should be a mod_exp --- src/lib.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/lib.rs b/src/lib.rs index 9e45f3d..d68ed2f 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -158,9 +158,9 @@ fn factorize(n: i64) -> HashMap { pub fn primitive_root(p: i64, e: u32) -> i64 { println!("primitive_root called"); let g = primitive_root_mod_p(p); - println!("g: {}", g); let mut g_lifted = g; // Lift it to p^e for _ in 1..e { + println!("g_lifted: {}", g_lifted); if g_lifted.pow((p - 1) as u32) % p.pow(e) == 1 { g_lifted += p.pow(e - 1); } From 0fef99693a1baae0c882690b33860129b2d698f6 Mon Sep 17 00:00:00 2001 From: Jackson Walters Date: Sun, 16 Feb 2025 20:17:33 -0500 Subject: [PATCH 3/5] include failing test case --- src/test.rs | 27 +++++++++++---------------- 1 file changed, 11 insertions(+), 16 deletions(-) diff --git a/src/test.rs b/src/test.rs index 25ba447..1a6edfe 100644 --- a/src/test.rs +++ b/src/test.rs @@ -26,24 +26,19 @@ mod tests { #[test] fn test_polymul_ntt_square_modulus() { - let modulus: i64 = 17*17; // Prime modulus + let moduli = [17*17, 12289*12289]; // Different moduli to test let n: usize = 8; // Length of the NTT (must be a power of 2) - let omega = omega(modulus, n); // n-th root of unity - - // Input polynomials (padded to length `n`) - let mut a = vec![1, 2, 3, 4]; - let mut b = vec![5, 6, 7, 8]; - a.resize(n, 0); - b.resize(n, 0); - - // Perform the standard polynomial multiplication - let c_std = polymul(&a, &b, n as i64, modulus); - - // Perform the NTT-based polynomial multiplication - let c_fast = polymul_ntt(&a, &b, n, modulus, omega); - // Ensure both methods produce the same result - assert_eq!(c_std, c_fast, "The results of polymul and polymul_ntt do not match"); + for &modulus in &moduli { + let omega = omega(modulus, n); // n-th root of unity + let mut a = vec![1, 2, 3, 4]; + let mut b = vec![5, 6, 7, 8]; + a.resize(n, 0); + b.resize(n, 0); + let c_std = polymul(&a, &b, n as i64, modulus); + let c_fast = polymul_ntt(&a, &b, n, modulus, omega); + assert_eq!(c_std, c_fast, "The results of polymul and polymul_ntt do not match"); + } } #[test] From 88b245a4d9fd9e6ff67f89f9a64fbed96f656a0b Mon Sep 17 00:00:00 2001 From: Jackson Walters Date: Sun, 16 Feb 2025 20:19:09 -0500 Subject: [PATCH 4/5] replace .pow with mod_exp --- src/lib.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/lib.rs b/src/lib.rs index d68ed2f..9237863 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -161,7 +161,7 @@ pub fn primitive_root(p: i64, e: u32) -> i64 { let mut g_lifted = g; // Lift it to p^e for _ in 1..e { println!("g_lifted: {}", g_lifted); - if g_lifted.pow((p - 1) as u32) % p.pow(e) == 1 { + if mod_exp(g_lifted, p-1, p.pow(e)) == 1 { g_lifted += p.pow(e - 1); } } From 3b672ad43d5dec5e93f90ac6d465c1069992b50f Mon Sep 17 00:00:00 2001 From: Jackson Walters Date: Sun, 16 Feb 2025 20:19:32 -0500 Subject: [PATCH 5/5] remove fail case from main --- src/main.rs | 4 ---- 1 file changed, 4 deletions(-) diff --git a/src/main.rs b/src/main.rs index 87db369..e7bb1f6 100644 --- a/src/main.rs +++ b/src/main.rs @@ -45,8 +45,4 @@ fn main() { println!("Standard polynomial mult. result: {:?}", c_std); println!("Polynomial multiplication method using NTT: {:?}", c_fast); - let q = 12289; - let n = 512; - println!("omega = {}", ntt::omega(q*q, n)); - }