mirror of
https://github.com/Qortal/pirate-librustzcash.git
synced 2025-01-31 15:52:14 +00:00
Remove enforce_nand.
This commit is contained in:
parent
0d56c7a902
commit
a45986ff97
@ -366,7 +366,34 @@ impl Boolean {
|
|||||||
{
|
{
|
||||||
let c = Self::xor(&mut cs, a, b)?;
|
let c = Self::xor(&mut cs, a, b)?;
|
||||||
|
|
||||||
Self::enforce_nand(&mut cs, &[c])
|
match c {
|
||||||
|
Boolean::Constant(false) => {
|
||||||
|
Ok(())
|
||||||
|
},
|
||||||
|
Boolean::Constant(true) => {
|
||||||
|
Err(SynthesisError::Unsatisfiable)
|
||||||
|
},
|
||||||
|
Boolean::Is(ref res) => {
|
||||||
|
cs.enforce(
|
||||||
|
|| "enforce equals zero",
|
||||||
|
|lc| lc,
|
||||||
|
|lc| lc,
|
||||||
|
|lc| lc + res.get_variable()
|
||||||
|
);
|
||||||
|
|
||||||
|
Ok(())
|
||||||
|
},
|
||||||
|
Boolean::Not(ref res) => {
|
||||||
|
cs.enforce(
|
||||||
|
|| "enforce equals one",
|
||||||
|
|lc| lc,
|
||||||
|
|lc| lc,
|
||||||
|
|lc| lc + CS::one() - res.get_variable()
|
||||||
|
);
|
||||||
|
|
||||||
|
Ok(())
|
||||||
|
},
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn get_value(&self) -> Option<bool> {
|
pub fn get_value(&self) -> Option<bool> {
|
||||||
@ -491,46 +518,6 @@ impl Boolean {
|
|||||||
|
|
||||||
Ok(cur)
|
Ok(cur)
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Asserts that at least one operand is false.
|
|
||||||
pub fn enforce_nand<E, CS>(
|
|
||||||
mut cs: CS,
|
|
||||||
bits: &[Self]
|
|
||||||
) -> Result<(), SynthesisError>
|
|
||||||
where E: Engine,
|
|
||||||
CS: ConstraintSystem<E>
|
|
||||||
{
|
|
||||||
let res = Self::kary_and(&mut cs, bits)?;
|
|
||||||
|
|
||||||
match res {
|
|
||||||
Boolean::Constant(false) => {
|
|
||||||
Ok(())
|
|
||||||
},
|
|
||||||
Boolean::Constant(true) => {
|
|
||||||
Err(SynthesisError::Unsatisfiable)
|
|
||||||
},
|
|
||||||
Boolean::Is(ref res) => {
|
|
||||||
cs.enforce(
|
|
||||||
|| "enforce nand",
|
|
||||||
|lc| lc,
|
|
||||||
|lc| lc,
|
|
||||||
|lc| lc + res.get_variable()
|
|
||||||
);
|
|
||||||
|
|
||||||
Ok(())
|
|
||||||
},
|
|
||||||
Boolean::Not(ref res) => {
|
|
||||||
cs.enforce(
|
|
||||||
|| "enforce nand",
|
|
||||||
|lc| lc,
|
|
||||||
|lc| lc,
|
|
||||||
|lc| lc + CS::one() - res.get_variable()
|
|
||||||
);
|
|
||||||
|
|
||||||
Ok(())
|
|
||||||
},
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
impl From<AllocatedBit> for Boolean {
|
impl From<AllocatedBit> for Boolean {
|
||||||
@ -1018,58 +1005,6 @@ mod test {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
#[test]
|
|
||||||
fn test_enforce_nand() {
|
|
||||||
{
|
|
||||||
let mut cs = TestConstraintSystem::<Bls12>::new();
|
|
||||||
|
|
||||||
Boolean::enforce_nand(&mut cs, &[Boolean::constant(false)]).is_ok();
|
|
||||||
Boolean::enforce_nand(&mut cs, &[Boolean::constant(true)]).is_err();
|
|
||||||
}
|
|
||||||
|
|
||||||
for i in 1..5 {
|
|
||||||
// with every possible assignment for them
|
|
||||||
for mut b in 0..(1 << i) {
|
|
||||||
// with every possible negation
|
|
||||||
for mut n in 0..(1 << i) {
|
|
||||||
let mut cs = TestConstraintSystem::<Bls12>::new();
|
|
||||||
|
|
||||||
let mut expected = true;
|
|
||||||
|
|
||||||
let mut bits = vec![];
|
|
||||||
for j in 0..i {
|
|
||||||
expected &= b & 1 == 1;
|
|
||||||
|
|
||||||
if n & 1 == 1 {
|
|
||||||
bits.push(Boolean::from(AllocatedBit::alloc(
|
|
||||||
cs.namespace(|| format!("bit {}", j)),
|
|
||||||
Some(b & 1 == 1)
|
|
||||||
).unwrap()));
|
|
||||||
} else {
|
|
||||||
bits.push(Boolean::from(AllocatedBit::alloc(
|
|
||||||
cs.namespace(|| format!("bit {}", j)),
|
|
||||||
Some(b & 1 == 0)
|
|
||||||
).unwrap()).not());
|
|
||||||
}
|
|
||||||
|
|
||||||
b >>= 1;
|
|
||||||
n >>= 1;
|
|
||||||
}
|
|
||||||
|
|
||||||
let expected = !expected;
|
|
||||||
|
|
||||||
Boolean::enforce_nand(&mut cs, &bits).unwrap();
|
|
||||||
|
|
||||||
if expected {
|
|
||||||
assert!(cs.is_satisfied());
|
|
||||||
} else {
|
|
||||||
assert!(!cs.is_satisfied());
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
#[test]
|
#[test]
|
||||||
fn test_kary_and() {
|
fn test_kary_and() {
|
||||||
// test different numbers of operands
|
// test different numbers of operands
|
||||||
|
Loading…
Reference in New Issue
Block a user