Use Frobenius optimization in the circuit

This commit is contained in:
wborgeaud 2021-06-11 14:16:40 +02:00
parent bc7f67c316
commit 4b1f368e89
4 changed files with 28 additions and 19 deletions

View File

@ -32,8 +32,7 @@ impl<const D: usize> ExtensionTarget<D> {
res.try_into().unwrap()
}
// TODO: Implement this. See comment in `OEF::repeated_frobenius`.
fn repeated_frobenius<F: Extendable<D>>(
pub fn repeated_frobenius<F: Extendable<D>>(
&self,
k: usize,
builder: &mut CircuitBuilder<F, D>,

View File

@ -225,22 +225,20 @@ impl<F: Extendable<D>, const D: usize> CircuitBuilder<F, D> {
ev = self.mul_add_extension(a, e, ev);
}
let zeta_frob = zeta.frobenius(self);
let wire_evals_frob = os
let wire_eval = os.wires.iter().fold(self.zero_extension(), |acc, &w| {
let a = alpha_powers.next(self);
self.mul_add_extension(a, w, acc)
});
let mut alpha_powers_frob = alpha_powers.repeated_frobenius(D - 1, self);
let wire_eval_frob = os
.wires
.iter()
.map(|e| e.frobenius(self))
.collect::<Vec<_>>();
let mut ev_zeta = self.zero_extension();
for &t in &os.wires {
let a = alpha_powers.next(self);
ev_zeta = self.mul_add_extension(a, t, ev_zeta);
}
let mut ev_zeta_frob = self.zero_extension();
for &t in &wire_evals_frob {
let a = alpha_powers.next(self);
ev_zeta_right = self.mul_add_extension(a, t, ev_zeta);
}
let wires_interpol = self.interpolate2([(zeta, ev_zeta), (zeta_frob, ev_zeta_frob)]);
.fold(self.zero_extension(), |acc, &w| {
let a = alpha_powers_frob.next(self);
self.mul_add_extension(a, w, acc)
})
.frobenius(self);
let wires_interpol = self.interpolate2([(zeta, wire_eval), (zeta_frob, wire_eval_frob)]);
let interpol_val = wires_interpol.eval(self, subgroup_x);
let numerator = self.sub_extension(ev, interpol_val);
let vanish_frob = self.sub_extension(subgroup_x, zeta_frob);

View File

@ -199,10 +199,10 @@ fn fri_combine_initial<F: Field + Extendable<D>, const D: usize>(
.map(|(&e, a)| a * e.into())
.sum();
let zeta_frob = zeta.frobenius();
let ev_zeta = reduce_with_iter(&os.wires, alpha_powers.clone());
let wire_eval = reduce_with_iter(&os.wires, alpha_powers.clone());
let mut alpha_powers_frob = alpha_powers.repeated_frobenius(D - 1);
let ev_zeta_frob = reduce_with_iter(&os.wires, alpha_powers_frob).frobenius();
let wires_interpol = interpolant(&[(zeta, ev_zeta), (zeta_frob, ev_zeta_frob)]);
let wire_eval_frob = reduce_with_iter(&os.wires, alpha_powers_frob).frobenius();
let wires_interpol = interpolant(&[(zeta, wire_eval), (zeta_frob, wire_eval_frob)]);
let numerator = ev - wires_interpol.eval(subgroup_x);
let denominator = (subgroup_x - zeta) * (subgroup_x - zeta_frob);
sum += numerator / denominator;

View File

@ -338,6 +338,18 @@ impl<const D: usize> PowersTarget<D> {
self.current = builder.mul_extension(self.base, self.current);
result
}
pub fn repeated_frobenius<F: Extendable<D>>(
self,
k: usize,
builder: &mut CircuitBuilder<F, D>,
) -> Self {
let Self { base, current } = self;
Self {
base: base.repeated_frobenius(k, builder),
current: current.repeated_frobenius(k, builder),
}
}
}
impl<F: Extendable<D>, const D: usize> CircuitBuilder<F, D> {