@@ -225,16 +225,14 @@ impl PolyOps for SimdBackend {
225225 }
226226
227227 fn weights ( log_size : u32 , sample_point : CirclePoint < SecureField > ) -> Col < Self , SecureField > {
228- // TODO(Gali): Change weights order to bit-reverse order.
229-
230228 let domain = CanonicCoset :: new ( log_size) . circle_domain ( ) ;
231229 let weights_vec_len = domain. size ( ) . div_ceil ( N_LANES ) ;
232230
233231 // If p is in the domain at position i, then w_j = δ_ij
234232 for i in 0 ..domain. size ( ) {
235233 if domain. at ( i) . into_ef ( ) == sample_point {
236234 let mut weights = Col :: < Self , SecureField > :: zeros ( domain. size ( ) ) ;
237- weights. set ( i , SecureField :: one ( ) ) ;
235+ weights. set ( bit_reverse_index ( i , log_size ) , SecureField :: one ( ) ) ;
238236 return weights;
239237 }
240238 }
@@ -260,11 +258,13 @@ impl PolyOps for SimdBackend {
260258 let domain_points_vanishing_evaluated_at_point = ( 0 ..weights_vec_len)
261259 . map ( |i| {
262260 PackedSecureField :: from_array ( std:: array:: from_fn ( |j| {
263- if domain. size ( ) <= i * N_LANES + j {
261+ if domain. size ( ) <= bit_reverse_index ( i * N_LANES + j, log_size ) {
264262 SecureField :: one ( )
265263 } else {
266264 point_vanishing (
267- domain. at ( i * N_LANES + j) . into_ef :: < SecureField > ( ) ,
265+ domain
266+ . at ( bit_reverse_index ( i * N_LANES + j, log_size) )
267+ . into_ef :: < SecureField > ( ) ,
268268 sample_point. into_ef :: < SecureField > ( ) ,
269269 )
270270 }
@@ -289,7 +289,7 @@ impl PolyOps for SimdBackend {
289289 . map ( |i| {
290290 let inversed_domain_points_vanishing_evaluated_at_point =
291291 inversed_domain_points_vanishing_evaluated_at_point[ 0 ] . to_array ( ) ;
292- if i < domain . size ( ) / 2 {
292+ if i % 2 == 0 {
293293 inversed_domain_points_vanishing_evaluated_at_point[ i]
294294 * ( weights_first_half * coset_vanishing_evaluated_at_point)
295295 } else {
@@ -300,15 +300,19 @@ impl PolyOps for SimdBackend {
300300 . collect ( ) ;
301301 }
302302
303- let weights: Col < Self , SecureField > = ( 0 ..weights_vec_len)
304- . map ( |i| {
305- if i < weights_vec_len / 2 {
306- inversed_domain_points_vanishing_evaluated_at_point[ i]
307- * ( weights_first_half * coset_vanishing_evaluated_at_point)
303+ let weights_half_and_half: PackedSecureField =
304+ PackedSecureField :: from_array ( std:: array:: from_fn ( |i| {
305+ if i % 2 == 0 {
306+ weights_first_half
308307 } else {
309- inversed_domain_points_vanishing_evaluated_at_point[ i]
310- * ( weights_second_half * coset_vanishing_evaluated_at_point)
308+ weights_second_half
311309 }
310+ } ) ) ;
311+ let weights: Col < Self , SecureField > = ( 0 ..weights_vec_len)
312+ . map ( |i| {
313+ inversed_domain_points_vanishing_evaluated_at_point[ i]
314+ * weights_half_and_half
315+ * coset_vanishing_evaluated_at_point
312316 } )
313317 . collect ( ) ;
314318
@@ -328,7 +332,7 @@ impl PolyOps for SimdBackend {
328332 . into ( ) ;
329333 }
330334 }
331- let evals = evals . clone ( ) . bit_reverse ( ) ;
335+
332336 if evals. domain . size ( ) < N_LANES {
333337 return ( 0 ..evals. domain . size ( ) ) . fold ( SecureField :: zero ( ) , |acc, i| {
334338 acc + ( weights. at ( i) * evals. values . at ( i) )
0 commit comments