diff --git a/stwo_cairo_prover/Cargo.lock b/stwo_cairo_prover/Cargo.lock index 7deb3e9d3..7bb213505 100644 --- a/stwo_cairo_prover/Cargo.lock +++ b/stwo_cairo_prover/Cargo.lock @@ -3257,7 +3257,7 @@ checksum = "a2eb9349b6444b326872e140eb1cf5e7c522154d69e7a0ffb0fb81c06b37543f" [[package]] name = "std-shims" version = "0.1.0" -source = "git+https://github.com/starkware-libs/stwo?rev=5f177b2fe#5f177b2fe03dfd457aacac1ab150dc2babac9cf4" +source = "git+https://github.com/starkware-libs/stwo?rev=699ae6e#699ae6e8f014d59749aca058be18b081e44628ea" [[package]] name = "string_cache" @@ -3280,7 +3280,7 @@ checksum = "7da8b5736845d9f2fcb837ea5d9e2628564b3b043a70948a3f0b778838c5fb4f" [[package]] name = "stwo" version = "0.1.1" -source = "git+https://github.com/starkware-libs/stwo?rev=5f177b2fe#5f177b2fe03dfd457aacac1ab150dc2babac9cf4" +source = "git+https://github.com/starkware-libs/stwo?rev=699ae6e#699ae6e8f014d59749aca058be18b081e44628ea" dependencies = [ "blake2", "blake3", @@ -3307,7 +3307,7 @@ dependencies = [ [[package]] name = "stwo-air-utils" version = "0.1.1" -source = "git+https://github.com/starkware-libs/stwo?rev=5f177b2fe#5f177b2fe03dfd457aacac1ab150dc2babac9cf4" +source = "git+https://github.com/starkware-libs/stwo?rev=699ae6e#699ae6e8f014d59749aca058be18b081e44628ea" dependencies = [ "bytemuck", "itertools 0.12.1", @@ -3319,7 +3319,7 @@ dependencies = [ [[package]] name = "stwo-air-utils-derive" version = "0.1.0" -source = "git+https://github.com/starkware-libs/stwo?rev=5f177b2fe#5f177b2fe03dfd457aacac1ab150dc2babac9cf4" +source = "git+https://github.com/starkware-libs/stwo?rev=699ae6e#699ae6e8f014d59749aca058be18b081e44628ea" dependencies = [ "itertools 0.13.0", "proc-macro2", @@ -3396,7 +3396,7 @@ dependencies = [ [[package]] name = "stwo-constraint-framework" version = "0.1.1" -source = "git+https://github.com/starkware-libs/stwo?rev=5f177b2fe#5f177b2fe03dfd457aacac1ab150dc2babac9cf4" +source = "git+https://github.com/starkware-libs/stwo?rev=699ae6e#699ae6e8f014d59749aca058be18b081e44628ea" dependencies = [ "hashbrown 0.15.5", "itertools 0.12.1", diff --git a/stwo_cairo_prover/Cargo.toml b/stwo_cairo_prover/Cargo.toml index 1c41f8c9f..12156d160 100644 --- a/stwo_cairo_prover/Cargo.toml +++ b/stwo_cairo_prover/Cargo.toml @@ -60,16 +60,16 @@ cairo-air = { path = "crates/cairo-air" } stwo-cairo-serialize = { path = "crates/cairo-serialize", version = "~0.1.0" } # TODO(Ohad): re export stwo from constraint-framework. # TODO(Ohad): separate cairo-air from prover code and use prover features only in the prover crate. -stwo = { git = "https://github.com/starkware-libs/stwo", rev = "5f177b2fe", features = [ +stwo = { git = "https://github.com/starkware-libs/stwo", rev = "699ae6e", features = [ "parallel", "prover", ], default-features = false } -stwo-constraint-framework = { git = "https://github.com/starkware-libs/stwo", rev = "5f177b2fe", features = [ +stwo-constraint-framework = { git = "https://github.com/starkware-libs/stwo", rev = "699ae6e", features = [ "parallel", "prover", ] } -stwo-air-utils-derive = { git = "https://github.com/starkware-libs/stwo", rev = "5f177b2fe" } -stwo-air-utils = { git = "https://github.com/starkware-libs/stwo", rev = "5f177b2fe" } +stwo-air-utils-derive = { git = "https://github.com/starkware-libs/stwo", rev = "699ae6e" } +stwo-air-utils = { git = "https://github.com/starkware-libs/stwo", rev = "699ae6e" } test-case = "3.3.1" thiserror = { version = "2.0.12", default-features = false } tracing = "0.1.40" diff --git a/stwo_cairo_prover/crates/prover/src/debug_tools/relation_tracker.rs b/stwo_cairo_prover/crates/prover/src/debug_tools/relation_tracker.rs index 782374bc4..9d5ebe2a5 100644 --- a/stwo_cairo_prover/crates/prover/src/debug_tools/relation_tracker.rs +++ b/stwo_cairo_prover/crates/prover/src/debug_tools/relation_tracker.rs @@ -3,13 +3,14 @@ use cairo_air::builtins_air::BuiltinComponents; use cairo_air::opcodes_air::OpcodeComponents; use cairo_air::range_checks_air::RangeChecksComponents; use itertools::{chain, Itertools}; -use num_traits::One; +use num_traits::{One, Zero}; use stwo::core::channel::MerkleChannel; -use stwo::core::fields::m31::M31; +use stwo::core::fields::m31::{BaseField, M31}; use stwo::core::pcs::TreeVec; use stwo::core::poly::circle::CanonicCoset; use stwo::prover::backend::simd::SimdBackend; -use stwo::prover::backend::{BackendForChannel, Column}; +use stwo::prover::backend::{BackendForChannel, Col, Column}; +use stwo::prover::poly::circle::CircleCoefficients; use stwo::prover::CommitmentSchemeProver; use stwo_cairo_common::prover_types::felt::split_f252; use stwo_constraint_framework::relation_tracker::{ @@ -44,7 +45,9 @@ where interaction_tree .iter() .map(|poly| { - poly.evaluate(CanonicCoset::new(poly.log_size()).circle_domain()) + let coeffs = reduce_degree(poly.evals.clone().interpolate()); + coeffs + .evaluate(CanonicCoset::new(coeffs.log_size()).circle_domain()) .values .to_cpu() }) @@ -318,3 +321,19 @@ fn add_to_relation_entries_many( .flat_map(|x| add_to_relation_entries(x, trace)) .collect() } + +/// Reduces the polynomial to a minimal degree polynomial that evaluates to the same values. +pub fn reduce_degree(coeffs: CircleCoefficients) -> CircleCoefficients { + let mut new_log_size = coeffs.log_size(); + while new_log_size > 1 { + if ((1 << (new_log_size - 1))..(1 << new_log_size)) + .any(|i| coeffs.coeffs.at(i) != BaseField::zero()) + { + break; + } + new_log_size -= 1; + } + CircleCoefficients::new(Col::::from_iter( + coeffs.coeffs.to_cpu()[..1 << new_log_size].iter().copied(), + )) +} diff --git a/stwo_cairo_prover/crates/prover/src/witness/components/range_check_vector.rs b/stwo_cairo_prover/crates/prover/src/witness/components/range_check_vector.rs index 964a58c4b..2af87d727 100644 --- a/stwo_cairo_prover/crates/prover/src/witness/components/range_check_vector.rs +++ b/stwo_cairo_prover/crates/prover/src/witness/components/range_check_vector.rs @@ -232,6 +232,7 @@ mod tests { &mut CommitmentSchemeProver::::new( config, &twiddles, ); + commitment_scheme.set_store_polynomials_coefficients(); // Preprocessed trace. let preproceseed_column_0 = RangeCheck::new(log_ranges, 0).gen_column_simd(); @@ -278,10 +279,12 @@ mod tests { interaction_claim.claimed_sum, ); - let trace_polys = commitment_scheme - .trees - .as_ref() - .map(|t| t.polynomials.iter().cloned().collect_vec()); + let trace_polys = commitment_scheme.trees.as_ref().map(|t| { + t.polynomials + .iter() + .map(|poly| poly.coeffs.clone().unwrap()) + .collect_vec() + }); let component_eval = component.deref(); stwo_constraint_framework::assert_constraints_on_polys( diff --git a/stwo_cairo_prover/crates/prover/src/witness/preprocessed_trace.rs b/stwo_cairo_prover/crates/prover/src/witness/preprocessed_trace.rs index e4c703e07..465a5dd8c 100644 --- a/stwo_cairo_prover/crates/prover/src/witness/preprocessed_trace.rs +++ b/stwo_cairo_prover/crates/prover/src/witness/preprocessed_trace.rs @@ -34,6 +34,7 @@ where log_blowup_factor, &mut MC::C::default(), &twiddles, + false, ); commitment_scheme.commitment.root()