represent big field elements as negative
This commit is contained in:
parent
08c5baf53e
commit
bff63a78f6
1 changed files with 20 additions and 1 deletions
|
@ -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]
|
||||
|
|
Loading…
Reference in a new issue