@@ -2,8 +2,7 @@ use super::binding::{
2
2
IOPProverMessageVariable , PointAndEvalVariable , PointVariable , TowerVerifierInputVariable ,
3
3
} ;
4
4
use crate :: arithmetics:: {
5
- challenger_multi_observe, dot_product, dot_product_pt_n_eval, eq_eval, evaluate_at_point,
6
- exts_to_felts, gen_alpha_pows, is_smaller_than, join, product, reverse,
5
+ challenger_multi_observe, dot_product, dot_product_pt_n_eval, eq_eval, evaluate_at_point, exts_to_felts, fixed_dot_product, gen_alpha_pows, is_smaller_than, join, product, reverse
7
6
} ;
8
7
use crate :: transcript:: transcript_observe_label;
9
8
use openvm_native_compiler:: prelude:: * ;
@@ -435,18 +434,20 @@ pub fn verify_tower_proof<C: Config>(
435
434
// rt' = r_merge || rt
436
435
// r_merge.len() == ceil_log2(num_product_fanin)
437
436
transcript_observe_label ( builder, challenger, b"merge" ) ;
437
+ let one: Ext < <C as Config >:: F , <C as Config >:: EF > = builder. constant ( C :: EF :: ONE ) ;
438
+ let zero: Ext < <C as Config >:: F , <C as Config >:: EF > = builder. constant ( C :: EF :: ZERO ) ;
439
+
440
+ builder. cycle_tracker_start ( "derive rt_prime" ) ;
438
441
let r_merge = challenger. sample_ext ( builder) ;
439
442
440
- let coeffs: Array < C , Ext < C :: F , C :: EF > > = builder. dyn_array ( num_fanin) ;
441
- let one: Ext < <C as Config >:: F , <C as Config >:: EF > = builder. constant ( C :: EF :: ONE ) ;
442
443
let c1: Ext < <C as Config >:: F , <C as Config >:: EF > = builder. eval ( one - r_merge. clone ( ) ) ;
443
444
let c2: Ext < <C as Config >:: F , <C as Config >:: EF > = builder. eval ( r_merge. clone ( ) ) ;
444
- builder. set ( & coeffs, 0 , c1) ;
445
- builder. set ( & coeffs, 1 , c2) ;
445
+ let coeffs = vec ! [ c1, c2] ;
446
446
447
447
let r_merge_arr = builder. dyn_array ( RVar :: from ( 1 ) ) ;
448
448
builder. set ( & r_merge_arr, 0 , r_merge) ;
449
449
let rt_prime = join ( builder, & sub_rt, & r_merge_arr) ;
450
+ builder. cycle_tracker_end ( "derive rt_prime" ) ;
450
451
451
452
// generate next round challenge
452
453
let next_alpha_len: Usize < C :: N > = builder
@@ -472,7 +473,7 @@ pub fn verify_tower_proof<C: Config>(
472
473
let prod_slice =
473
474
builder. get ( & tower_verifier_input. prod_specs_eval , spec_index) ;
474
475
let prod_round_slice = builder. get ( & prod_slice, round_var) ;
475
- let evals = dot_product ( builder, & prod_round_slice , & coeffs ) ;
476
+ let evals = fixed_dot_product ( builder, & coeffs , & prod_round_slice , zero ) ;
476
477
477
478
builder. set (
478
479
& prod_spec_point_n_eval,
@@ -532,15 +533,13 @@ pub fn verify_tower_proof<C: Config>(
532
533
let p2 = builder. get ( & prod_round_slice, 1 ) ;
533
534
let q1 = builder. get ( & prod_round_slice, 2 ) ;
534
535
let q2 = builder. get ( & prod_round_slice, 3 ) ;
535
- let c1 = builder. get ( & coeffs, 0 ) ;
536
- let c2 = builder. get ( & coeffs, 1 ) ;
537
536
538
537
let p_eval: Ext < <C as Config >:: F , <C as Config >:: EF > =
539
538
builder. constant ( C :: EF :: ZERO ) ;
540
539
let q_eval: Ext < <C as Config >:: F , <C as Config >:: EF > =
541
540
builder. constant ( C :: EF :: ZERO ) ;
542
- builder. assign ( & p_eval, p1 * c1 + p2 * c2 ) ;
543
- builder. assign ( & q_eval, q1 * c1 + q2 * c2 ) ;
541
+ builder. assign ( & p_eval, p1 * coeffs [ 0 ] + p2 * coeffs [ 1 ] ) ;
542
+ builder. assign ( & q_eval, q1 * coeffs [ 0 ] + q2 * coeffs [ 1 ] ) ;
544
543
545
544
builder. set (
546
545
& logup_spec_p_point_n_eval,
0 commit comments