add div and pow

This commit is contained in:
mii
2022-05-16 22:24:49 +09:00
parent fa690f7380
commit fe702732c9
3 changed files with 34 additions and 28 deletions

View File

@@ -1,4 +1,4 @@
use std::ops::{Add, Sub, Mul, AddAssign, SubAssign};
use std::{ops::{Add, Sub, Mul, AddAssign, SubAssign, Div, Rem}, fmt::Debug};
pub trait DefaultNumber {
fn zero() -> Self;
@@ -23,6 +23,23 @@ where
}
}
impl<T> FiniteFieldElement<T>
where
T: Rem<Output = T> + Add<Output = T> + Sub<Output = T> + PartialEq + PartialOrd + Copy + DefaultNumber + Debug
{
fn pow(self, e: T) -> Self {
let one = T::one();
let mut r = Self::new(one, self.p);
let mut i = e % (self.p - one);
let zero = T::zero();
while i > zero {
r = r * self;
i = i - one;
}
r
}
}
impl<T> Add for FiniteFieldElement<T>
where
T: Add<Output = T> + Sub<Output = T> + PartialEq + PartialOrd + Copy
@@ -31,7 +48,7 @@ where
fn add(self, rhs: Self) -> Self::Output {
if self.p != rhs.p {
panic!("Different field.")
panic!("Cannot add different field value.")
}
let sum = self.value + rhs.value;
if sum >= self.p {
@@ -59,7 +76,7 @@ where
fn sub(self, rhs: Self) -> Self::Output {
if self.p != rhs.p {
panic!("Different field.");
panic!("Cannot sub different field value.");
}
if self.value < rhs.value {
Self::new(self.p - rhs.value + self.value , self.p)
@@ -86,7 +103,7 @@ where
fn mul(self, rhs: Self) -> Self::Output {
if self.p != rhs.p {
panic!("Different field.");
panic!("Cannot mul different field value.");
}
let one = T::one();
let zero = T::zero();
@@ -99,3 +116,15 @@ where
r
}
}
impl<T> Div for FiniteFieldElement<T>
where
T: Add<Output = T> + Sub<Output = T> + Rem<Output = T> + PartialEq + PartialOrd + Copy + DefaultNumber + Debug
{
type Output = Self;
fn div(self, rhs: Self) -> Self::Output {
let one = T::one();
self * rhs.pow(self.p - one - one)
}
}

1
src/lib.rs Normal file
View File

@@ -0,0 +1 @@
pub mod finite_field;

View File

@@ -1,24 +0,0 @@
use finite_field::DefaultNumber;
use primitive_types::U512;
use crate::finite_field::FiniteFieldElement;
mod finite_field;
impl DefaultNumber for U512 {
fn zero() -> Self {
U512::from(0)
}
fn one() -> Self {
U512::from(1)
}
}
fn main() {
let value = FiniteFieldElement::new(U512::from(2u8), U512::MAX);
let value2 = FiniteFieldElement::new(U512::from(3u8), U512::MAX);
println!("{:?}", value + value2);
println!("{:?}", value - value2);
println!("{:?}", value * value2);
}