From a11d2ed36be044162fa3bf8fda7208dbda51ac92 Mon Sep 17 00:00:00 2001 From: wborgeaud Date: Mon, 24 May 2021 22:04:06 +0200 Subject: [PATCH] Fixes based on PR comments --- src/field/extension_field/mod.rs | 10 +++++++++- src/field/extension_field/quadratic.rs | 8 +++----- src/field/extension_field/quartic.rs | 12 ++++++------ src/field/extension_field/target.rs | 4 ++-- 4 files changed, 20 insertions(+), 14 deletions(-) diff --git a/src/field/extension_field/mod.rs b/src/field/extension_field/mod.rs index 89263916..46c99f11 100644 --- a/src/field/extension_field/mod.rs +++ b/src/field/extension_field/mod.rs @@ -28,8 +28,16 @@ pub trait OEF: FieldExtension { } } +impl OEF<1> for F { + const W: Self::BaseField = F::ZERO; +} + pub trait Extendable: Sized { - type Extension: Field + FieldExtension + OEF + From; + type Extension: Field + OEF + From; +} + +impl Extendable<1> for F { + type Extension = F; } pub trait FieldExtension: Field { diff --git a/src/field/extension_field/quadratic.rs b/src/field/extension_field/quadratic.rs index ac910278..fc74ec88 100644 --- a/src/field/extension_field/quadratic.rs +++ b/src/field/extension_field/quadratic.rs @@ -1,8 +1,6 @@ -use crate::circuit_builder::CircuitBuilder; use crate::field::crandall_field::CrandallField; use crate::field::extension_field::{FieldExtension, OEF}; use crate::field::field::Field; -use crate::target::Target; use rand::Rng; use std::fmt::{Debug, Display, Formatter}; use std::hash::{Hash, Hasher}; @@ -82,7 +80,7 @@ impl Field for QuadraticCrandallField { return None; } - let a_pow_r_minus_1 = self.frobenius(); + let a_pow_r_minus_1 = OEF::<2>::frobenius(self); let a_pow_r = a_pow_r_minus_1 * *self; debug_assert!(FieldExtension::<2>::is_in_basefield(&a_pow_r)); @@ -171,7 +169,7 @@ impl Mul for QuadraticCrandallField { let Self([a0, a1]) = self; let Self([b0, b1]) = rhs; - let c0 = a0 * b0 + Self::W * a1 * b1; + let c0 = a0 * b0 + >::W * a1 * b1; let c1 = a0 * b1 + a1 * b0; Self([c0, c1]) @@ -250,7 +248,7 @@ mod tests { let x = F::rand(); assert_eq!( x.exp(>::BaseField::ORDER), - x.frobenius() + OEF::<2>::frobenius(&x) ); } diff --git a/src/field/extension_field/quartic.rs b/src/field/extension_field/quartic.rs index c69e365d..f1791d0e 100644 --- a/src/field/extension_field/quartic.rs +++ b/src/field/extension_field/quartic.rs @@ -106,9 +106,9 @@ impl Field for QuarticCrandallField { return None; } - let a_pow_p = self.frobenius(); + let a_pow_p = OEF::<4>::frobenius(self); let a_pow_p_plus_1 = a_pow_p * *self; - let a_pow_p3_plus_p2 = a_pow_p_plus_1.frobenius().frobenius(); + let a_pow_p3_plus_p2 = OEF::<4>::frobenius(&OEF::<4>::frobenius(&a_pow_p_plus_1)); let a_pow_r_minus_1 = a_pow_p3_plus_p2 * a_pow_p; let a_pow_r = a_pow_r_minus_1 * *self; debug_assert!(FieldExtension::<4>::is_in_basefield(&a_pow_r)); @@ -214,9 +214,9 @@ impl Mul for QuarticCrandallField { let Self([a0, a1, a2, a3]) = self; let Self([b0, b1, b2, b3]) = rhs; - let c0 = a0 * b0 + Self::W * (a1 * b3 + a2 * b2 + a3 * b1); - let c1 = a0 * b1 + a1 * b0 + Self::W * (a2 * b3 + a3 * b2); - let c2 = a0 * b2 + a1 * b1 + a2 * b0 + Self::W * a3 * b3; + let c0 = a0 * b0 + >::W * (a1 * b3 + a2 * b2 + a3 * b1); + let c1 = a0 * b1 + a1 * b0 + >::W * (a2 * b3 + a3 * b2); + let c2 = a0 * b2 + a1 * b1 + a2 * b0 + >::W * a3 * b3; let c3 = a0 * b3 + a1 * b2 + a2 * b1 + a3 * b0; Self([c0, c1, c2, c3]) @@ -308,7 +308,7 @@ mod tests { let x = F::rand(); assert_eq!( exp_naive(x, >::BaseField::ORDER as u128), - x.frobenius() + OEF::<4>::frobenius(&x) ); } diff --git a/src/field/extension_field/target.rs b/src/field/extension_field/target.rs index 861baaf5..1927e0d1 100644 --- a/src/field/extension_field/target.rs +++ b/src/field/extension_field/target.rs @@ -63,8 +63,8 @@ impl CircuitBuilder { 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) + let tmp = self.mul(a.0[i], b.0[j]); + self.mul_add(w, tmp, res[(i + j) % D]) } } }