Change ExtensionTarget::frobenius to use 4 constants instead of 1.

This commit is contained in:
wborgeaud 2021-06-11 09:35:22 +02:00
parent bdf8417c28
commit 2cd99ff84c

View File

@ -19,15 +19,14 @@ impl<const D: usize> ExtensionTarget<D> {
pub fn frobenius<F: Extendable<D>>(&self, builder: &mut CircuitBuilder<F, D>) -> Self { pub fn frobenius<F: Extendable<D>>(&self, builder: &mut CircuitBuilder<F, D>) -> Self {
let arr = self.to_target_array(); let arr = self.to_target_array();
let k = (F::ORDER - 1) / (D as u64); let k = (F::ORDER - 1) / (D as u64);
let z0 = builder.constant(F::Extension::W.exp(k)); let zs = (0..D as u64).map(|i| builder.constant(F::Extension::W.exp(k * i)));
let mut z = builder.one();
let mut res = [builder.zero(); D]; let mut res = Vec::with_capacity(D);
for i in 0..D { for (z, a) in zs.zip(arr) {
res[i] = builder.mul(arr[i], z); res.push(builder.mul(z, a));
z = builder.mul(z, z0);
} }
Self(res) res.try_into().unwrap()
} }
pub fn from_range(gate: usize, range: Range<usize>) -> Self { pub fn from_range(gate: usize, range: Range<usize>) -> Self {