diff --git a/src/field/extension_field/target.rs b/src/field/extension_field/target.rs index aa5bce7f..2123079d 100644 --- a/src/field/extension_field/target.rs +++ b/src/field/extension_field/target.rs @@ -4,6 +4,7 @@ use crate::field::extension_field::{Extendable, FieldExtension, OEF}; use crate::field::field::Field; use crate::gates::mul_extension::MulExtensionGate; use crate::target::Target; +use num::traits::real::Real; use std::convert::{TryFrom, TryInto}; use std::ops::Range; @@ -37,7 +38,25 @@ impl ExtensionTarget { k: usize, builder: &mut CircuitBuilder, ) -> Self { - todo!() + let arr = self.to_target_array(); + let z0 = match D { + 2 => F::Extension::W.exp(F::FROBENIUS_CONSTANTS_2[k - 1]), + 3 => F::Extension::W.exp(F::FROBENIUS_CONSTANTS_3[k - 1]), + 4 => F::Extension::W.exp(F::FROBENIUS_CONSTANTS_4[k - 1]), + _ => unimplemented!("Only extensions of degree 2, 3, or 4 are allowed for now."), + }; + let zs = z0 + .powers() + .take(D) + .map(|z| builder.constant(z)) + .collect::>(); + + let mut res = Vec::with_capacity(D); + for (z, a) in zs.into_iter().zip(arr) { + res.push(builder.mul(z, a)); + } + + res.try_into().unwrap() } pub fn from_range(gate: usize, range: Range) -> Self { diff --git a/src/field/field.rs b/src/field/field.rs index 8a652a0a..88c12dae 100644 --- a/src/field/field.rs +++ b/src/field/field.rs @@ -294,7 +294,7 @@ impl Powers { let Self { base, current } = self; Self { base: base.repeated_frobenius(k), - current: base.repeated_frobenius(k), + current: current.repeated_frobenius(k), } } }