diff --git a/src/circuit/num.rs b/src/circuit/num.rs index 0bd801437..310bd9592 100644 --- a/src/circuit/num.rs +++ b/src/circuit/num.rs @@ -312,38 +312,6 @@ impl AllocatedNum { Ok((c, d)) } - pub fn conditionally_negate( - &self, - mut cs: CS, - condition: &Boolean - ) -> Result - where CS: ConstraintSystem - { - let r = Self::alloc( - cs.namespace(|| "conditional negation result"), - || { - let mut tmp = *self.value.get()?; - if *condition.get_value().get()? { - tmp.negate(); - } - Ok(tmp) - } - )?; - - // (1-c)(x) + (c)(-x) = r - // x - 2cx = r - // (2x) * (c) = x - r - - cs.enforce( - || "conditional negation", - |lc| lc + self.variable + self.variable, - |_| condition.lc(CS::one(), E::Fr::one()), - |lc| lc + self.variable - r.variable - ); - - Ok(r) - } - pub fn get_value(&self) -> Option { self.value } @@ -433,107 +401,6 @@ mod test { } } - #[test] - fn test_num_conditional_negation() { - { - let mut cs = TestConstraintSystem::::new(); - - let n = AllocatedNum::alloc(cs.namespace(|| "a"), || Ok(Fr::one())).unwrap(); - let b = Boolean::constant(true); - let n2 = n.conditionally_negate(&mut cs, &b).unwrap(); - - let mut negone = Fr::one(); - negone.negate(); - - assert!(cs.is_satisfied()); - assert!(cs.get("conditional negation result/num") == negone); - assert!(n2.value.unwrap() == negone); - cs.set("conditional negation result/num", Fr::from_str("1").unwrap()); - assert!(!cs.is_satisfied()); - } - { - let mut cs = TestConstraintSystem::::new(); - - let n = AllocatedNum::alloc(cs.namespace(|| "a"), || Ok(Fr::one())).unwrap(); - let b = Boolean::constant(false); - let n2 = n.conditionally_negate(&mut cs, &b).unwrap(); - - assert!(cs.is_satisfied()); - assert!(cs.get("conditional negation result/num") == Fr::one()); - assert!(n2.value.unwrap() == Fr::one()); - cs.set("conditional negation result/num", Fr::from_str("2").unwrap()); - assert!(!cs.is_satisfied()); - } - - { - let mut cs = TestConstraintSystem::::new(); - - let n = AllocatedNum::alloc(cs.namespace(|| "a"), || Ok(Fr::one())).unwrap(); - let b = Boolean::from( - AllocatedBit::alloc(cs.namespace(|| "condition"), Some(true)).unwrap() - ); - let n2 = n.conditionally_negate(&mut cs, &b).unwrap(); - - let mut negone = Fr::one(); - negone.negate(); - - assert!(cs.is_satisfied()); - assert!(cs.get("conditional negation result/num") == negone); - assert!(n2.value.unwrap() == negone); - cs.set("conditional negation result/num", Fr::from_str("1").unwrap()); - assert!(!cs.is_satisfied()); - } - { - let mut cs = TestConstraintSystem::::new(); - - let n = AllocatedNum::alloc(cs.namespace(|| "a"), || Ok(Fr::one())).unwrap(); - let b = Boolean::from( - AllocatedBit::alloc(cs.namespace(|| "condition"), Some(false)).unwrap() - ); - let n2 = n.conditionally_negate(&mut cs, &b).unwrap(); - - assert!(cs.is_satisfied()); - assert!(cs.get("conditional negation result/num") == Fr::one()); - assert!(n2.value.unwrap() == Fr::one()); - cs.set("conditional negation result/num", Fr::from_str("2").unwrap()); - assert!(!cs.is_satisfied()); - } - - { - let mut cs = TestConstraintSystem::::new(); - - let n = AllocatedNum::alloc(cs.namespace(|| "a"), || Ok(Fr::one())).unwrap(); - let b = Boolean::from( - AllocatedBit::alloc(cs.namespace(|| "condition"), Some(false)).unwrap() - ).not(); - let n2 = n.conditionally_negate(&mut cs, &b).unwrap(); - - let mut negone = Fr::one(); - negone.negate(); - - assert!(cs.is_satisfied()); - assert!(cs.get("conditional negation result/num") == negone); - assert!(n2.value.unwrap() == negone); - cs.set("conditional negation result/num", Fr::from_str("1").unwrap()); - assert!(!cs.is_satisfied()); - } - { - let mut cs = TestConstraintSystem::::new(); - - let n = AllocatedNum::alloc(cs.namespace(|| "a"), || Ok(Fr::one())).unwrap(); - let b = Boolean::from( - AllocatedBit::alloc(cs.namespace(|| "condition"), Some(true)).unwrap() - ).not(); - let n2 = n.conditionally_negate(&mut cs, &b).unwrap(); - - assert!(cs.is_satisfied()); - assert!(cs.get("conditional negation result/num") == Fr::one()); - assert!(n2.value.unwrap() == Fr::one()); - cs.set("conditional negation result/num", Fr::from_str("2").unwrap()); - assert!(!cs.is_satisfied()); - } - } - #[test] fn test_num_nonzero() { {