mirror of
https://github.com/mii443/finite_field.git
synced 2025-12-04 03:28:20 +00:00
add div and pow
This commit is contained in:
@@ -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 {
|
pub trait DefaultNumber {
|
||||||
fn zero() -> Self;
|
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>
|
impl<T> Add for FiniteFieldElement<T>
|
||||||
where
|
where
|
||||||
T: Add<Output = T> + Sub<Output = T> + PartialEq + PartialOrd + Copy
|
T: Add<Output = T> + Sub<Output = T> + PartialEq + PartialOrd + Copy
|
||||||
@@ -31,7 +48,7 @@ where
|
|||||||
|
|
||||||
fn add(self, rhs: Self) -> Self::Output {
|
fn add(self, rhs: Self) -> Self::Output {
|
||||||
if self.p != rhs.p {
|
if self.p != rhs.p {
|
||||||
panic!("Different field.")
|
panic!("Cannot add different field value.")
|
||||||
}
|
}
|
||||||
let sum = self.value + rhs.value;
|
let sum = self.value + rhs.value;
|
||||||
if sum >= self.p {
|
if sum >= self.p {
|
||||||
@@ -59,7 +76,7 @@ where
|
|||||||
|
|
||||||
fn sub(self, rhs: Self) -> Self::Output {
|
fn sub(self, rhs: Self) -> Self::Output {
|
||||||
if self.p != rhs.p {
|
if self.p != rhs.p {
|
||||||
panic!("Different field.");
|
panic!("Cannot sub different field value.");
|
||||||
}
|
}
|
||||||
if self.value < rhs.value {
|
if self.value < rhs.value {
|
||||||
Self::new(self.p - rhs.value + self.value , self.p)
|
Self::new(self.p - rhs.value + self.value , self.p)
|
||||||
@@ -86,7 +103,7 @@ where
|
|||||||
|
|
||||||
fn mul(self, rhs: Self) -> Self::Output {
|
fn mul(self, rhs: Self) -> Self::Output {
|
||||||
if self.p != rhs.p {
|
if self.p != rhs.p {
|
||||||
panic!("Different field.");
|
panic!("Cannot mul different field value.");
|
||||||
}
|
}
|
||||||
let one = T::one();
|
let one = T::one();
|
||||||
let zero = T::zero();
|
let zero = T::zero();
|
||||||
@@ -99,3 +116,15 @@ where
|
|||||||
r
|
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
1
src/lib.rs
Normal file
@@ -0,0 +1 @@
|
|||||||
|
pub mod finite_field;
|
||||||
24
src/main.rs
24
src/main.rs
@@ -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);
|
|
||||||
}
|
|
||||||
Reference in New Issue
Block a user