in air/src/air/mod.rs [207:241]
fn get_periodic_column_polys(&self) -> Vec<Vec<Self::BaseField>> {
// cache inverse twiddles for each cycle length so that we don't have to re-build them
// for columns with identical cycle lengths
let mut twiddle_map = BTreeMap::new();
// iterate over all periodic columns and convert column values into polynomials
self.get_periodic_column_values()
.into_iter()
.map(|mut column| {
let cycle_length = column.len();
assert!(
cycle_length >= MIN_CYCLE_LENGTH,
"number of values in a periodic column must be at least {}, but was {}",
MIN_CYCLE_LENGTH,
cycle_length
);
assert!(
cycle_length.is_power_of_two(),
"number of values in a periodic column must be a power of two, but was {}",
cycle_length
);
assert!(cycle_length <= self.trace_length(),
"number of values in a periodic column cannot exceed trace length {}, but was {}",
self.trace_length(),
cycle_length
);
// get twiddles for interpolation and interpolate values into a polynomial
let inv_twiddles = twiddle_map
.entry(cycle_length)
.or_insert_with(|| fft::get_inv_twiddles::<Self::BaseField>(cycle_length));
fft::interpolate_poly(&mut column, inv_twiddles);
column
})
.collect()
}