halo2curves/bn256/
fq.rs

1use core::convert::TryInto;
2
3use halo2derive::impl_field;
4use rand::RngCore;
5use subtle::{Choice, ConditionallySelectable, ConstantTimeEq, CtOption};
6
7use crate::ff_ext::ExtField;
8
9impl_field!(
10    bn256_base,
11    Fq,
12    modulus = "30644e72e131a029b85045b68181585d97816a916871ca8d3c208c16d87cfd47",
13    mul_gen = "3",
14    zeta = "30644e72e131a0295e6dd9e7e0acccb0c28f069fbb966e3de4bd44e5607cfd48",
15    from_uniform = [64, 48],
16    endian = "little",
17);
18
19crate::extend_field_legendre!(Fq);
20crate::impl_binops_calls!(Fq);
21crate::impl_binops_additive!(Fq, Fq);
22crate::impl_binops_multiplicative!(Fq, Fq);
23crate::field_bits!(Fq);
24crate::serialize_deserialize_primefield!(Fq);
25crate::impl_from_u64!(Fq);
26crate::impl_from_bool!(Fq);
27
28use ff::Field;
29const NEGATIVE_ONE: Fq = Fq::ZERO.sub_const(&Fq::ONE);
30impl ExtField for Fq {
31    const NON_RESIDUE: Self = NEGATIVE_ONE;
32    fn mul_by_nonresidue(&self) -> Self {
33        self.neg()
34    }
35    fn frobenius_map(&mut self, _: usize) {}
36}
37
38#[cfg(test)]
39mod test {
40    use super::Fq;
41    use crate::{
42        arith_test, constants_test, from_uniform_bytes_test, legendre_test, serde_test, test,
43    };
44
45    constants_test!(Fq);
46
47    arith_test!(Fq);
48    legendre_test!(Fq);
49    test!(arith, Fq, sqrt_test, 1000);
50
51    serde_test!(Fq PrimeFieldBits);
52    from_uniform_bytes_test!(Fq, 1000, L 64, L 48);
53}