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