diff --git a/src/finite_field.rs b/src/finite_field.rs index 92075f8..18fdf12 100644 --- a/src/finite_field.rs +++ b/src/finite_field.rs @@ -1,10 +1,5 @@ use std::{ops::{Add, Sub, Mul, AddAssign, SubAssign, Div, Rem}, fmt::Debug}; -pub trait DefaultNumber { - fn zero() -> Self; - fn one() -> Self; -} - #[derive(PartialEq, Debug, Copy, Clone)] pub struct FiniteFieldElement where @@ -25,13 +20,13 @@ where impl FiniteFieldElement where - T: Rem + Add + Sub + PartialEq + PartialOrd + Copy + DefaultNumber + Debug + T: Rem + Add + Sub + Div + PartialEq + PartialOrd + Copy + Debug { fn pow(self, e: T) -> Self { - let one = T::one(); + let one = self.value / self.value; let mut r = Self::new(one, self.p); let mut i = e % (self.p - one); - let zero = T::zero(); + let zero = self.value - self.value; while i > zero { r = r * self; i = i - one; @@ -97,7 +92,7 @@ where impl Mul for FiniteFieldElement where - T: Add + Sub + PartialEq + PartialOrd + Copy + DefaultNumber + T: Add + Sub + Div + PartialEq + PartialOrd + Copy { type Output = Self; @@ -105,8 +100,8 @@ where if self.p != rhs.p { panic!("Cannot mul different field value."); } - let one = T::one(); - let zero = T::zero(); + let one = self.value / self.value; + let zero = self.value - self.value; let mut i = rhs.value; let mut r = Self::new(zero, self.p); while i > zero { @@ -119,12 +114,12 @@ where impl Div for FiniteFieldElement where - T: Add + Sub + Rem + PartialEq + PartialOrd + Copy + DefaultNumber + Debug + T: Add + Sub + Rem + Div + PartialEq + PartialOrd + Copy + Debug { type Output = Self; fn div(self, rhs: Self) -> Self::Output { - let one = T::one(); + let one = self.value / self.value; self * rhs.pow(self.p - one - one) } }