mirror of
https://github.com/logos-storage/plonky2.git
synced 2026-01-04 23:03:08 +00:00
Use Frobenius optimization in the circuit
This commit is contained in:
parent
bc7f67c316
commit
4b1f368e89
@ -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>,
|
||||
|
||||
@ -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);
|
||||
|
||||
@ -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;
|
||||
|
||||
@ -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> {
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user