feat: Adding gcd implementation #22
4 changed files with 85 additions and 10 deletions
|
|
@ -9,8 +9,8 @@ use tasks01::{
|
|||
gfmul::gfmul_task,
|
||||
pad_oracle::padding_oracle,
|
||||
pfmath::{
|
||||
gfdiv, gfpoly_add, gfpoly_diff, gfpoly_divmod, gfpoly_make_monic, gfpoly_mul, gfpoly_pow,
|
||||
gfpoly_powmod, gfpoly_sort, gfpoly_sqrt,
|
||||
gfdiv, gfpoly_add, gfpoly_diff, gfpoly_divmod, gfpoly_gcd, gfpoly_make_monic, gfpoly_mul,
|
||||
gfpoly_pow, gfpoly_powmod, gfpoly_sort, gfpoly_sqrt,
|
||||
},
|
||||
poly2block::poly2block,
|
||||
sea128::sea128,
|
||||
|
|
@ -151,6 +151,12 @@ pub fn task_deploy(testcase: &Testcase) -> Result<Value> {
|
|||
|
||||
Ok(json)
|
||||
}
|
||||
"gfpoly_gcd" => {
|
||||
let result = gfpoly_gcd(args)?;
|
||||
let json = json!({"G" : result.to_c_array()});
|
||||
|
||||
Ok(json)
|
||||
}
|
||||
|
||||
_ => Err(anyhow!(
|
||||
"Fatal. No compatible action found. Json data was {:?}. Arguments were; {:?}",
|
||||
|
|
|
|||
|
|
@ -2,7 +2,10 @@ use anyhow::Result;
|
|||
use base64::{prelude::BASE64_STANDARD, Engine};
|
||||
use serde_json::Value;
|
||||
|
||||
use crate::utils::{field::FieldElement, poly::Polynomial};
|
||||
use crate::utils::{
|
||||
field::FieldElement,
|
||||
poly::{gcd, Polynomial},
|
||||
};
|
||||
|
||||
pub fn gfpoly_add(args: &Value) -> Result<Polynomial> {
|
||||
let poly_a = Polynomial::from_c_array(&args["A"].clone());
|
||||
|
|
@ -105,6 +108,15 @@ pub fn gfpoly_diff(args: &Value) -> Result<Polynomial> {
|
|||
Ok(result)
|
||||
}
|
||||
|
||||
pub fn gfpoly_gcd(args: &Value) -> Result<Polynomial> {
|
||||
let poly_a = Polynomial::from_c_array(&args["A"].clone());
|
||||
let poly_b = Polynomial::from_c_array(&args["B"].clone());
|
||||
|
||||
let result = gcd(poly_a, poly_b);
|
||||
|
||||
Ok(result)
|
||||
}
|
||||
|
||||
#[cfg(test)]
|
||||
mod tests {
|
||||
use super::*;
|
||||
|
|
|
|||
|
|
@ -483,6 +483,14 @@ impl Ord for Polynomial {
|
|||
}
|
||||
}
|
||||
|
||||
pub fn gcd(a: Polynomial, b: Polynomial) -> Polynomial {
|
||||
if a.is_zero() {
|
||||
return b;
|
||||
}
|
||||
|
||||
return gcd(b.div(&a).1.monic(), a);
|
||||
}
|
||||
|
||||
pub fn sort_polynomial_array(mut polys: Vec<Polynomial>) -> Result<Vec<Polynomial>> {
|
||||
// Algorithm to sort polynomials
|
||||
// First sorting round
|
||||
|
|
@ -1254,10 +1262,46 @@ mod tests {
|
|||
]);
|
||||
let expected = json!(["AAAAAAAAAAAAAAAAAAAAAA==",]);
|
||||
let element1: Polynomial = Polynomial::from_c_array(&json1);
|
||||
eprintln!("Starting poly sqrt");
|
||||
|
||||
let result = element1.diff();
|
||||
|
||||
assert_eq!(json!(result.to_c_array()), expected);
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn test_poly_gcd() {
|
||||
let a = json!([
|
||||
"DNWpXnnY24XecPa7a8vrEA==",
|
||||
"I8uYpCbsiPaVvUznuv1IcA==",
|
||||
"wsbiU432ARWuO93He3vbvA==",
|
||||
"zp0g3o8iNz7Y+8oUxw1vJw==",
|
||||
"J0GekE3uendpN6WUAuJ4AA==",
|
||||
"wACd0e6u1ii4AAAAAAAAAA==",
|
||||
"ACAAAAAAAAAAAAAAAAAAAA=="
|
||||
]);
|
||||
let b = json!([
|
||||
"I20VjJmlSnRSe88gaDiLRQ==",
|
||||
"0Cw5HxJm/pfybJoQDf7/4w==",
|
||||
"8ByrMMf+vVj5r3YXUNCJ1g==",
|
||||
"rEU/f2UZRXqmZ6V7EPKfBA==",
|
||||
"LfdALhvCrdhhGZWl9l9DSg==",
|
||||
"KSUKhN0n6/DZmHPozd1prw==",
|
||||
"DQrRkuA9Zx279wAAAAAAAA==",
|
||||
"AhCEAAAAAAAAAAAAAAAAAA=="
|
||||
]);
|
||||
let expected = json!([
|
||||
"NeverGonnaMakeYouCryAA==",
|
||||
"NeverGonnaSayGoodbyeAA==",
|
||||
"NeverGonnaTellALieAAAA==",
|
||||
"AndHurtYouAAAAAAAAAAAA==",
|
||||
"gAAAAAAAAAAAAAAAAAAAAA=="
|
||||
]);
|
||||
|
||||
let a: Polynomial = Polynomial::from_c_array(&a);
|
||||
let b: Polynomial = Polynomial::from_c_array(&b);
|
||||
|
||||
let result = gcd(a.monic(), b.monic());
|
||||
|
||||
assert_eq!(json!(result.to_c_array()), expected);
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -1,13 +1,26 @@
|
|||
{
|
||||
"testcases": {
|
||||
"sandbox": {
|
||||
"action": "gfpoly_diff",
|
||||
"action": "gfpoly_gcd",
|
||||
"arguments": {
|
||||
"F": [
|
||||
"IJustWannaTellYouAAAAA==",
|
||||
"HowImFeelingAAAAAAAAAA==",
|
||||
"GottaMakeYouAAAAAAAAAA==",
|
||||
"UnderstaaaaaaaaaaaaanQ=="
|
||||
"A": [
|
||||
"DNWpXnnY24XecPa7a8vrEA==",
|
||||
"I8uYpCbsiPaVvUznuv1IcA==",
|
||||
"wsbiU432ARWuO93He3vbvA==",
|
||||
"zp0g3o8iNz7Y+8oUxw1vJw==",
|
||||
"J0GekE3uendpN6WUAuJ4AA==",
|
||||
"wACd0e6u1ii4AAAAAAAAAA==",
|
||||
"ACAAAAAAAAAAAAAAAAAAAA=="
|
||||
],
|
||||
"B": [
|
||||
"I20VjJmlSnRSe88gaDiLRQ==",
|
||||
"0Cw5HxJm/pfybJoQDf7/4w==",
|
||||
"8ByrMMf+vVj5r3YXUNCJ1g==",
|
||||
"rEU/f2UZRXqmZ6V7EPKfBA==",
|
||||
"LfdALhvCrdhhGZWl9l9DSg==",
|
||||
"KSUKhN0n6/DZmHPozd1prw==",
|
||||
"DQrRkuA9Zx279wAAAAAAAA==",
|
||||
"AhCEAAAAAAAAAAAAAAAAAA=="
|
||||
]
|
||||
}
|
||||
}
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue