mirror of https://github.com/zcash/halo2.git
Add operator tests on `Assigned` for cases including `1/0`
The tests for addition and subtraction expose a bug in the addition implementation, which does not correctly handle the `1/0 -> 0` map that `inv0` is defined to perform.
This commit is contained in:
parent
0353e4c402
commit
c4cc5dd516
|
@ -163,3 +163,69 @@ impl<F: Field> Assigned<F> {
|
|||
}
|
||||
}
|
||||
}
|
||||
|
||||
#[cfg(test)]
|
||||
mod tests {
|
||||
use pasta_curves::Fp;
|
||||
|
||||
use super::Assigned;
|
||||
|
||||
#[test]
|
||||
fn add_trivial_to_inv0_rational() {
|
||||
// a = 2
|
||||
// b = inv0(1/0)
|
||||
let a = Assigned::Trivial(Fp::from(2));
|
||||
let b = Assigned::Rational(Fp::one(), Fp::zero());
|
||||
|
||||
// 2 + inv0(1/0) = 2 + 0 = 1/2
|
||||
// This fails if addition is implemented using normal rules for rationals.
|
||||
assert_eq!((a + b).evaluate(), a.evaluate());
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn add_rational_to_inv0_rational() {
|
||||
// a = inv0(1/2)
|
||||
// b = inv0(1/0)
|
||||
let a = Assigned::Rational(Fp::one(), Fp::from(2));
|
||||
let b = Assigned::Rational(Fp::one(), Fp::zero());
|
||||
|
||||
// inv0(1/2) + inv0(1/0) = 1/2 + 0 = 1/2
|
||||
// This fails if addition is implemented using normal rules for rationals.
|
||||
assert_eq!((a + b).evaluate(), a.evaluate());
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn sub_trivial_from_inv0_rational() {
|
||||
// a = 2
|
||||
// b = inv0(1/0)
|
||||
let a = Assigned::Trivial(Fp::from(2));
|
||||
let b = Assigned::Rational(Fp::one(), Fp::zero());
|
||||
|
||||
// inv0(1/0) - 2 = 0 - 2 = -2
|
||||
// This fails if subtraction is implemented using normal rules for rationals.
|
||||
assert_eq!((b - a).evaluate(), (-a).evaluate());
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn sub_rational_from_inv0_rational() {
|
||||
// a = inv0(1/2)
|
||||
// b = inv0(1/0)
|
||||
let a = Assigned::Rational(Fp::one(), Fp::from(2));
|
||||
let b = Assigned::Rational(Fp::one(), Fp::zero());
|
||||
|
||||
// inv0(1/0) - inv0(1/2) = 0 - 1/2 = -1/2
|
||||
// This fails if subtraction is implemented using normal rules for rationals.
|
||||
assert_eq!((b - a).evaluate(), (-a).evaluate());
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn mul_rational_by_inv0_rational() {
|
||||
// a = inv0(1/2)
|
||||
// b = inv0(1/0)
|
||||
let a = Assigned::Rational(Fp::one(), Fp::from(2));
|
||||
let b = Assigned::Rational(Fp::one(), Fp::zero());
|
||||
|
||||
// inv0(1/2) * inv0(1/0) = 1/2 * 0 = 0
|
||||
assert_eq!((a * b).evaluate(), Fp::zero());
|
||||
}
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue