diff --git a/plonky2/examples/factorial.rs b/plonky2/examples/factorial.rs new file mode 100644 index 00000000..6a2771f2 --- /dev/null +++ b/plonky2/examples/factorial.rs @@ -0,0 +1,36 @@ +use anyhow::Result; +use plonky2::field::types::Field; +use plonky2::iop::witness::PartialWitness; +use plonky2::plonk::circuit_builder::CircuitBuilder; +use plonky2::plonk::circuit_data::CircuitConfig; +use plonky2::plonk::config::{GenericConfig, PoseidonGoldilocksConfig}; + +fn main() -> Result<()> { + const D: usize = 2; + type C = PoseidonGoldilocksConfig; + type F = >::F; + + let config = CircuitConfig::standard_recursion_config(); + + let pw = PartialWitness::new(); + let mut builder = CircuitBuilder::::new(config); + + let mut cur_target = builder.one(); + for i in 2..101 { + let i_target = builder.constant(F::from_canonical_u32(i)); + cur_target = builder.mul(cur_target, i_target); + } + + let fact_100 = F::from_canonical_u64(3822706312645553057); + let fact_100_target = builder.constant(fact_100); + builder.register_public_input(fact_100_target); + + builder.connect(fact_100_target, cur_target); + + let data = builder.build::(); + let proof = data.prove(pw)?; + + println!("100 factorial (mod |F|) is: {}", proof.public_inputs[0]); + + data.verify(proof) +} diff --git a/plonky2/examples/square_root.rs b/plonky2/examples/square_root.rs new file mode 100644 index 00000000..3fce9030 --- /dev/null +++ b/plonky2/examples/square_root.rs @@ -0,0 +1,35 @@ +use anyhow::Result; +use plonky2::field::types::Field; +use plonky2::iop::witness::PartialWitness; +use plonky2::plonk::circuit_builder::CircuitBuilder; +use plonky2::plonk::circuit_data::CircuitConfig; +use plonky2::plonk::config::{GenericConfig, PoseidonGoldilocksConfig}; + +fn main() -> Result<()> { + const D: usize = 2; + type C = PoseidonGoldilocksConfig; + type F = >::F; + + let config = CircuitConfig::standard_recursion_config(); + + let pw = PartialWitness::new(); + let mut builder = CircuitBuilder::::new(config); + + let x = F::rand(); + let x_squared = x * x; + let x_target = builder.constant(x); + let x_squared_target = builder.constant(x_squared); + + let x_squared_computed = builder.mul(x_target, x_target); + builder.connect(x_squared_target, x_squared_computed); + + builder.register_public_input(x_target); + + let data = builder.build::(); + let proof = data.prove(pw)?; + + println!("Random field element: {}", x_squared); + println!("Its square root: {}", proof.public_inputs[0]); + + data.verify(proof) +}