use crate::{One, PrimeField, Zero};
use snarkvm_utilities::{
FromBytes,
ToBits,
ToBytes,
bititerator::BitIteratorBE,
rand::Uniform,
serialize::{
CanonicalDeserialize,
CanonicalDeserializeWithFlags,
CanonicalSerialize,
CanonicalSerializeWithFlags,
EmptyFlags,
Flags,
},
};
use std::{
fmt::{Debug, Display},
hash::Hash,
ops::{Add, AddAssign, Div, DivAssign, Mul, MulAssign, Neg, Sub, SubAssign},
};
use serde::{Deserialize, Serialize};
pub trait Field:
'static
+ ToBits
+ ToBytes
+ FromBytes
+ Copy
+ Clone
+ Debug
+ Display
+ Default
+ Send
+ Sync
+ Eq
+ One
+ Ord
+ Neg<Output = Self>
+ Uniform
+ Zero
+ Sized
+ Hash
+ From<u128>
+ From<u64>
+ From<u32>
+ From<u16>
+ From<u8>
+ Add<Self, Output = Self>
+ Sub<Self, Output = Self>
+ Mul<Self, Output = Self>
+ Div<Self, Output = Self>
+ AddAssign<Self>
+ SubAssign<Self>
+ MulAssign<Self>
+ DivAssign<Self>
+ 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>
+ core::iter::Sum<Self>
+ for<'a> core::iter::Sum<&'a Self>
+ core::iter::Product<Self>
+ for<'a> core::iter::Product<&'a Self>
+ CanonicalSerialize
+ CanonicalSerializeWithFlags
+ CanonicalDeserialize
+ CanonicalDeserializeWithFlags
+ Serialize
+ for<'a> Deserialize<'a>
{
type BasePrimeField: PrimeField;
fn from_base_prime_field(other: Self::BasePrimeField) -> Self;
fn half() -> Self {
Self::from_base_prime_field(Self::BasePrimeField::half())
}
fn characteristic<'a>() -> &'a [u64];
#[must_use]
fn double(&self) -> Self;
fn double_in_place(&mut self);
#[must_use]
fn square(&self) -> Self;
fn square_in_place(&mut self) -> &mut Self;
fn sum_of_products<'a>(a: &'a [Self], b: &'a [Self]) -> Self {
a.iter().zip(b).map(|(a, b)| *a * b).sum::<Self>()
}
#[must_use]
fn inverse(&self) -> Option<Self>;
fn inverse_in_place(&mut self) -> Option<&mut Self>;
fn frobenius_map(&mut self, power: usize);
#[must_use]
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::<EmptyFlags>(bytes).map(|f| f.0)
}
fn from_random_bytes_with_flags<F: Flags>(bytes: &[u8]) -> Option<(Self, F)>;
}