Merging test runner implementation for monic and sqrt #20

Merged
0xalivecow merged 2 commits from dev into main 2024-11-22 20:19:13 +00:00
2 changed files with 125 additions and 19 deletions
Showing only changes of commit f75e7de733 - Show all commits

View file

@ -36,21 +36,46 @@ impl FieldElement {
BASE64_STANDARD.encode(&self.field_element) BASE64_STANDARD.encode(&self.field_element)
} }
pub fn pow(&self, mut exponent: u128) -> FieldElement { pub fn pow(mut self, mut exponent: u128) -> FieldElement {
let mut result: FieldElement =
FieldElement::new(polynomial_2_block(vec![0], "gcm").unwrap());
if exponent == 1 {
eprintln!("special case 1: {:02X?}", self.clone());
return self;
}
if exponent == 0 { if exponent == 0 {
// Return polynomial with coefficient 1 let result = FieldElement::new(polynomial_2_block(vec![0], "gcm").unwrap());
return FieldElement::new(vec![1]);
eprintln!("Returned value is: {:02X?}", result);
return result;
} }
let base = self.clone(); //eprintln!("Initial result: {:?}", result);
let mut result = base.clone();
exponent -= 1; // Subtract 1 because we already set result to base
while exponent > 0 { while exponent > 0 {
result = result * base.clone(); //eprintln!("Current exponent: {:02X}", exponent);
exponent -= 1; if exponent & 1 == 1 {
let temp = &self * &result;
eprintln!("Mult");
eprintln!("After mod: {:?}", temp);
result = temp
}
let temp_square = &self * &self;
eprintln!("Square");
eprintln!("After squaring: {:?}", temp_square);
self = temp_square;
//eprintln!("After mod: {:?}", self);
exponent >>= 1;
} }
eprintln!("result in powmod before reduction: {:02X?}", result);
eprintln!("result in powmod after reduction: {:02X?}", result);
result result
} }

View file

@ -56,19 +56,63 @@ impl Polynomial {
output output
} }
pub fn pow(&self, mut exponent: u128) -> Polynomial { pub fn pow(mut self, mut exponent: u128) -> Polynomial {
if exponent == 0 { let mut result: Polynomial = Polynomial::new(vec![FieldElement::new(
return Polynomial::new(vec![FieldElement::new( polynomial_2_block(vec![0], "gcm").unwrap(),
polynomial_2_block(vec![0], "gcm").unwrap(), )]);
)]);
if exponent == 1 {
eprintln!("special case 1: {:02X?}", self.clone());
return self;
} }
let base = self.clone(); if exponent == 0 {
let mut result = base.clone(); let result = Polynomial::new(vec![FieldElement::new(
exponent -= 1; polynomial_2_block(vec![0], "gcm").unwrap(),
)]);
eprintln!("Returned value is: {:02X?}", result);
return result;
}
//eprintln!("Initial result: {:?}", result);
while exponent > 0 { while exponent > 0 {
result = result * base.clone(); //eprintln!("Current exponent: {:02X}", exponent);
exponent -= 1; if exponent & 1 == 1 {
let temp = &self * &result;
eprintln!("Mult");
eprintln!("After mod: {:?}", temp);
result = temp
}
let temp_square = &self * &self;
eprintln!("Square");
eprintln!("After squaring: {:?}", temp_square);
self = temp_square;
//eprintln!("After mod: {:?}", self);
exponent >>= 1;
}
eprintln!("result in powmod before reduction: {:02X?}", result);
while !result.polynomial.is_empty()
&& result
.polynomial
.last()
.unwrap()
.as_ref()
.iter()
.all(|&x| x == 0)
{
result.polynomial.pop();
}
eprintln!("result in powmod after reduction: {:02X?}", result);
if result.is_empty() {
result = Polynomial::new(vec![FieldElement::new(vec![0; 16])]);
} }
result result
@ -237,6 +281,18 @@ impl Polynomial {
self self
} }
fn sqrt(self) -> Self {
let mut result = vec![];
for (position, element) in self.polynomial.iter().enumerate() {
if position % 2 == 0 {
result.push(element.clone().pow(2u128.pow(127)));
}
}
Polynomial::new(result)
}
} }
impl Clone for Polynomial { impl Clone for Polynomial {
@ -1112,4 +1168,29 @@ mod tests {
assert_eq!(json!(result.to_c_array()), expected); assert_eq!(json!(result.to_c_array()), expected);
} }
#[test]
fn test_poly_poly_sqrt() {
let json1 = json!([
"5TxUxLHO1lHE/rSFquKIAg==",
"AAAAAAAAAAAAAAAAAAAAAA==",
"0DEUJYdHlmd4X7nzzIdcCA==",
"AAAAAAAAAAAAAAAAAAAAAA==",
"PKUa1+JHTxHE8y3LbuKIIA==",
"AAAAAAAAAAAAAAAAAAAAAA==",
"Ds96KiAKKoigKoiKiiKAiA=="
]);
let expected = json!([
"NeverGonnaGiveYouUpAAA==",
"NeverGonnaLetYouDownAA==",
"NeverGonnaRunAroundAAA==",
"AndDesertYouAAAAAAAAAA=="
]);
let element1: Polynomial = Polynomial::from_c_array(&json1);
eprintln!("Starting poly sqrt");
let result = element1.sqrt();
assert_eq!(json!(result.to_c_array()), expected);
}
} }