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}