Skip to content

Commit cae69c5

Browse files
Dori/bitreverse permutation public (#960)
* refactor: share bitreverse permutation code Signed-off-by: Dori Medini <dori@starkware.co> * feat: export bitreverse_permutation_in_place for public use Signed-off-by: Dori Medini <dori@starkware.co> * chore: added entry to changelog Signed-off-by: Dori Medini <dori@starkware.co> --------- Signed-off-by: Dori Medini <dori@starkware.co>
1 parent 263cdb7 commit cae69c5

File tree

4 files changed

+18
-15
lines changed

4 files changed

+18
-15
lines changed

CHANGELOG.md

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,8 @@
22

33
## Pending
44

5+
- Consolidated logic into `bitreverse_permutation_in_place` and made it public.
6+
57
### Breaking changes
68

79
### Features

poly/src/domain/mixed_radix.rs

Lines changed: 2 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@
1212
1313
pub use crate::domain::utils::Elements;
1414
use crate::domain::{
15-
utils::{best_fft, bitreverse},
15+
utils::{best_fft, bitreverse_permutation_in_place},
1616
DomainCoeff, EvaluationDomain,
1717
};
1818
use ark_ff::{fields::utils::k_adicity, FftField};
@@ -354,13 +354,7 @@ pub(crate) fn serial_mixed_radix_fft<T: DomainCoeff<F>, F: FftField>(
354354
m *= q;
355355
}
356356
} else {
357-
// swapping in place (from Storer's book)
358-
for k in 0..n {
359-
let rk = bitreverse(k as u32, two_adicity) as usize;
360-
if k < rk {
361-
a.swap(k, rk);
362-
}
363-
}
357+
bitreverse_permutation_in_place(a, two_adicity);
364358
}
365359

366360
for _ in 0..two_adicity {

poly/src/domain/radix2/mod.rs

Lines changed: 2 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@
44
//!
55
//! `Radix2EvaluationDomain` supports FFTs of size at most `2^F::TWO_ADICITY`.
66
7-
pub use crate::domain::utils::Elements;
7+
pub use crate::domain::utils::{bitreverse_permutation_in_place, Elements};
88
use crate::domain::{DomainCoeff, EvaluationDomain};
99
use ark_ff::FftField;
1010
use ark_serialize::{CanonicalDeserialize, CanonicalSerialize};
@@ -442,12 +442,7 @@ mod tests {
442442
assert_eq!(n, 1 << log_n);
443443

444444
// swap coefficients in place
445-
for k in 0..n {
446-
let rk = crate::domain::utils::bitreverse(k, log_n);
447-
if k < rk {
448-
a.swap(rk as usize, k as usize);
449-
}
450-
}
445+
crate::domain::utils::bitreverse_permutation_in_place(a, log_n);
451446

452447
let mut m = 1;
453448
for _i in 1..=log_n {

poly/src/domain/utils.rs

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,18 @@ pub(crate) fn bitreverse(mut n: u32, l: u32) -> u32 {
1919
r
2020
}
2121

22+
#[inline]
23+
pub fn bitreverse_permutation_in_place<T>(a: &mut [T], width: u32) {
24+
// swapping in place (from Storer's book)
25+
let n = a.len();
26+
for k in 0..n {
27+
let rk = bitreverse(k as u32, width) as usize;
28+
if k < rk {
29+
a.swap(k, rk);
30+
}
31+
}
32+
}
33+
2234
pub(crate) fn compute_powers_serial<F: Field>(size: usize, root: F) -> Vec<F> {
2335
compute_powers_and_mul_by_const_serial(size, root, F::one())
2436
}

0 commit comments

Comments
 (0)