@@ -437,17 +437,18 @@ pub(crate) fn compute_commit_bus_offset(
437437 return Some ( FieldElement :: zero ( ) ) ;
438438 }
439439
440- let bus_id = FieldElement :: < E > :: from ( BusId :: Commit as u64 ) ;
441440 let alpha_sq = alpha * alpha;
442-
441+ let bus_id = FieldElement :: < F > :: from ( BusId :: Commit as u64 ) ;
442+ // Negate once: fingerprint = z - lc = -(lc - z) but we compute z - lc directly
443+ // by precomputing z_minus_bus = z - bus_id (F×E mixed subtraction)
444+ let z_minus_bus = z - bus_id * FieldElement :: < E > :: one ( ) ;
443445 let mut fingerprints: Vec < FieldElement < E > > = public_output
444446 . iter ( )
445447 . enumerate ( )
446448 . map ( |( i, & value) | {
447- let lc = & bus_id
448- + & ( FieldElement :: < E > :: from ( i as u64 ) * alpha)
449- + & ( FieldElement :: < E > :: from ( value as u64 ) * & alpha_sq) ;
450- z - & lc
449+ let idx = FieldElement :: < F > :: from ( i as u64 ) ;
450+ let val = FieldElement :: < F > :: from ( value as u64 ) ;
451+ z_minus_bus - idx * alpha - val * alpha_sq
451452 } )
452453 . collect ( ) ;
453454
@@ -486,48 +487,43 @@ pub(crate) fn compute_register_bus_offset(
486487) -> Option < FieldElement < E > > {
487488 let bus_id = FieldElement :: < E > :: from ( BusId :: Memory as u64 ) ;
488489 let alpha2 = alpha * alpha;
489- let alpha3 = & alpha2 * alpha;
490- let alpha4 = & alpha3 * alpha;
491- let alpha5 = & alpha4 * alpha;
492- let alpha6 = & alpha5 * alpha;
490+ let alpha3 = alpha2 * alpha;
491+ let alpha4 = alpha3 * alpha;
492+ let alpha5 = alpha4 * alpha;
493+ let alpha6 = alpha5 * alpha;
493494
494- // Precompute constants that are the same for all addresses
495- let is_register = FieldElement :: < E > :: one ( ) ; // is_register = 1
496- // addr_hi = 0, contributes nothing
497- let base_lc = & bus_id + & ( & is_register * alpha) ;
495+ // base_lc = BusId::Memory + 1*α (is_register=1, addr_hi=0 contributes nothing)
496+ let base_lc = bus_id + * alpha;
498497
499498 // Fini timestamp: ts = u64::MAX = 0xFFFFFFFF_FFFFFFFF
500- let ts_lo = FieldElement :: < E > :: from ( 0xFFFF_FFFFu64 ) ;
501- let ts_hi = FieldElement :: < E > :: from ( 0xFFFF_FFFFu64 ) ;
502- let fini_ts_contrib = & ( & ts_lo * & alpha4) + & ( & ts_hi * & alpha5) ;
499+ let ts_max = FieldElement :: < F > :: from ( 0xFFFF_FFFFu64 ) ;
500+ let fini_ts_contrib = ts_max * ( alpha4 + alpha5) ;
503501
504502 let addr_list = register:: register_word_address_list ( ) ;
505503 let n = addr_list. len ( ) ;
506504
507505 // Build all 2*n fingerprints (init + fini per address), then batch-invert.
508- // signs[i] = -1 for init (receiver), +1 for fini (sender).
509506 let mut fingerprints: Vec < FieldElement < E > > = Vec :: with_capacity ( 2 * n) ;
510507 let mut signs: Vec < i8 > = Vec :: with_capacity ( 2 * n) ;
511508
512509 for & addr in & addr_list {
513- let addr_contrib = FieldElement :: < E > :: from ( addr) * & alpha2;
510+ let addr_fe = FieldElement :: < F > :: from ( addr) ;
511+ let addr_contrib = addr_fe * alpha2;
514512
515513 let init_value = register:: init_value_for_address ( addr, entry_point) ;
516514 let fini_value: u32 = if addr == 510 { 1 } else { 0 } ;
517515
516+ let init_fe = FieldElement :: < F > :: from ( init_value as u64 ) ;
517+ let fini_fe = FieldElement :: < F > :: from ( fini_value as u64 ) ;
518+
518519 // REG-C1 (receiver): init token with ts=0
519- let lc_init = & base_lc
520- + & addr_contrib
521- + & ( FieldElement :: < E > :: from ( init_value as u64 ) * & alpha6) ;
522- fingerprints. push ( z - & lc_init) ;
520+ let lc_init = base_lc + addr_contrib + init_fe * alpha6;
521+ fingerprints. push ( z - lc_init) ;
523522 signs. push ( -1 ) ;
524523
525524 // REG-C2 (sender): fini token with ts=MAX
526- let lc_fini = & base_lc
527- + & addr_contrib
528- + & fini_ts_contrib
529- + & ( FieldElement :: < E > :: from ( fini_value as u64 ) * & alpha6) ;
530- fingerprints. push ( z - & lc_fini) ;
525+ let lc_fini = base_lc + addr_contrib + fini_ts_contrib + fini_fe * alpha6;
526+ fingerprints. push ( z - lc_fini) ;
531527 signs. push ( 1 ) ;
532528 }
533529
0 commit comments