use ark_ff::{Field, PrimeField, SquareRootField, Zero};
pub mod bls12;
pub mod bn;
pub mod bw6;
pub mod mnt4;
pub mod mnt6;
pub mod short_weierstrass_jacobian;
pub mod twisted_edwards_extended;
pub trait ModelParameters: Send + Sync + 'static {
type BaseField: Field + SquareRootField;
type ScalarField: PrimeField + SquareRootField + Into<<Self::ScalarField as PrimeField>::BigInt>;
}
pub trait SWModelParameters: ModelParameters {
const COEFF_A: Self::BaseField;
const COEFF_B: Self::BaseField;
const COFACTOR: &'static [u64];
const COFACTOR_INV: Self::ScalarField;
const AFFINE_GENERATOR_COEFFS: (Self::BaseField, Self::BaseField);
#[inline(always)]
fn mul_by_a(elem: &Self::BaseField) -> Self::BaseField {
let mut copy = *elem;
copy *= &Self::COEFF_A;
copy
}
#[inline(always)]
fn add_b(elem: &Self::BaseField) -> Self::BaseField {
if !Self::COEFF_B.is_zero() {
let mut copy = *elem;
copy += &Self::COEFF_B;
return copy;
}
*elem
}
}
pub trait TEModelParameters: ModelParameters {
const COEFF_A: Self::BaseField;
const COEFF_D: Self::BaseField;
const COFACTOR: &'static [u64];
const COFACTOR_INV: Self::ScalarField;
const AFFINE_GENERATOR_COEFFS: (Self::BaseField, Self::BaseField);
type MontgomeryModelParameters: MontgomeryModelParameters<BaseField = Self::BaseField>;
#[inline(always)]
fn mul_by_a(elem: &Self::BaseField) -> Self::BaseField {
let mut copy = *elem;
copy *= &Self::COEFF_A;
copy
}
}
pub trait MontgomeryModelParameters: ModelParameters {
const COEFF_A: Self::BaseField;
const COEFF_B: Self::BaseField;
type TEModelParameters: TEModelParameters<BaseField = Self::BaseField>;
}