Skip to content

Commit fe0bac6

Browse files
committed
avoid immutable borrow of copy-type BFieldElement
1 parent e736255 commit fe0bac6

File tree

2 files changed

+44
-45
lines changed

2 files changed

+44
-45
lines changed

twenty-first/benches/lagrange_interpolation.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -69,7 +69,7 @@ fn ntt_based_fast_interpolate(
6969
group.sample_size(10);
7070
group.throughput(Throughput::Elements(size as u64));
7171
group.bench_with_input(bench_id, &size, |b, _| {
72-
b.iter(|| polynomial::Polynomial::fast_interpolate(&xs, &ys, &omega, size))
72+
b.iter(|| polynomial::Polynomial::fast_interpolate(&xs, &ys, omega, size))
7373
});
7474
}
7575

@@ -87,7 +87,7 @@ fn ntt_based_fast_interpolate_batched(
8787
group.sample_size(10);
8888
group.throughput(Throughput::Elements(size as u64));
8989
group.bench_with_input(bench_id, &size, |b, _| {
90-
b.iter(|| polynomial::Polynomial::batch_fast_interpolate(&xs, &ys, &omega, size))
90+
b.iter(|| polynomial::Polynomial::batch_fast_interpolate(&xs, &ys, omega, size))
9191
});
9292
}
9393

twenty-first/src/shared_math/polynomial.rs

Lines changed: 42 additions & 43 deletions
Original file line numberDiff line numberDiff line change
@@ -143,7 +143,7 @@ where
143143
// Given a polynomial P(x), produce P'(x) := P(alpha * x). Evaluating P'(x)
144144
// then corresponds to evaluating P(alpha * x).
145145
#[must_use]
146-
pub fn scale(&self, &alpha: &BFieldElement) -> Self {
146+
pub fn scale(&self, alpha: BFieldElement) -> Self {
147147
let mut acc = FF::one();
148148
let mut return_coefficients = self.coefficients.clone();
149149
for elem in return_coefficients.iter_mut() {
@@ -263,7 +263,7 @@ where
263263
pub fn fast_multiply(
264264
lhs: &Self,
265265
rhs: &Self,
266-
primitive_root: &BFieldElement,
266+
primitive_root: BFieldElement,
267267
root_order: usize,
268268
) -> Self {
269269
assert!(
@@ -324,7 +324,7 @@ where
324324
}
325325

326326
// domain: polynomial roots
327-
pub fn fast_zerofier(domain: &[FF], primitive_root: &BFieldElement, root_order: usize) -> Self {
327+
pub fn fast_zerofier(domain: &[FF], primitive_root: BFieldElement, root_order: usize) -> Self {
328328
debug_assert_eq!(
329329
primitive_root.mod_pow_u32(root_order as u32),
330330
BFieldElement::one(),
@@ -364,7 +364,7 @@ where
364364
pub fn fast_evaluate(
365365
&self,
366366
domain: &[FF],
367-
primitive_root: &BFieldElement,
367+
primitive_root: BFieldElement,
368368
root_order: usize,
369369
) -> Vec<FF> {
370370
if domain.is_empty() {
@@ -398,7 +398,7 @@ where
398398
pub fn fast_interpolate(
399399
domain: &[FF],
400400
values: &[FF],
401-
primitive_root: &BFieldElement,
401+
primitive_root: BFieldElement,
402402
root_order: usize,
403403
) -> Self {
404404
assert_eq!(
@@ -470,7 +470,7 @@ where
470470
pub fn batch_fast_interpolate(
471471
domain: &[FF],
472472
values_matrix: &Vec<Vec<FF>>,
473-
primitive_root: &BFieldElement,
473+
primitive_root: BFieldElement,
474474
root_order: usize,
475475
) -> Vec<Self> {
476476
debug_assert_eq!(
@@ -502,7 +502,7 @@ where
502502
fn batch_fast_interpolate_with_memoization(
503503
domain: &[FF],
504504
values_matrix: &Vec<Vec<FF>>,
505-
primitive_root: &BFieldElement,
505+
primitive_root: BFieldElement,
506506
root_order: usize,
507507
zerofier_dictionary: &mut HashMap<(FF, FF), Polynomial<FF>>,
508508
offset_inverse_dictionary: &mut HashMap<(FF, FF), Vec<FF>>,
@@ -638,7 +638,7 @@ where
638638
/// Fast evaluate on a coset domain, which is the group generated by `generator^i * offset`
639639
pub fn fast_coset_evaluate(
640640
&self,
641-
offset: &BFieldElement,
641+
offset: BFieldElement,
642642
generator: BFieldElement,
643643
order: usize,
644644
) -> Vec<FF> {
@@ -651,7 +651,7 @@ where
651651

652652
/// The inverse of `fast_coset_evaluate`
653653
pub fn fast_coset_interpolate(
654-
offset: &BFieldElement,
654+
offset: BFieldElement,
655655
generator: BFieldElement,
656656
values: &[FF],
657657
) -> Self {
@@ -664,7 +664,7 @@ where
664664
);
665665
let poly = Polynomial::new(mut_values);
666666

667-
poly.scale(&offset.inverse())
667+
poly.scale(offset.inverse())
668668
}
669669

670670
/// Divide two polynomials under the homomorphism of evaluation for a N^2 -> N*log(N) speedup
@@ -714,10 +714,10 @@ where
714714
order /= 2;
715715
}
716716

717-
let mut scaled_lhs_coefficients: Vec<FF> = lhs.scale(&offset).coefficients;
717+
let mut scaled_lhs_coefficients: Vec<FF> = lhs.scale(offset).coefficients;
718718
scaled_lhs_coefficients.append(&mut vec![zero; order - scaled_lhs_coefficients.len()]);
719719

720-
let mut scaled_rhs_coefficients: Vec<FF> = rhs.scale(&offset).coefficients;
720+
let mut scaled_rhs_coefficients: Vec<FF> = rhs.scale(offset).coefficients;
721721
scaled_rhs_coefficients.append(&mut vec![zero; order - scaled_rhs_coefficients.len()]);
722722

723723
let lhs_log_2_of_n = log_2_floor(scaled_lhs_coefficients.len() as u128) as u32;
@@ -740,7 +740,7 @@ where
740740
coefficients: quotient_codeword,
741741
};
742742

743-
scaled_quotient.scale(&offset.inverse())
743+
scaled_quotient.scale(offset.inverse())
744744
}
745745
}
746746

@@ -2215,45 +2215,45 @@ mod test_polynomials {
22152215
BFieldElement::from(17u64),
22162216
],
22172217
};
2218-
let c_fast = Polynomial::fast_multiply(&a, &b, &primitive_root, 32);
2218+
let c_fast = Polynomial::fast_multiply(&a, &b, primitive_root, 32);
22192219
let c_normal = a.clone() * b.clone();
22202220
println!("c_normal = {c_normal}");
22212221
println!("c_fast = {c_fast}");
22222222
assert_eq!(c_normal, c_fast);
22232223
assert_eq!(
22242224
Polynomial::zero(),
2225-
Polynomial::fast_multiply(&Polynomial::zero(), &b, &primitive_root, 32)
2225+
Polynomial::fast_multiply(&Polynomial::zero(), &b, primitive_root, 32)
22262226
);
22272227
assert_eq!(
22282228
Polynomial::zero(),
2229-
Polynomial::fast_multiply(&a, &Polynomial::zero(), &primitive_root, 32)
2229+
Polynomial::fast_multiply(&a, &Polynomial::zero(), primitive_root, 32)
22302230
);
22312231

22322232
let one: Polynomial<BFieldElement> = Polynomial {
22332233
coefficients: vec![BFieldElement::from(1u64)],
22342234
};
2235-
assert_eq!(a, Polynomial::fast_multiply(&a, &one, &primitive_root, 32));
2236-
assert_eq!(a, Polynomial::fast_multiply(&one, &a, &primitive_root, 32));
2237-
assert_eq!(b, Polynomial::fast_multiply(&b, &one, &primitive_root, 32));
2238-
assert_eq!(b, Polynomial::fast_multiply(&one, &b, &primitive_root, 32));
2235+
assert_eq!(a, Polynomial::fast_multiply(&a, &one, primitive_root, 32));
2236+
assert_eq!(a, Polynomial::fast_multiply(&one, &a, primitive_root, 32));
2237+
assert_eq!(b, Polynomial::fast_multiply(&b, &one, primitive_root, 32));
2238+
assert_eq!(b, Polynomial::fast_multiply(&one, &b, primitive_root, 32));
22392239
let x: Polynomial<BFieldElement> = Polynomial {
22402240
coefficients: vec![BFieldElement::from(0u64), BFieldElement::from(1u64)],
22412241
};
22422242
assert_eq!(
22432243
a.shift_coefficients(1),
2244-
Polynomial::fast_multiply(&x, &a, &primitive_root, 32)
2244+
Polynomial::fast_multiply(&x, &a, primitive_root, 32)
22452245
);
22462246
assert_eq!(
22472247
a.shift_coefficients(1),
2248-
Polynomial::fast_multiply(&a, &x, &primitive_root, 32)
2248+
Polynomial::fast_multiply(&a, &x, primitive_root, 32)
22492249
);
22502250
assert_eq!(
22512251
b.shift_coefficients(1),
2252-
Polynomial::fast_multiply(&x, &b, &primitive_root, 32)
2252+
Polynomial::fast_multiply(&x, &b, primitive_root, 32)
22532253
);
22542254
assert_eq!(
22552255
b.shift_coefficients(1),
2256-
Polynomial::fast_multiply(&b, &x, &primitive_root, 32)
2256+
Polynomial::fast_multiply(&b, &x, primitive_root, 32)
22572257
);
22582258
}
22592259

@@ -2264,7 +2264,7 @@ mod test_polynomials {
22642264
let root_order: usize = 8;
22652265
let omega = BFieldElement::primitive_root_of_unity(root_order as u64).unwrap();
22662266
let domain = vec![_1_17, _5_17];
2267-
let actual = Polynomial::<BFieldElement>::fast_zerofier(&domain, &omega, root_order);
2267+
let actual = Polynomial::<BFieldElement>::fast_zerofier(&domain, omega, root_order);
22682268
assert!(
22692269
actual.evaluate(&_1_17).is_zero(),
22702270
"expecting {actual} = 0 when x = 1"
@@ -2283,7 +2283,7 @@ mod test_polynomials {
22832283
let root_order_2 = 16;
22842284
let omega2 = BFieldElement::primitive_root_of_unity(root_order_2 as u64).unwrap();
22852285
let domain_2 = vec![_7_17, _10_17];
2286-
let actual_2 = Polynomial::<BFieldElement>::fast_zerofier(&domain_2, &omega2, root_order_2);
2286+
let actual_2 = Polynomial::<BFieldElement>::fast_zerofier(&domain_2, omega2, root_order_2);
22872287
assert!(
22882288
actual_2.evaluate(&_7_17).is_zero(),
22892289
"expecting {actual_2} = 0 when x = 7"
@@ -2316,7 +2316,7 @@ mod test_polynomials {
23162316
let omega = maybe_omega.unwrap();
23172317

23182318
// compute zerofier
2319-
let zerofier = Polynomial::<BFieldElement>::fast_zerofier(&domain, &omega, order);
2319+
let zerofier = Polynomial::<BFieldElement>::fast_zerofier(&domain, omega, order);
23202320

23212321
// evaluate in all domain points and match against zero
23222322
for d in domain.iter() {
@@ -2353,7 +2353,7 @@ mod test_polynomials {
23532353
let _12_17 = BFieldElement::from(12u64);
23542354
let domain = vec![_6_17, _12_17];
23552355

2356-
let actual = poly.fast_evaluate(&domain, &omega, 16);
2356+
let actual = poly.fast_evaluate(&domain, omega, 16);
23572357
let expected_6 = _6_17.mod_pow(5u64) + _6_17.mod_pow(3u64);
23582358
assert_eq!(expected_6, actual[0]);
23592359

@@ -2391,7 +2391,7 @@ mod test_polynomials {
23912391
let omega = maybe_omega.unwrap();
23922392

23932393
// fast evaluate
2394-
let fast_eval = poly.fast_evaluate(&domain, &omega, order);
2394+
let fast_eval = poly.fast_evaluate(&domain, omega, order);
23952395

23962396
// match evaluations
23972397
assert_eq!(slow_eval, fast_eval);
@@ -2414,12 +2414,12 @@ mod test_polynomials {
24142414
let _9_17 = BFieldElement::from(9u64);
24152415
let domain = vec![_6_17, _7_17, _8_17, _9_17];
24162416

2417-
let evals = poly.fast_evaluate(&domain, &omega, 4);
2418-
let reinterp = Polynomial::fast_interpolate(&domain, &evals, &omega, 4);
2417+
let evals = poly.fast_evaluate(&domain, omega, 4);
2418+
let reinterp = Polynomial::fast_interpolate(&domain, &evals, omega, 4);
24192419
assert_eq!(poly, reinterp);
24202420

24212421
let reinterps_batch: Vec<Polynomial<BFieldElement>> =
2422-
Polynomial::batch_fast_interpolate(&domain, &vec![evals], &omega, 4);
2422+
Polynomial::batch_fast_interpolate(&domain, &vec![evals], omega, 4);
24232423
assert_eq!(poly, reinterps_batch[0]);
24242424
}
24252425

@@ -2432,8 +2432,7 @@ mod test_polynomials {
24322432
let omega = BFieldElement::primitive_root_of_unity(order_of_omega as u64).unwrap();
24332433

24342434
// Unbatched fast interpolation
2435-
let interpolant =
2436-
Polynomial::fast_interpolate(&domain, &values, &omega, order_of_omega);
2435+
let interpolant = Polynomial::fast_interpolate(&domain, &values, omega, order_of_omega);
24372436

24382437
for (x, y) in domain.iter().zip(values) {
24392438
assert_eq!(y, interpolant.evaluate(x));
@@ -2449,7 +2448,7 @@ mod test_polynomials {
24492448
];
24502449

24512450
let batch_interpolated =
2452-
Polynomial::batch_fast_interpolate(&domain, &values_vec, &omega, order_of_omega);
2451+
Polynomial::batch_fast_interpolate(&domain, &values_vec, omega, order_of_omega);
24532452
for (y_values, interpolant_from_batch_function) in
24542453
values_vec.into_iter().zip(batch_interpolated.into_iter())
24552454
{
@@ -2499,10 +2498,10 @@ mod test_polynomials {
24992498

25002499
// use NTT-based interpolation
25012500
let interpolant =
2502-
Polynomial::<BFieldElement>::fast_interpolate(&domain, &values, &omega, order);
2501+
Polynomial::<BFieldElement>::fast_interpolate(&domain, &values, omega, order);
25032502

25042503
// re-evaluate and match against sampled values
2505-
let re_eval = interpolant.fast_evaluate(&domain, &omega, order);
2504+
let re_eval = interpolant.fast_evaluate(&domain, omega, order);
25062505
for (v, r) in values.iter().zip(re_eval.iter()) {
25072506
assert_eq!(v, r);
25082507
}
@@ -2514,7 +2513,7 @@ mod test_polynomials {
25142513
let batched_interpolants = Polynomial::<BFieldElement>::batch_fast_interpolate(
25152514
&domain,
25162515
&vec![values],
2517-
&omega,
2516+
omega,
25182517
order,
25192518
);
25202519

@@ -2535,18 +2534,18 @@ mod test_polynomials {
25352534
let offset = BFieldElement::generator();
25362535
let omega = BFieldElement::primitive_root_of_unity(8).unwrap();
25372536

2538-
let values = poly.fast_coset_evaluate(&offset, omega, 8);
2537+
let values = poly.fast_coset_evaluate(offset, omega, 8);
25392538

25402539
let mut domain = vec![_0; 8];
25412540
domain[0] = offset;
25422541
for i in 1..8 {
25432542
domain[i] = domain[i - 1].to_owned() * omega.to_owned();
25442543
}
25452544

2546-
let reinterp = Polynomial::fast_interpolate(&domain, &values, &omega, 8);
2545+
let reinterp = Polynomial::fast_interpolate(&domain, &values, omega, 8);
25472546
assert_eq!(reinterp, poly);
25482547

2549-
let poly_interpolated = Polynomial::fast_coset_interpolate(&offset, omega, &values);
2548+
let poly_interpolated = Polynomial::fast_coset_interpolate(offset, omega, &values);
25502549
assert_eq!(poly, poly_interpolated);
25512550
}
25522551

@@ -2583,7 +2582,7 @@ mod test_polynomials {
25832582
BFieldElement::from(17u64),
25842583
],
25852584
};
2586-
let c_fast = Polynomial::fast_multiply(&a, &b, &primitive_root, 32);
2585+
let c_fast = Polynomial::fast_multiply(&a, &b, primitive_root, 32);
25872586

25882587
let mut quotient = Polynomial::fast_coset_divide(&c_fast, &b, offset, primitive_root, 32);
25892588
assert_eq!(a, quotient);
@@ -3011,7 +3010,7 @@ mod test_polynomials {
30113010
let omega = BFieldElement::primitive_root_of_unity(next_po2 as u64).unwrap();
30123011

30133012
let fast_zerofier_polynomial =
3014-
Polynomial::<BFieldElement>::fast_zerofier(&domain, &omega, next_po2);
3013+
Polynomial::<BFieldElement>::fast_zerofier(&domain, omega, next_po2);
30153014

30163015
assert_eq!(zerofier_polynomial, fast_zerofier_polynomial);
30173016
}

0 commit comments

Comments
 (0)