fix: Remove mod from X subtrahend in dff

The modular operation is likely incorrect in this case.
Removig it.
This commit is contained in:
Alivecow 2024-11-26 14:55:40 +01:00
parent 361c6ab813
commit b54753fe7e
3 changed files with 17 additions and 27 deletions

View file

@ -11,29 +11,28 @@ pub struct Factors {
pub degree: u32, pub degree: u32,
} }
pub fn ddf(f: Polynomial) -> Vec<(Polynomial, usize)> { pub fn ddf(f: Polynomial) -> Vec<(Polynomial, u128)> {
let q = BigUint::pow(&BigUint::from_u8(2).unwrap(), 128); let q = BigUint::pow(&BigUint::from_u8(2).unwrap(), 128);
eprintln!("q: {:?}", q); eprintln!("q: {:?}", q);
let mut z: Vec<(Polynomial, usize)> = vec![]; let mut z: Vec<(Polynomial, u128)> = vec![];
let mut d: u32 = 1; let mut d: u128 = 1;
let mut f_star = f.clone(); let mut f_star = f.clone();
let one_cmp = Polynomial::one(); let one_cmp = Polynomial::one();
while f_star.degree() >= (2 * d) as usize { while f_star.degree() >= (2 * d) as usize {
let h = Polynomial::x().bpow_mod(q.clone().pow(d), f_star.clone()) let h = Polynomial::x().bpow_mod(q.clone().pow(d), f_star.clone()) + Polynomial::x();
+ Polynomial::x().div(&f_star).1;
let g = gcd(&h, &f_star); let g = gcd(&h, &f_star);
if g != one_cmp { if g != one_cmp {
z.push((g.clone(), d as usize)); z.push((g.clone(), d));
f_star = f_star.div(&g).0; f_star = f_star.div(&g).0;
} }
d += 1; d += 1;
} }
if f_star != one_cmp { if f_star != one_cmp {
z.push((f_star.clone(), f_star.degree())); z.push((f_star.clone(), f_star.degree() as u128));
} else if z.len() == 0 { } else if z.len() == 0 {
z.push((f.clone(), 1)); z.push((f.clone(), 1));
} }

View file

@ -10,14 +10,14 @@ use super::poly::Polynomial;
#[derive(Debug, Serialize, Deserialize)] #[derive(Debug, Serialize, Deserialize)]
pub struct Factors { pub struct Factors {
pub factor: Vec<String>, pub factor: Vec<String>,
pub exponent: u32, pub exponent: u128,
} }
pub fn sff(mut f: Polynomial) -> Vec<(Polynomial, u32)> { pub fn sff(mut f: Polynomial) -> Vec<(Polynomial, u128)> {
let mut c = gcd(&f, &f.clone().diff()); let mut c = gcd(&f, &f.clone().diff());
f = f.div(&c).0; f = f.div(&c).0;
let mut z: Vec<(Polynomial, u32)> = vec![]; let mut z: Vec<(Polynomial, u128)> = vec![];
let mut e: u32 = 1; let mut e: u128 = 1;
let one_element = Polynomial::new(vec![FieldElement::new( let one_element = Polynomial::new(vec![FieldElement::new(
polynomial_2_block(vec![0], "gcm").unwrap(), polynomial_2_block(vec![0], "gcm").unwrap(),

View file

@ -1,24 +1,15 @@
{ {
"testcases": { "testcases": {
"sandbox": { "sandbox": {
"action": "gfpoly_factor_sff", "action": "gfpoly_factor_ddf",
"arguments": { "arguments": {
"F": [ "F": [
"vL77UwAAAAAAAAAAAAAAAA==", "tpkgAAAAAAAAAAAAAAAAAA==",
"mEHchYAAAAAAAAAAAAAAAA==", "m6MQAAAAAAAAAAAAAAAAAA==",
"9WJa0MAAAAAAAAAAAAAAAA==", "8roAAAAAAAAAAAAAAAAAAA==",
"akHfwWAAAAAAAAAAAAAAAA==", "3dUAAAAAAAAAAAAAAAAAAA==",
"E12o/QAAAAAAAAAAAAAAAA==", "FwAAAAAAAAAAAAAAAAAAAA==",
"vKJ/FgAAAAAAAAAAAAAAAA==", "/kAAAAAAAAAAAAAAAAAAAA==",
"yctWwAAAAAAAAAAAAAAAAA==",
"c1BXYAAAAAAAAAAAAAAAAA==",
"o0AtAAAAAAAAAAAAAAAAAA==",
"AbP2AAAAAAAAAAAAAAAAAA==",
"k2YAAAAAAAAAAAAAAAAAAA==",
"vBYAAAAAAAAAAAAAAAAAAA==",
"dSAAAAAAAAAAAAAAAAAAAA==",
"69gAAAAAAAAAAAAAAAAAAA==",
"VkAAAAAAAAAAAAAAAAAAAA==",
"a4AAAAAAAAAAAAAAAAAAAA==", "a4AAAAAAAAAAAAAAAAAAAA==",
"gAAAAAAAAAAAAAAAAAAAAA==" "gAAAAAAAAAAAAAAAAAAAAA=="
] ]