fn gen_trace(log_size: u32) -> Vec<CircleEvaluation<SimdBackend, M31, BitReversedOrder>> {
let mut rng = rand::thread_rng();
let values = (0..(1 << log_size)).map(|i| i).collect::<Vec<_>>();
// Create a random permutation of the values
let mut random_values = values.clone();
random_values.shuffle(&mut rng);
let random_col_1 = BaseColumn::from_iter(random_values.iter().map(|v| M31::from(*v)));
// Create another random permutation of the values
let mut random_values = random_values.clone();
random_values.shuffle(&mut rng);
let random_col_2 = BaseColumn::from_iter(random_values.iter().map(|v| M31::from(*v)));
// Convert table to trace polynomials
let domain = CanonicCoset::new(log_size).circle_domain();
vec![random_col_1, random_col_2]
.into_iter()
.map(|col| CircleEvaluation::new(domain, col))
.collect()
}
fn gen_logup_trace(
log_size: u32,
random_col_1: &BaseColumn,
random_col_2: &BaseColumn,
lookup_elements: &LookupElements,
) -> (
Vec<CircleEvaluation<SimdBackend, M31, BitReversedOrder>>,
SecureField,
) {
let mut logup_gen = LogupTraceGenerator::new(log_size);
let mut col_gen = logup_gen.new_col();
for row in 0..(1 << (log_size - LOG_N_LANES)) {
// 1 / random - 1 / ordered = (ordered - random) / (random * ordered)
let random_val: PackedSecureField = lookup_elements.combine(&[random_col_1.data[row]]);
let ordered_val: PackedSecureField = lookup_elements.combine(&[random_col_2.data[row]]);
col_gen.write_frac(row, ordered_val - random_val, random_val * ordered_val);
}
col_gen.finalize_col();
logup_gen.finalize_last()
}
fn main() {
...
// Create and commit to the trace columns
let trace = gen_trace(log_size);
let mut tree_builder = commitment_scheme.tree_builder();
tree_builder.extend_evals(trace.clone());
tree_builder.commit(channel);
// Draw random elements to use when creating the random linear combination of lookup values in the LogUp columns
let lookup_elements = LookupElements::draw(channel);
// Create and commit to the LogUp columns
let (logup_cols, claimed_sum) =
gen_logup_trace(log_size, &trace[0], &trace[1], &lookup_elements);
let mut tree_builder = commitment_scheme.tree_builder();
tree_builder.extend_evals(logup_cols);
tree_builder.commit(channel);
...
}