diff --git a/src/field/extension_field/mod.rs b/src/field/extension_field/mod.rs index 122c9416..10a577db 100644 --- a/src/field/extension_field/mod.rs +++ b/src/field/extension_field/mod.rs @@ -2,6 +2,7 @@ use crate::field::field::Field; pub mod quadratic; pub mod quartic; +pub mod target; /// Optimal extension field trait. /// A degree `d` field extension is optimal if there exists a base field element `W`, @@ -27,11 +28,7 @@ pub trait OEF: FieldExtension { } pub trait Extendable: Sized { - type Extension: Field + FieldExtension + From; -} - -impl Extendable<1> for F { - type Extension = Self; + type Extension: Field + FieldExtension + OEF + From; } pub trait FieldExtension: Field { diff --git a/src/field/extension_field/target.rs b/src/field/extension_field/target.rs index 32111f7f..6ca84a24 100644 --- a/src/field/extension_field/target.rs +++ b/src/field/extension_field/target.rs @@ -1,14 +1,46 @@ use crate::circuit_builder::CircuitBuilder; -use crate::field::extension_field::{Extendable, FieldExtension}; +use crate::field::extension_field::{Extendable, FieldExtension, OEF}; use crate::field::field::Field; use crate::target::Target; +#[derive(Copy, Clone, Debug)] pub struct ExtensionTarget([Target; D]); impl CircuitBuilder { - pub fn mul_extension(a: ExtensionTarget, b: ExtensionTarget) -> () + pub fn add_extension( + &mut self, + mut a: ExtensionTarget, + b: ExtensionTarget, + ) -> ExtensionTarget where F: Extendable, { + for i in 0..D { + a.0[i] = self.add(a.0[i], b.0[i]); + } + a + } + + pub fn mul_extension( + &mut self, + a: ExtensionTarget, + b: ExtensionTarget, + ) -> ExtensionTarget + where + F: Extendable, + { + let w = self.constant(F::Extension::W); + let mut res = [self.zero(); D]; + for i in 0..D { + for j in 0..D { + res[(i + j) % D] = if i + j < D { + self.mul_add(a.0[i], b.0[j], res[(i + j) % D]) + } else { + let tmp = self.mul_add(a.0[i], b.0[j], res[(i + j) % D]); + self.mul(w, tmp) + } + } + } + ExtensionTarget(res) } }