use cryptix_bigint::{BigUInt, bigint, property::IsBigInt};
use cryptix_field::{Element, Modular, field::montgomery::Montgomery, PrimeModular, OddModular};
use cryptix_field::field::primefield::FpElement;
pub type U256 = BigUInt<u64, 4>;
#[derive(Debug, Clone, Copy, PartialEq, Eq, PartialOrd, Ord)]
pub struct BN254;
impl Modular<U256> for BN254 {
const P: U256 = bigint!(U256, "2523648240000001BA344D80000000086121000000000013A700000000000013");
}
impl PrimeModular<U256> for BN254 { }
impl OddModular<U256> for BN254 { }
impl Montgomery<U256> for BN254 {
const R_P: FpElement<U256, Self> = {
FpElement(Element::new_unchecked(bigint!(U256, "212ba4f27ffffff5a2c62effffffffcdb939ffffffffff8a15ffffffffffff8e")))
};
const R_INV_P: FpElement<U256, Self> = {
FpElement(Element::new_unchecked(bigint!(U256, "1a7344bac91f117ea513ec0ed5682406b6c15140174d61b28b762ae9cf6d3b46")))
};
const RR_P: FpElement<U256, BN254> = {
FpElement(Element::new_unchecked(bigint!(U256, "1B0A32FDF6403A3D281E3A1B7F86954F55EFBF6E8C1CC3F1B3E886745370473D")))
};
const NEG_P_INV_B: <U256 as IsBigInt>::Dig = 0x8435e50d79435e5;
}