#[macro_use]
extern crate derivative;
#[macro_use]
extern crate thiserror;
#[macro_use]
mod macros;
mod errors;
pub use errors::*;
mod fp_256;
pub use fp_256::*;
mod fp_320;
pub use fp_320::*;
mod fp_384;
pub use fp_384::*;
mod fp_768;
pub use fp_768::*;
mod fp_832;
pub use fp_832::*;
mod fp2;
pub use fp2::*;
mod fp3;
pub use fp3::*;
pub mod fp6_2over3;
pub mod fp6_3over2;
mod fp12_2over3over2;
pub use fp12_2over3over2::*;
mod legendre;
pub use legendre::*;
pub mod tests_field;
mod to_field_vec;
pub use to_field_vec::*;
mod traits;
pub use traits::*;
use snarkvm_utilities::{
biginteger::*,
bytes::{FromBytes, ToBytes},
serialize::{
CanonicalDeserialize,
CanonicalDeserializeWithFlags,
CanonicalSerialize,
CanonicalSerializeWithFlags,
ConstantSerializedSize,
},
};
impl_field_into_bigint!(Fp256, BigInteger256, Fp256Parameters);
impl_field_into_bigint!(Fp320, BigInteger320, Fp320Parameters);
impl_field_into_bigint!(Fp384, BigInteger384, Fp384Parameters);
impl_field_into_bigint!(Fp768, BigInteger768, Fp768Parameters);
impl_field_into_bigint!(Fp832, BigInteger832, Fp832Parameters);
impl_prime_field_serializer!(Fp256, Fp256Parameters, 32);
impl_prime_field_serializer!(Fp320, Fp320Parameters, 40);
impl_prime_field_serializer!(Fp384, Fp384Parameters, 48);
impl_prime_field_serializer!(Fp768, Fp768Parameters, 96);
impl_prime_field_serializer!(Fp832, Fp832Parameters, 104);
pub fn batch_inversion<F: Field>(v: &mut [F]) {
let mut prod = Vec::with_capacity(v.len());
let mut tmp = F::one();
for f in v.iter().filter(|f| !f.is_zero()) {
tmp.mul_assign(&f);
prod.push(tmp);
}
tmp = tmp.inverse().unwrap();
for (f, s) in v
.iter_mut()
.rev()
.filter(|f| !f.is_zero())
.zip(prod.into_iter().rev().skip(1).chain(Some(F::one())))
{
let newtmp = tmp * &f;
*f = tmp * &s;
tmp = newtmp;
}
}