mirror of
https://github.com/Qortal/pirate-librustzcash.git
synced 2025-01-31 15:52:14 +00:00
Remove conditional negation implementation from AllocatedNum.
This commit is contained in:
parent
c89d47bb07
commit
4fa73efc1e
@ -312,38 +312,6 @@ impl<E: Engine> AllocatedNum<E> {
|
||||
Ok((c, d))
|
||||
}
|
||||
|
||||
pub fn conditionally_negate<CS>(
|
||||
&self,
|
||||
mut cs: CS,
|
||||
condition: &Boolean
|
||||
) -> Result<Self, SynthesisError>
|
||||
where CS: ConstraintSystem<E>
|
||||
{
|
||||
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<E::Fr> {
|
||||
self.value
|
||||
}
|
||||
@ -433,107 +401,6 @@ mod test {
|
||||
}
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn test_num_conditional_negation() {
|
||||
{
|
||||
let mut cs = TestConstraintSystem::<Bls12>::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::<Bls12>::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::<Bls12>::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::<Bls12>::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::<Bls12>::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::<Bls12>::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() {
|
||||
{
|
||||
|
Loading…
Reference in New Issue
Block a user