@@ -271,9 +271,17 @@ fn correct_sum_as_poly_in_first_variable<F: IsField>(
271271 y : & [ FieldElement < F > ] ,
272272 k : usize ,
273273) -> Result < Polynomial < FieldElement < F > > , ProverError > {
274- assert ! ( k > 0 ) ;
274+ if k == 0 {
275+ return Err ( ProverError :: InvalidState (
276+ "correct_sum_as_poly_in_first_variable: k must be > 0" . to_string ( ) ,
277+ ) ) ;
278+ }
275279 let n = y. len ( ) ;
276- assert ! ( k <= n) ;
280+ if k > n {
281+ return Err ( ProverError :: InvalidState ( format ! (
282+ "correct_sum_as_poly_in_first_variable: k ({k}) > y.len() ({n})"
283+ ) ) ) ;
284+ }
277285
278286 // a_const = 1 / eq_eval((0^(n-k+1)), y[..n-k+1])
279287 // eq_eval(0, y_i) = 1 - y_i, so eq_eval(0^m, y) = prod(1 - y_i).
@@ -498,7 +506,9 @@ where
498506 for ( claim, oracle) in claims. iter_mut ( ) . zip ( oracles. iter ( ) ) {
499507 let n_unused = n_variables - oracle. n_variables ( ) ;
500508 if n_unused > 0 {
501- * claim = & * claim * & FieldElement :: < F > :: from ( 1u64 << n_unused) ;
509+ let doubling_factor =
510+ ( 0 ..n_unused) . fold ( FieldElement :: < F > :: one ( ) , |acc, _| & acc + & acc) ;
511+ * claim = & * claim * & doubling_factor;
502512 }
503513 }
504514
@@ -1116,11 +1126,16 @@ mod tests {
11161126 input_layers : Vec < Layer < F > > ,
11171127 ) -> verifier:: BatchVerificationResult < F > {
11181128 let mut prover_transcript = DefaultTranscript :: < F > :: new ( & [ ] ) ;
1119- let ( proof, _artifact ) = prove_batch ( & mut prover_transcript, input_layers) . unwrap ( ) ;
1129+ let ( proof, artifact ) = prove_batch ( & mut prover_transcript, input_layers) . unwrap ( ) ;
11201130
11211131 let mut verifier_transcript = DefaultTranscript :: < F > :: new ( & [ ] ) ;
1122- verifier:: verify_batch ( & gates, & proof, & mut verifier_transcript)
1123- . expect ( "batch verification should succeed" )
1132+ verifier:: verify_batch (
1133+ & gates,
1134+ & artifact. n_variables_by_instance ,
1135+ & proof,
1136+ & mut verifier_transcript,
1137+ )
1138+ . expect ( "batch verification should succeed" )
11241139 }
11251140
11261141 #[ test]
@@ -1245,7 +1260,7 @@ mod tests {
12451260 let values1: Vec < FE > = ( 11u64 ..=18 ) . map ( FE :: from) . collect ( ) ;
12461261
12471262 let mut prover_transcript = DefaultTranscript :: < F > :: new ( & [ ] ) ;
1248- let ( mut proof, _ ) = prove_batch (
1263+ let ( mut proof, artifact ) = prove_batch (
12491264 & mut prover_transcript,
12501265 vec ! [
12511266 Layer :: GrandProduct ( DenseMultilinearPolynomial :: new( values0) ) ,
@@ -1259,6 +1274,7 @@ mod tests {
12591274 let mut verifier_transcript = DefaultTranscript :: < F > :: new ( & [ ] ) ;
12601275 let result = verifier:: verify_batch (
12611276 & [ Gate :: GrandProduct , Gate :: GrandProduct ] ,
1277+ & artifact. n_variables_by_instance ,
12621278 & proof,
12631279 & mut verifier_transcript,
12641280 ) ;
@@ -1271,7 +1287,7 @@ mod tests {
12711287 let values1: Vec < FE > = ( 11u64 ..=18 ) . map ( FE :: from) . collect ( ) ;
12721288
12731289 let mut prover_transcript = DefaultTranscript :: < F > :: new ( & [ ] ) ;
1274- let ( mut proof, _ ) = prove_batch (
1290+ let ( mut proof, artifact ) = prove_batch (
12751291 & mut prover_transcript,
12761292 vec ! [
12771293 Layer :: GrandProduct ( DenseMultilinearPolynomial :: new( values0) ) ,
@@ -1290,6 +1306,7 @@ mod tests {
12901306 let mut verifier_transcript = DefaultTranscript :: < F > :: new ( & [ ] ) ;
12911307 let result = verifier:: verify_batch (
12921308 & [ Gate :: GrandProduct , Gate :: GrandProduct ] ,
1309+ & artifact. n_variables_by_instance ,
12931310 & proof,
12941311 & mut verifier_transcript,
12951312 ) ;
@@ -1302,7 +1319,7 @@ mod tests {
13021319 let values1: Vec < FE > = ( 11u64 ..=14 ) . map ( FE :: from) . collect ( ) ;
13031320
13041321 let mut prover_transcript = DefaultTranscript :: < F > :: new ( & [ ] ) ;
1305- let ( mut proof, _ ) = prove_batch (
1322+ let ( mut proof, artifact ) = prove_batch (
13061323 & mut prover_transcript,
13071324 vec ! [
13081325 Layer :: GrandProduct ( DenseMultilinearPolynomial :: new( values0) ) ,
@@ -1316,6 +1333,7 @@ mod tests {
13161333 let mut verifier_transcript = DefaultTranscript :: < F > :: new ( & [ ] ) ;
13171334 let result = verifier:: verify_batch (
13181335 & [ Gate :: GrandProduct , Gate :: GrandProduct ] ,
1336+ & artifact. n_variables_by_instance ,
13191337 & proof,
13201338 & mut verifier_transcript,
13211339 ) ;
@@ -1365,13 +1383,14 @@ mod tests {
13651383
13661384 // Batch prove both instances
13671385 let mut prover_transcript = DefaultTranscript :: < F > :: new ( & [ ] ) ;
1368- let ( proof, _artifact ) =
1386+ let ( proof, artifact ) =
13691387 prove_batch ( & mut prover_transcript, vec ! [ access_layer, table_layer] ) . unwrap ( ) ;
13701388
13711389 // Batch verify
13721390 let mut verifier_transcript = DefaultTranscript :: < F > :: new ( & [ ] ) ;
13731391 let result = verifier:: verify_batch (
13741392 & [ Gate :: LogUp , Gate :: LogUp ] ,
1393+ & artifact. n_variables_by_instance ,
13751394 & proof,
13761395 & mut verifier_transcript,
13771396 ) ;
@@ -1413,13 +1432,14 @@ mod tests {
14131432 } ;
14141433
14151434 let mut prover_transcript = DefaultTranscript :: < F > :: new ( & [ ] ) ;
1416- let ( proof, _artifact ) =
1435+ let ( proof, artifact ) =
14171436 prove_batch ( & mut prover_transcript, vec ! [ access_layer, table_layer] ) . unwrap ( ) ;
14181437
14191438 // GKR itself verifies fine (each instance is internally consistent)
14201439 let mut verifier_transcript = DefaultTranscript :: < F > :: new ( & [ ] ) ;
14211440 let result = verifier:: verify_batch (
14221441 & [ Gate :: LogUp , Gate :: LogUp ] ,
1442+ & artifact. n_variables_by_instance ,
14231443 & proof,
14241444 & mut verifier_transcript,
14251445 ) ;
@@ -1467,8 +1487,12 @@ mod tests {
14671487 assert_eq ! ( artifact. claims_to_verify_by_instance[ 0 ] , vec![ FE :: from( 42 ) ] ) ;
14681488
14691489 let mut verifier_transcript = DefaultTranscript :: < F > :: new ( & [ ] ) ;
1470- let result =
1471- verifier:: verify_batch ( & [ Gate :: GrandProduct ] , & proof, & mut verifier_transcript) ;
1490+ let result = verifier:: verify_batch (
1491+ & [ Gate :: GrandProduct ] ,
1492+ & artifact. n_variables_by_instance ,
1493+ & proof,
1494+ & mut verifier_transcript,
1495+ ) ;
14721496 assert ! (
14731497 result. is_ok( ) ,
14741498 "batch verification of size-1 instance should succeed"
@@ -1527,10 +1551,15 @@ mod tests {
15271551 let single = Layer :: GrandProduct ( DenseMultilinearPolynomial :: new ( vec ! [ FE :: from( 42 ) ] ) ) ;
15281552
15291553 let mut prover_transcript = DefaultTranscript :: < F > :: new ( & [ ] ) ;
1530- let ( proof, _ ) = prove_batch ( & mut prover_transcript, vec ! [ single] ) . unwrap ( ) ;
1554+ let ( proof, artifact ) = prove_batch ( & mut prover_transcript, vec ! [ single] ) . unwrap ( ) ;
15311555
15321556 let mut verifier_transcript = DefaultTranscript :: < F > :: new ( & [ ] ) ;
1533- let result = verifier:: verify_batch ( & [ Gate :: LogUp ] , & proof, & mut verifier_transcript) ;
1557+ let result = verifier:: verify_batch (
1558+ & [ Gate :: LogUp ] ,
1559+ & artifact. n_variables_by_instance ,
1560+ & proof,
1561+ & mut verifier_transcript,
1562+ ) ;
15341563 assert ! (
15351564 result. is_err( ) ,
15361565 "wrong gate on 0-layer batch instance should be rejected"
@@ -1552,7 +1581,12 @@ mod tests {
15521581 assert ! ( artifact. claims_to_verify_by_instance. is_empty( ) ) ;
15531582
15541583 let mut verifier_transcript = DefaultTranscript :: < F > :: new ( & [ ] ) ;
1555- let result = verifier:: verify_batch ( & [ ] , & proof, & mut verifier_transcript) ;
1584+ let result = verifier:: verify_batch (
1585+ & [ ] ,
1586+ & artifact. n_variables_by_instance ,
1587+ & proof,
1588+ & mut verifier_transcript,
1589+ ) ;
15561590 assert ! ( result. is_ok( ) , "empty batch should verify successfully" ) ;
15571591
15581592 let vr = result. unwrap ( ) ;
0 commit comments