use crate::{One, Zero};
use snarkvm_utilities::{
bititerator::BitIteratorBE,
bytes::{FromBytes, ToBytes},
rand::UniformRand,
serialize::{
CanonicalDeserialize,
CanonicalDeserializeWithFlags,
CanonicalSerialize,
CanonicalSerializeWithFlags,
ConstantSerializedSize,
},
};
use std::{
fmt::{Debug, Display},
hash::Hash,
ops::{Add, AddAssign, Div, DivAssign, Mul, MulAssign, Neg, Sub, SubAssign},
};
use serde::{Deserialize, Serialize};
pub trait Field:
ToBytes
+ FromBytes
+ Copy
+ Clone
+ Debug
+ Display
+ Default
+ Send
+ Sync
+ 'static
+ Eq
+ One
+ Ord
+ Neg<Output = Self>
+ UniformRand
+ Sized
+ Hash
+ From<u128>
+ From<u64>
+ From<u32>
+ From<u16>
+ From<u8>
+ for<'a> Add<&'a Self, Output = Self>
+ for<'a> Sub<&'a Self, Output = Self>
+ for<'a> Mul<&'a Self, Output = Self>
+ for<'a> Div<&'a Self, Output = Self>
+ for<'a> AddAssign<&'a Self>
+ for<'a> SubAssign<&'a Self>
+ for<'a> MulAssign<&'a Self>
+ for<'a> DivAssign<&'a Self>
+ CanonicalSerialize
+ ConstantSerializedSize
+ CanonicalSerializeWithFlags
+ CanonicalDeserialize
+ CanonicalDeserializeWithFlags
+ Serialize
+ for<'a> Deserialize<'a>
+ Zero
{
fn characteristic<'a>() -> &'a [u64];
#[must_use]
fn double(&self) -> Self;
fn double_in_place(&mut self) -> &mut Self;
#[must_use]
fn square(&self) -> Self;
fn square_in_place(&mut self) -> &mut Self;
#[must_use]
fn inverse(&self) -> Option<Self>;
fn inverse_in_place(&mut self) -> Option<&mut Self>;
fn frobenius_map(&mut self, power: usize);
fn pow<S: AsRef<[u64]>>(&self, exp: S) -> Self {
let mut res = Self::one();
let mut found_one = false;
for i in BitIteratorBE::new(exp) {
if !found_one {
if i {
found_one = true;
} else {
continue;
}
}
res.square_in_place();
if i {
res *= self;
}
}
res
}
fn from_random_bytes(bytes: &[u8]) -> Option<Self> {
Self::from_random_bytes_with_flags(bytes).map(|f| f.0)
}
fn from_random_bytes_with_flags(bytes: &[u8]) -> Option<(Self, u8)>;
}