Fix CTL verification

This commit is contained in:
wborgeaud 2022-06-16 02:06:15 +02:00
parent 7cbce7bf6d
commit 29f750ed51

View File

@ -561,26 +561,29 @@ pub(crate) fn verify_cross_table_lookups<
}, },
) in cross_table_lookups.into_iter().enumerate() ) in cross_table_lookups.into_iter().enumerate()
{ {
let looking_degrees_sum = looking_tables for _ in 0..config.num_challenges {
.iter() let looking_degrees_sum = looking_tables
.map(|table| 1 << degrees_bits[table.table as usize]) .iter()
.sum::<u64>(); .map(|table| 1 << degrees_bits[table.table as usize])
let looked_degree = 1 << degrees_bits[looked_table.table as usize]; .sum::<u64>();
let looking_zs_prod = looking_tables let looked_degree = 1 << degrees_bits[looked_table.table as usize];
.into_iter() let looking_zs_prod = looking_tables
.map(|table| *ctl_zs_openings[table.table as usize].next().unwrap()) .iter()
.product::<F>(); .map(|table| *ctl_zs_openings[table.table as usize].next().unwrap())
let looked_z = *ctl_zs_openings[looked_table.table as usize].next().unwrap(); .product::<F>();
let challenge = challenges.challenges[i % config.num_challenges]; let looked_z = *ctl_zs_openings[looked_table.table as usize].next().unwrap();
let combined_default = default let challenge = challenges.challenges[i % config.num_challenges];
.map(|default| challenge.combine(default.iter())) let combined_default = default
.unwrap_or(F::ONE); .as_ref()
.map(|default| challenge.combine(default.iter()))
.unwrap_or(F::ONE);
ensure!( ensure!(
looking_zs_prod looking_zs_prod
== looked_z * combined_default.exp_u64(looking_degrees_sum - looked_degree), == looked_z * combined_default.exp_u64(looking_degrees_sum - looked_degree),
"Cross-table lookup verification failed." "Cross-table lookup verification failed."
); );
}
} }
Ok(()) Ok(())
@ -615,30 +618,32 @@ pub(crate) fn verify_cross_table_lookups_circuit<
}, },
) in cross_table_lookups.into_iter().enumerate() ) in cross_table_lookups.into_iter().enumerate()
{ {
let looking_degrees_sum = looking_tables for _ in 0..inner_config.num_challenges {
.iter() let looking_degrees_sum = looking_tables
.map(|table| 1 << degrees_bits[table.table as usize]) .iter()
.sum::<u64>(); .map(|table| 1 << degrees_bits[table.table as usize])
let looked_degree = 1 << degrees_bits[looked_table.table as usize]; .sum::<u64>();
let looking_zs_prod = builder.mul_many( let looked_degree = 1 << degrees_bits[looked_table.table as usize];
looking_tables let looking_zs_prod = builder.mul_many(
.into_iter() looking_tables
.map(|table| *ctl_zs_openings[table.table as usize].next().unwrap()), .iter()
); .map(|table| *ctl_zs_openings[table.table as usize].next().unwrap()),
let looked_z = *ctl_zs_openings[looked_table.table as usize].next().unwrap(); );
let challenge = challenges.challenges[i % inner_config.num_challenges]; let looked_z = *ctl_zs_openings[looked_table.table as usize].next().unwrap();
if let Some(default) = default { let challenge = challenges.challenges[i % inner_config.num_challenges];
let default = default if let Some(default) = default.as_ref() {
.into_iter() let default = default
.map(|x| builder.constant(x)) .iter()
.collect::<Vec<_>>(); .map(|&x| builder.constant(x))
let combined_default = challenge.combine_base_circuit(builder, &default); .collect::<Vec<_>>();
let combined_default = challenge.combine_base_circuit(builder, &default);
let pad = builder.exp_u64(combined_default, looking_degrees_sum - looked_degree); let pad = builder.exp_u64(combined_default, looking_degrees_sum - looked_degree);
let padded_looked_z = builder.mul(looked_z, pad); let padded_looked_z = builder.mul(looked_z, pad);
builder.connect(looking_zs_prod, padded_looked_z); builder.connect(looking_zs_prod, padded_looked_z);
} else { } else {
builder.connect(looking_zs_prod, looked_z); builder.connect(looking_zs_prod, looked_z);
}
} }
} }
} }