Skip to content

Commit c716759

Browse files
Save Barycentric Weights in Bit Reverse Order
1 parent 5a792e4 commit c716759

File tree

2 files changed

+24
-20
lines changed

2 files changed

+24
-20
lines changed

crates/prover/src/core/backend/cpu/circle.rs

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -93,15 +93,13 @@ impl PolyOps for CpuBackend {
9393
}
9494

9595
fn weights(log_size: u32, sample_point: CirclePoint<SecureField>) -> Col<Self, SecureField> {
96-
// TODO(Gali): Change weights order to bit-reverse order.
97-
9896
let domain = CanonicCoset::new(log_size).circle_domain();
9997

10098
// If p is in the domain at position i, then w_j = δ_ij
10199
for i in 0..domain.size() {
102100
if domain.at(i).into_ef() == sample_point {
103101
let mut weights = vec![SecureField::zero(); domain.size()];
104-
weights[i] = SecureField::one();
102+
weights[bit_reverse_index(i, log_size)] = SecureField::one();
105103
return weights;
106104
}
107105
}
@@ -127,7 +125,9 @@ impl PolyOps for CpuBackend {
127125
let domain_points_vanishing_evaluated_at_point = (0..domain.size())
128126
.map(|i| {
129127
point_vanishing(
130-
domain.at(i).into_ef::<SecureField>(),
128+
domain
129+
.at(bit_reverse_index(i, log_size))
130+
.into_ef::<SecureField>(),
131131
sample_point.into_ef::<SecureField>(),
132132
)
133133
})
@@ -147,7 +147,7 @@ impl PolyOps for CpuBackend {
147147

148148
(0..domain.size())
149149
.map(|i| {
150-
if i < domain.half_coset.size() {
150+
if i % 2 == 0 {
151151
weights_first_half
152152
* inversed_domain_points_vanishing_evaluated_at_point[i]
153153
* coset_vanishing_evaluated_at_point
@@ -172,7 +172,7 @@ impl PolyOps for CpuBackend {
172172
}
173173

174174
(0..evals.domain.size()).fold(SecureField::zero(), |acc, i| {
175-
acc + (evals.values[bit_reverse_index(i, evals.domain.log_size())] * weights[i])
175+
acc + (evals.values[i] * weights[i])
176176
})
177177
}
178178

crates/prover/src/core/backend/simd/circle.rs

Lines changed: 18 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -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

Comments
 (0)