Foundation of finite field arithmetic

This commit is contained in:
Sean Bowe 2016-06-28 23:50:38 -06:00
parent b60f4f0db0
commit 7f515bbe1c
No known key found for this signature in database
GPG Key ID: 95684257D8F8B031
5 changed files with 144 additions and 0 deletions

View File

@ -11,3 +11,5 @@ documentation = "https://ebfull.github.io/bn/"
license = "MIT OR Apache-2.0"
[dependencies]
num = "0.1.32"
rand = "0.3.14"

69
src/fp.rs Normal file
View File

@ -0,0 +1,69 @@
use rand::Rng;
use num::{BigUint, Num};
use std::ops::{Mul,Add,Sub,Neg};
use std::convert::From;
use std::marker::PhantomData;
pub trait PrimeFieldParams {
fn modulus() -> BigUint;
fn bits() -> usize;
}
pub struct Fp<P: PrimeFieldParams> {
value: BigUint,
_marker: PhantomData<P>
}
impl<P: PrimeFieldParams> Fp<P> {
pub fn zero() -> Self { unimplemented!() }
pub fn one() -> Self { unimplemented!() }
pub fn random<R: Rng>(rng: &mut R) -> Self { unimplemented!() }
pub fn is_zero(&self) -> bool { unimplemented!() }
pub fn inverse(&self) -> Self { unimplemented!() }
pub fn squared(&self) -> Self { unimplemented!() }
pub fn pow<P2: PrimeFieldParams>(&self, exp: &Fp<P2>) -> Self { unimplemented!() }
pub fn test_bit(&self, bit: usize) -> bool { unimplemented!() }
}
impl<'a, P: PrimeFieldParams> From<&'a str> for Fp<P> {
fn from(s: &'a str) -> Self { unimplemented!() }
}
impl<P: PrimeFieldParams> Clone for Fp<P> {
fn clone(&self) -> Self { unimplemented!() }
}
impl<'a, 'b, P: PrimeFieldParams> Add<&'b Fp<P>> for &'a Fp<P> {
type Output = Fp<P>;
fn add(self, other: &Fp<P>) -> Fp<P> { unimplemented!() }
}
impl<'a, 'b, P: PrimeFieldParams> Sub<&'b Fp<P>> for &'a Fp<P> {
type Output = Fp<P>;
fn sub(self, other: &Fp<P>) -> Fp<P> { unimplemented!() }
}
impl<'a, 'b, P: PrimeFieldParams> Mul<&'b Fp<P>> for &'a Fp<P> {
type Output = Fp<P>;
fn mul(self, other: &Fp<P>) -> Fp<P> { unimplemented!() }
}
impl<'a, P: PrimeFieldParams> Neg for &'a Fp<P> {
type Output = Fp<P>;
fn neg(self) -> Fp<P> { unimplemented!() }
}
impl<P: PrimeFieldParams> Neg for Fp<P> {
type Output = Fp<P>;
fn neg(self) -> Fp<P> {
-(&self)
}
}
forward_all_binop_to_ref_ref!(impl(P: PrimeFieldParams) Mul for Fp<P>, mul);

View File

@ -0,0 +1,7 @@
extern crate num;
extern crate rand;
#[macro_use]
mod macros;
mod fp;
mod params;

46
src/macros.rs Normal file
View File

@ -0,0 +1,46 @@
macro_rules! forward_val_val_binop {
(impl($($t:ident: $p:ident),*) $imp:ident for $res:ty, $method:ident) => {
impl<$($t: $p),*> $imp<$res> for $res {
type Output = $res;
#[inline]
fn $method(self, other: $res) -> $res {
$imp::$method(&self, &other)
}
}
}
}
macro_rules! forward_ref_val_binop {
(impl($($t:ident: $p:ident),*) $imp:ident for $res:ty, $method:ident) => {
impl<'a, $($t: $p),*> $imp<$res> for &'a $res {
type Output = $res;
#[inline]
fn $method(self, other: $res) -> $res {
$imp::$method(self, &other)
}
}
}
}
macro_rules! forward_val_ref_binop {
(impl($($t:ident: $p:ident),*) $imp:ident for $res:ty, $method:ident) => {
impl<'a, $($t: $p),*> $imp<&'a $res> for $res {
type Output = $res;
#[inline]
fn $method(self, other: &$res) -> $res {
$imp::$method(&self, other)
}
}
}
}
macro_rules! forward_all_binop_to_ref_ref {
(impl($($t:ident: $p:ident),*) $imp:ident for $res:ty, $method:ident) => {
forward_val_val_binop!(impl($($t: $p),*) $imp for $res, $method);
forward_ref_val_binop!(impl($($t: $p),*) $imp for $res, $method);
forward_val_ref_binop!(impl($($t: $p),*) $imp for $res, $method);
};
}

20
src/params.rs Normal file
View File

@ -0,0 +1,20 @@
use num::{Num,BigUint};
use fp::PrimeFieldParams;
pub struct FrParams;
impl PrimeFieldParams for FrParams {
fn modulus() -> BigUint {
BigUint::from_str_radix("21888242871839275222246405745257275088548364400416034343698204186575808495617", 10).unwrap()
}
fn bits() -> usize { 254 }
}
pub struct FqParams;
impl PrimeFieldParams for FqParams {
fn modulus() -> BigUint {
BigUint::from_str_radix("21888242871839275222246405745257275088696311157297823662689037894645226208583", 10).unwrap()
}
fn bits() -> usize { 254 }
}