@@ -16,7 +16,8 @@ use crate::{
1616 unipoly:: UniPoly ,
1717 } ,
1818 subprotocols:: {
19- sumcheck_prover:: SumcheckInstanceProver , sumcheck_verifier:: SumcheckInstanceVerifier ,
19+ sumcheck_prover:: SumcheckInstanceProver ,
20+ sumcheck_verifier:: { SumcheckInstanceParams , SumcheckInstanceVerifier } ,
2021 } ,
2122 transcripts:: Transcript ,
2223 zkvm:: witness:: { CommittedPolynomial , VirtualPolynomial } ,
@@ -25,6 +26,44 @@ use crate::{
2526/// Degree bound of the sumcheck round polynomials in [`HammingWeightSumcheckVerifier`].
2627const DEGREE_BOUND : usize = 1 ;
2728
29+ pub struct HammingWeightSumcheckParams < F : JoltField > {
30+ pub d : usize ,
31+ pub num_rounds : usize ,
32+ pub gamma_powers : Vec < F > ,
33+ pub polynomial_types : Vec < CommittedPolynomial > ,
34+ pub sumcheck_id : SumcheckId ,
35+ pub r_cycle : Vec < F :: Challenge > ,
36+ }
37+
38+ impl < F : JoltField > SumcheckInstanceParams < F > for HammingWeightSumcheckParams < F > {
39+ fn num_rounds ( & self ) -> usize {
40+ self . num_rounds
41+ }
42+
43+ fn input_claim ( & self , accumulator : & dyn OpeningAccumulator < F > ) -> F {
44+ if self . sumcheck_id == SumcheckId :: RamHammingWeight {
45+ let ( _, hamming_booleanity_claim) = accumulator. get_virtual_polynomial_opening (
46+ VirtualPolynomial :: RamHammingWeight ,
47+ SumcheckId :: RamHammingBooleanity ,
48+ ) ;
49+ hamming_booleanity_claim * self . gamma_powers . iter ( ) . sum :: < F > ( )
50+ } else {
51+ self . gamma_powers . iter ( ) . sum ( )
52+ }
53+ }
54+
55+ fn degree ( & self ) -> usize {
56+ DEGREE_BOUND
57+ }
58+
59+ fn normalize_opening_point (
60+ & self ,
61+ challenges : & [ <F as JoltField >:: Challenge ] ,
62+ ) -> OpeningPoint < BIG_ENDIAN , F > {
63+ OpeningPoint :: < LITTLE_ENDIAN , F > :: new ( challenges. to_vec ( ) ) . match_endianness ( )
64+ }
65+ }
66+
2867#[ derive( Allocative ) ]
2968pub struct HammingWeightSumcheckProver < F : JoltField > {
3069 ra : Vec < MultilinearPolynomial < F > > ,
@@ -40,16 +79,8 @@ impl<F: JoltField> HammingWeightSumcheckProver<F> {
4079}
4180
4281impl < F : JoltField , T : Transcript > SumcheckInstanceProver < F , T > for HammingWeightSumcheckProver < F > {
43- fn degree ( & self ) -> usize {
44- DEGREE_BOUND
45- }
46-
47- fn num_rounds ( & self ) -> usize {
48- self . params . num_rounds
49- }
50-
51- fn input_claim ( & self , accumulator : & ProverOpeningAccumulator < F > ) -> F {
52- self . params . input_claim ( accumulator)
82+ fn get_params ( & self ) -> Box < & dyn SumcheckInstanceParams < F > > {
83+ Box :: new ( & self . params )
5384 }
5485
5586 #[ tracing:: instrument( skip_all, name = "HammingWeightProver::compute_message" ) ]
@@ -87,17 +118,15 @@ impl<F: JoltField, T: Transcript> SumcheckInstanceProver<F, T> for HammingWeight
87118 transcript : & mut T ,
88119 sumcheck_challenges : & [ F :: Challenge ] ,
89120 ) {
90- let opening_point = get_opening_point :: < F > ( sumcheck_challenges) ;
121+ let opening_point = self . params . normalize_opening_point ( sumcheck_challenges) ;
91122 let claims: Vec < F > = self . ra . iter ( ) . map ( |ra| ra. final_sumcheck_claim ( ) ) . collect ( ) ;
92123
93- let r_cycle = self . params . get_r_cycle ( accumulator) ;
94-
95124 accumulator. append_sparse (
96125 transcript,
97126 self . params . polynomial_types . clone ( ) ,
98127 self . params . sumcheck_id ,
99128 opening_point. r ,
100- r_cycle,
129+ self . params . r_cycle . clone ( ) ,
101130 claims,
102131 ) ;
103132 }
@@ -121,16 +150,8 @@ impl<F: JoltField> HammingWeightSumcheckVerifier<F> {
121150impl < F : JoltField , T : Transcript > SumcheckInstanceVerifier < F , T >
122151 for HammingWeightSumcheckVerifier < F >
123152{
124- fn degree ( & self ) -> usize {
125- DEGREE_BOUND
126- }
127-
128- fn num_rounds ( & self ) -> usize {
129- self . params . num_rounds
130- }
131-
132- fn input_claim ( & self , accumulator : & VerifierOpeningAccumulator < F > ) -> F {
133- self . params . input_claim ( accumulator)
153+ fn get_params ( & self ) -> Box < & dyn SumcheckInstanceParams < F > > {
154+ Box :: new ( & self . params )
134155 }
135156
136157 fn expected_output_claim (
@@ -159,12 +180,13 @@ impl<F: JoltField, T: Transcript> SumcheckInstanceVerifier<F, T>
159180 transcript : & mut T ,
160181 sumcheck_challenges : & [ F :: Challenge ] ,
161182 ) {
162- let r_cycle = self . params . get_r_cycle ( accumulator) ;
163- let r = get_opening_point :: < F > ( sumcheck_challenges)
183+ let r = self
184+ . params
185+ . normalize_opening_point ( sumcheck_challenges)
164186 . r
165187 . iter ( )
166188 . cloned ( )
167- . chain ( r_cycle. iter ( ) . cloned ( ) )
189+ . chain ( self . params . r_cycle . iter ( ) . cloned ( ) )
168190 . collect :: < Vec < _ > > ( ) ;
169191
170192 accumulator. append_sparse (
@@ -175,47 +197,3 @@ impl<F: JoltField, T: Transcript> SumcheckInstanceVerifier<F, T>
175197 ) ;
176198 }
177199}
178-
179- pub struct HammingWeightSumcheckParams < F : JoltField > {
180- pub d : usize ,
181- pub num_rounds : usize ,
182- pub gamma_powers : Vec < F > ,
183- pub polynomial_types : Vec < CommittedPolynomial > ,
184- pub sumcheck_id : SumcheckId ,
185- pub virtual_poly : Option < VirtualPolynomial > ,
186- pub r_cycle_sumcheck_id : SumcheckId ,
187- }
188-
189- impl < F : JoltField > HammingWeightSumcheckParams < F > {
190- pub fn num_rounds ( & self ) -> usize {
191- self . num_rounds
192- }
193-
194- pub fn input_claim ( & self , accumulator : & dyn OpeningAccumulator < F > ) -> F {
195- if self . sumcheck_id == SumcheckId :: RamHammingWeight {
196- let ( _, hamming_booleanity_claim) = accumulator. get_virtual_polynomial_opening (
197- VirtualPolynomial :: RamHammingWeight ,
198- SumcheckId :: RamHammingBooleanity ,
199- ) ;
200- hamming_booleanity_claim * self . gamma_powers . iter ( ) . sum :: < F > ( )
201- } else {
202- self . gamma_powers . iter ( ) . sum ( )
203- }
204- }
205-
206- fn get_r_cycle ( & self , accumulator : & dyn OpeningAccumulator < F > ) -> Vec < F :: Challenge > {
207- let virtual_poly = self
208- . virtual_poly
209- . expect ( "virtual_poly must be set for hamming weight" ) ;
210- accumulator
211- . get_virtual_polynomial_opening ( virtual_poly, self . r_cycle_sumcheck_id )
212- . 0
213- . r
214- }
215- }
216-
217- fn get_opening_point < F : JoltField > (
218- sumcheck_challenges : & [ F :: Challenge ] ,
219- ) -> OpeningPoint < BIG_ENDIAN , F > {
220- OpeningPoint :: < LITTLE_ENDIAN , F > :: new ( sumcheck_challenges. to_vec ( ) ) . match_endianness ( )
221- }
0 commit comments