@@ -209,7 +209,7 @@ where
209209 let nvars = self . rg . nvars ;
210210 let r: Vec < R > = dcom. out . r . iter ( ) . map ( |x| R :: from ( * x) ) . collect ( ) ;
211211
212- let rc: R = transcript. get_challenge ( ) . into ( ) ;
212+ let rc = transcript. get_challenge ( ) ;
213213
214214 let L = self . rg . instances . len ( ) ;
215215
@@ -260,26 +260,47 @@ where
260260 mles. push ( t1_mle) ;
261261
262262 let Mlen = M . len ( ) ;
263+
264+ // Pre-compute random-combinator powers
265+ let mut rcps = vec ! [ ] ;
266+ let mut rcp = R :: BaseRing :: ONE ;
267+ for _ in 0 ..L {
268+ // [tau, m_tau, f, h]
269+ for _ in 0 ..4 {
270+ rcps. push ( rcp) ;
271+ rcp *= rc;
272+ }
273+ for _ in 0 ..Mlen {
274+ // M_i * [tau, m_tau, f, h]
275+ for _ in 0 ..4 {
276+ rcps. push ( rcp) ;
277+ rcp *= rc;
278+ }
279+ }
280+ }
281+ rcps. push ( rcp) ; // t(0)
282+ rcp *= rc;
283+ rcps. push ( rcp) ; // t(1)
284+
263285 let comb_fn = |vals : & [ R ] | -> R {
264286 ( 0 ..L )
265287 . map ( |l| {
266288 let l_idx = 1 + l * ( 4 + 4 * Mlen ) ;
267289 vals[ 0 ] * ( // eq
268- vals[ l_idx] * rc . pow ( [ l_idx as u64 - 1 ] ) // tau
269- + vals[ l_idx + 1 ] * rc . pow ( [ l_idx as u64 ] ) // m_tau
270- + vals[ l_idx + 2 ] * rc . pow ( [ l_idx as u64 + 1 ] ) // f
271- + vals[ l_idx + 3 ] * rc . pow ( [ l_idx as u64 + 2 ] ) // h
290+ vals[ l_idx] * rcps [ l_idx - 1 ] // tau
291+ + vals[ l_idx + 1 ] * rcps [ l_idx] // m_tau
292+ + vals[ l_idx + 2 ] * rcps [ l_idx + 1 ] // f
293+ + vals[ l_idx + 3 ] * rcps [ l_idx + 2 ] // h
272294 + ( 0 ..Mlen ) . map ( |i| {
273295 let idx = l_idx + 4 + i * 4 ;
274- vals[ idx] * rc . pow ( [ idx as u64 - 1 ] ) // M_i * tau
275- + vals[ idx + 1 ] * rc . pow ( [ idx as u64 ] ) // M_i * m_tau
276- + vals[ idx + 2 ] * rc . pow ( [ idx as u64 + 1 ] ) // M_i * f
277- + vals[ idx + 3 ] * rc . pow ( [ idx as u64 + 2 ] ) // M_i * h
296+ vals[ idx] * rcps [ idx - 1 ] // M_i * tau
297+ + vals[ idx + 1 ] * rcps [ idx] // M_i * m_tau
298+ + vals[ idx + 2 ] * rcps [ idx + 1 ] // M_i * f
299+ + vals[ idx + 3 ] * rcps [ idx + 2 ] // M_i * h
278300 } ) . sum :: < R > ( )
279301 )
280- + ( vals[ l_idx] * vals[ vals. len ( ) -2 ] ) * rc. pow ( [ vals. len ( ) as u64 - 3 ] ) // t(0)
281- + ( vals[ l_idx] * vals[ vals. len ( ) -1 ] ) * rc. pow ( [ vals. len ( ) as u64 - 2 ] )
282- // t(1)
302+ + ( vals[ l_idx] * vals[ vals. len ( ) -2 ] ) * rcps[ vals. len ( ) - 3 ] // t(0)
303+ + ( vals[ l_idx] * vals[ vals. len ( ) -1 ] ) * rcps[ vals. len ( ) - 2 ] // t(1)
283304 } )
284305 . sum :: < R > ( )
285306 } ;
0 commit comments