From bff63a78f66b93426eae54515a55756e0e92b7c3 Mon Sep 17 00:00:00 2001 From: schaeff Date: Tue, 29 Jan 2019 12:17:51 +0100 Subject: [PATCH] represent big field elements as negative --- zokrates_field/src/field.rs | 21 ++++++++++++++++++++- 1 file changed, 20 insertions(+), 1 deletion(-) diff --git a/zokrates_field/src/field.rs b/zokrates_field/src/field.rs index ab897b76..83c6000f 100644 --- a/zokrates_field/src/field.rs +++ b/zokrates_field/src/field.rs @@ -141,7 +141,12 @@ impl Default for FieldPrime { impl Display for FieldPrime { fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { - write!(f, "{}", self.value.to_str_radix(10)) + // values up to (p-1)/2 included are represented as positive, values between (p+1)/2 and p-1 as represented as negative by subtracting p + if self.value <= FieldPrime::max_value().value / 2 { + write!(f, "{}", self.value.to_str_radix(10)) + } else { + write!(f, "({})", (&self.value - (FieldPrime::max_value().value + BigInt::one())).to_str_radix(10)) + } } } @@ -612,6 +617,20 @@ mod tests { let bv = fp.to_dec_string(); assert_eq!(fp, FieldPrime::from_dec_string(bv)); } + + #[test] + fn display() { + let one = FieldPrime::from(1); + assert_eq!(String::from("1"), format!("{}", one)); + let minus_one = FieldPrime::from(0) - one; + assert_eq!(String::from("(-1)"), format!("{}", minus_one)); + // (p-1)/2 -> positive notation + let p_minus_one_over_two = (FieldPrime::from(0) - FieldPrime::from(1)) / FieldPrime::from(2); + assert_eq!(String::from("10944121435919637611123202872628637544274182200208017171849102093287904247808"), format!("{}", p_minus_one_over_two)); + // (p-1)/2 + 1 -> negative notation (p-1)/2 + 1 - p == (-p+1)/2 + let p_minus_one_over_two_plus_one = ((FieldPrime::from(0) - FieldPrime::from(1)) / FieldPrime::from(2)) + FieldPrime::from(1); + assert_eq!(String::from("(-10944121435919637611123202872628637544274182200208017171849102093287904247808)"), format!("{}", p_minus_one_over_two_plus_one)); + } } #[test]