From b63dc86c7eb4b4888759da475fc899e869ddb277 Mon Sep 17 00:00:00 2001 From: Alivecow Date: Thu, 21 Nov 2024 16:56:28 +0100 Subject: [PATCH 1/2] WIP: feat: Change soring behaviour and add new testcase --- src/tasks/tasks01/pfmath.rs | 54 +++++++++++++++++++++++++++++++++++++ src/utils/field.rs | 21 ++++++++------- 2 files changed, 66 insertions(+), 9 deletions(-) diff --git a/src/tasks/tasks01/pfmath.rs b/src/tasks/tasks01/pfmath.rs index 9742be8..71d6991 100644 --- a/src/tasks/tasks01/pfmath.rs +++ b/src/tasks/tasks01/pfmath.rs @@ -138,4 +138,58 @@ mod tests { assert_eq!(json!(result), expected); //assert_eq!(BASE64_STANDARD.encode(product), "MoAAAAAAAAAAAAAAAAAAAA=="); } + + #[test] + fn test_poly_sorting_02() { + let json1 = json!( + {"polys": [ + [ + "AQAAAAAAAAAAAAAAAAAAAA==", // 0x01 + "AgAAAAAAAAAAAAAAAAAAAA==", // 0x02 + "AwAAAAAAAAAAAAAAAAAAAA==" // 0x03 + ], + [ + "AQAAAAAAAAAAAAAAAAAAAA==", // 0x01 + "AgAAAAAAAAAAAAAAAAAAAA==", // 0x02 + "BAAAAAAAAAAAAAAAAAAAAA==" // 0x04 + ], + [ + "AQAAAAAAAAAAAAAAAAAAAA==", // 0x01 + "AgAAAAAAAAAAAAAAAAAAAA==" // 0x02 + ], + [ + "AQAAAAAAAAAAAAAAAAAAAA==", // 0x01 + "AwAAAAAAAAAAAAAAAAAAAA==" // 0x03 + ] + ],}); + + let expected = json!([ + [ + "WereNoStrangersToLoveA==", + "YouKnowTheRulesAAAAAAA==", + "AndSoDoIAAAAAAAAAAAAAA==" + ], + [ + "NeverGonnaMakeYouCryAA==", + "NeverGonnaSayGoodbyeAA==", + "NeverGonnaTellALieAAAA==", + "AndHurtYouAAAAAAAAAAAA==" + ], + [ + "NeverGonnaGiveYouUpAAA==", + "NeverGonnaLetYouDownAA==", + "NeverGonnaRunAroundAAA==", + "AndDesertYouAAAAAAAAAA==" + ] + ]); + + let sorted_array = gfpoly_sort(&json1).unwrap(); + let mut result: Vec> = vec![]; + for poly in sorted_array { + result.push(poly.to_c_array()); + } + + assert_eq!(json!(result), expected); + //assert_eq!(BASE64_STANDARD.encode(product), "MoAAAAAAAAAAAAAAAAAAAA=="); + } } diff --git a/src/utils/field.rs b/src/utils/field.rs index a682eff..2c80b51 100644 --- a/src/utils/field.rs +++ b/src/utils/field.rs @@ -324,17 +324,20 @@ impl PartialEq for Polynomial { } impl PartialOrd for Polynomial { - fn partial_cmp(&self, other: &Self) -> Option { - if self.polynomial.len() != other.polynomial.len() { - return Some(self.polynomial.len().cmp(&other.polynomial.len())); - } else { - for (field_a, field_b) in self.as_ref().iter().rev().zip(other.as_ref().iter().rev()) { - match field_a.cmp(field_b) { - std::cmp::Ordering::Equal => continue, - other => return Some(other.reverse()), + fn partial_cmp(&self, other: &Self) -> Option { + match self.polynomial.len().cmp(&other.polynomial.len()) { + Ordering::Equal => { + for (field_a, field_b) in + self.as_ref().iter().rev().zip(other.as_ref().iter().rev()) + { + match field_a.cmp(field_b) { + std::cmp::Ordering::Equal => continue, + other => return Some(other.reverse()), + } } + Some(Ordering::Equal) } - Some(Ordering::Equal) + other => Some(other), } } } From 81fe06941dbf7d43d05ab12c6f9375c327dded67 Mon Sep 17 00:00:00 2001 From: Alivecow Date: Thu, 21 Nov 2024 17:20:29 +0100 Subject: [PATCH 2/2] fix: add fix for powmod spcial case k=0 --- src/utils/field.rs | 19 ++++++++++++++++--- 1 file changed, 16 insertions(+), 3 deletions(-) diff --git a/src/utils/field.rs b/src/utils/field.rs index 2c80b51..3c7c683 100644 --- a/src/utils/field.rs +++ b/src/utils/field.rs @@ -85,13 +85,12 @@ impl Polynomial { } if exponent == 0 { - let inter = Polynomial::new(vec![FieldElement::new( + let result = Polynomial::new(vec![FieldElement::new( polynomial_2_block(vec![0], "gcm").unwrap(), )]); - let result = inter.div(&modulus); eprintln!("Returned value is: {:02X?}", result); - return result.1; + return result; } //eprintln!("Initial result: {:?}", result); @@ -1175,6 +1174,20 @@ mod tests { ); } + #[test] + fn test_field_poly_powmod_k0_special() { + let json1 = json!(["NeverGonnaGiveYouUpAAA=="]); + let json2 = json!(["NeverGonnaGiveYouUpAAA=="]); + let element1: Polynomial = Polynomial::from_c_array(&json1); + let modulus: Polynomial = Polynomial::from_c_array(&json2); + + let result = element1.pow_mod(0, modulus); + + eprintln!("Result is: {:02X?}", result); + + assert_eq!(result.to_c_array(), vec!["gAAAAAAAAAAAAAAAAAAAAA=="]); + } + #[test] fn test_field_poly_powmod_kn_eqdeg() { let json1 = json!([