diff --git a/src/gadgets/arithmetic_extension.rs b/src/gadgets/arithmetic_extension.rs index d81943ab..3262ab7d 100644 --- a/src/gadgets/arithmetic_extension.rs +++ b/src/gadgets/arithmetic_extension.rs @@ -558,6 +558,7 @@ mod tests { use crate::field::extension_field::algebra::ExtensionAlgebra; use crate::field::extension_field::quartic::QuarticExtension; + use crate::field::extension_field::target::ExtensionAlgebraTarget; use crate::field::field_types::Field; use crate::field::goldilocks_field::GoldilocksField; use crate::iop::witness::{PartialWitness, Witness}; @@ -618,9 +619,7 @@ mod tests { let yt = builder.constant_extension(y); let zt = builder.constant_extension(z); let comp_zt = builder.div_extension(xt, yt); - let comp_zt_unsafe = builder.div_extension(xt, yt); builder.connect_extension(zt, comp_zt); - builder.connect_extension(zt, comp_zt_unsafe); let data = builder.build(); let proof = data.prove(pw)?; @@ -636,23 +635,29 @@ mod tests { let config = CircuitConfig::standard_recursion_config(); - let pw = PartialWitness::new(); + let mut pw = PartialWitness::new(); let mut builder = CircuitBuilder::::new(config); - let x = FF::rand_vec(4); - let y = FF::rand_vec(4); - let xa = ExtensionAlgebra(x.try_into().unwrap()); - let ya = ExtensionAlgebra(y.try_into().unwrap()); - let za = xa * ya; - - let xt = builder.constant_ext_algebra(xa); - let yt = builder.constant_ext_algebra(ya); - let zt = builder.constant_ext_algebra(za); + let xt = + ExtensionAlgebraTarget(builder.add_virtual_extension_targets(D).try_into().unwrap()); + let yt = + ExtensionAlgebraTarget(builder.add_virtual_extension_targets(D).try_into().unwrap()); + let zt = + ExtensionAlgebraTarget(builder.add_virtual_extension_targets(D).try_into().unwrap()); let comp_zt = builder.mul_ext_algebra(xt, yt); for i in 0..D { builder.connect_extension(zt.0[i], comp_zt.0[i]); } + let x = ExtensionAlgebra::(FF::rand_vec(D).try_into().unwrap()); + let y = ExtensionAlgebra::(FF::rand_vec(D).try_into().unwrap()); + let z = x * y; + for i in 0..D { + pw.set_extension_target(xt.0[i], x.0[i]); + pw.set_extension_target(yt.0[i], y.0[i]); + pw.set_extension_target(zt.0[i], z.0[i]); + } + let data = builder.build(); let proof = data.prove(pw)?; diff --git a/src/gadgets/biguint.rs b/src/gadgets/biguint.rs index 9e14cdb7..e037c402 100644 --- a/src/gadgets/biguint.rs +++ b/src/gadgets/biguint.rs @@ -247,6 +247,7 @@ mod tests { use num::{BigUint, FromPrimitive, Integer}; use rand::Rng; + use crate::iop::witness::Witness; use crate::{ field::goldilocks_field::GoldilocksField, iop::witness::PartialWitness, @@ -263,16 +264,19 @@ mod tests { type F = GoldilocksField; let config = CircuitConfig::standard_recursion_config(); - let pw = PartialWitness::new(); + let mut pw = PartialWitness::new(); let mut builder = CircuitBuilder::::new(config); - let x = builder.constant_biguint(&x_value); - let y = builder.constant_biguint(&y_value); + let x = builder.add_virtual_biguint_target(x_value.to_u32_digits().len()); + let y = builder.add_virtual_biguint_target(y_value.to_u32_digits().len()); let z = builder.add_biguint(&x, &y); - let expected_z = builder.constant_biguint(&expected_z_value); - + let expected_z = builder.add_virtual_biguint_target(expected_z_value.to_u32_digits().len()); builder.connect_biguint(&z, &expected_z); + pw.set_biguint_target(&x, &x_value); + pw.set_biguint_target(&y, &y_value); + pw.set_biguint_target(&expected_z, &expected_z_value); + let data = builder.build(); let proof = data.prove(pw).unwrap(); verify(proof, &data.verifier_only, &data.common) @@ -316,16 +320,19 @@ mod tests { type F = GoldilocksField; let config = CircuitConfig::standard_recursion_config(); - let pw = PartialWitness::new(); + let mut pw = PartialWitness::new(); let mut builder = CircuitBuilder::::new(config); - let x = builder.constant_biguint(&x_value); - let y = builder.constant_biguint(&y_value); + let x = builder.add_virtual_biguint_target(x_value.to_u32_digits().len()); + let y = builder.add_virtual_biguint_target(y_value.to_u32_digits().len()); let z = builder.mul_biguint(&x, &y); - let expected_z = builder.constant_biguint(&expected_z_value); - + let expected_z = builder.add_virtual_biguint_target(expected_z_value.to_u32_digits().len()); builder.connect_biguint(&z, &expected_z); + pw.set_biguint_target(&x, &x_value); + pw.set_biguint_target(&y, &y_value); + pw.set_biguint_target(&expected_z, &expected_z_value); + let data = builder.build(); let proof = data.prove(pw).unwrap(); verify(proof, &data.verifier_only, &data.common) diff --git a/src/gadgets/split_base.rs b/src/gadgets/split_base.rs index ade2ab0c..59879e4d 100644 --- a/src/gadgets/split_base.rs +++ b/src/gadgets/split_base.rs @@ -146,14 +146,14 @@ mod tests { let pw = PartialWitness::new(); let mut builder = CircuitBuilder::::new(config); - let n = thread_rng().gen_range(0..(1 << 10)); + let n = thread_rng().gen_range(0..(1 << 30)); let x = builder.constant(F::from_canonical_usize(n)); let zero = builder._false(); let one = builder._true(); let y = builder.le_sum( - (0..10) + (0..30) .scan(n, |acc, _| { let tmp = *acc % 2; *acc /= 2; diff --git a/src/iop/witness.rs b/src/iop/witness.rs index 8b6df90a..6ace4411 100644 --- a/src/iop/witness.rs +++ b/src/iop/witness.rs @@ -5,6 +5,7 @@ use num::{BigUint, FromPrimitive, Zero}; use crate::field::extension_field::target::ExtensionTarget; use crate::field::extension_field::{Extendable, FieldExtension}; use crate::field::field_types::Field; +use crate::gadgets::arithmetic_u32::U32Target; use crate::gadgets::biguint::BigUintTarget; use crate::gadgets::nonnative::NonNativeTarget; use crate::hash::hash_types::HashOutTarget; @@ -136,6 +137,16 @@ pub trait Witness { self.set_target(target.target, F::from_bool(value)) } + fn set_u32_target(&mut self, target: U32Target, value: u32) { + self.set_target(target.0, F::from_canonical_u32(value)) + } + + fn set_biguint_target(&mut self, target: &BigUintTarget, value: &BigUint) { + for (<, &l) in target.limbs.iter().zip(&value.to_u32_digits()) { + self.set_u32_target(lt, l); + } + } + fn set_wire(&mut self, wire: Wire, value: F) { self.set_target(Target::Wire(wire), value) }