arnaucube
arnaucube/ark-curves-cherry-pickedPublic Self-hosted repository
ark-curves-cherry-picked/bls12_377/src/fields/tests.rs
bls12_377/src/fields/tests.rsRaw
  1use ark_ff::{
  2    biginteger::{BigInt, BigInteger, BigInteger384},
  3    fields::{
  4        fp6_3over2::Fp6Parameters, FftField, FftParameters, Field, Fp2Parameters, FpParameters,
  5        PrimeField, SquareRootField,
  6    },
  7    One, UniformRand, Zero,
  8};
  9use ark_serialize::{buffer_bit_byte_size, CanonicalSerialize};
 10use ark_std::{rand::Rng, test_rng};
 11use core::{
 12    cmp::Ordering,
 13    ops::{AddAssign, MulAssign, SubAssign},
 14};
 15
 16use crate::{Fq, Fq12, Fq2, Fq2Parameters, Fq6, Fq6Parameters, FqParameters, Fr};
 17
 18use ark_algebra_test_templates::{
 19    fields::*, generate_field_serialization_test, generate_field_test,
 20};
 21
 22generate_field_test!(bls12_377; fq2; fq6; fq12;);
 23generate_field_serialization_test!(bls12_377; fq2; fq6; fq12;);
 24
 25#[test]
 26fn test_fq_repr_from() {
 27    assert_eq!(BigInt::from(100u64), BigInt::new([100, 0, 0, 0, 0, 0]));
 28}
 29
 30#[test]
 31fn test_fq_repr_is_odd() {
 32    assert!(!BigInteger384::from(0).is_odd());
 33    assert!(BigInteger384::from(0).is_even());
 34    assert!(BigInteger384::from(1).is_odd());
 35    assert!(!BigInteger384::from(1).is_even());
 36    assert!(!BigInteger384::from(324834872).is_odd());
 37    assert!(BigInteger384::from(324834872).is_even());
 38    assert!(BigInteger384::from(324834873).is_odd());
 39    assert!(!BigInteger384::from(324834873).is_even());
 40}
 41
 42#[test]
 43fn test_fq_repr_is_zero() {
 44    assert!(BigInteger384::from(0u64).is_zero());
 45    assert!(!BigInteger384::from(1u64).is_zero());
 46    assert!(!BigInt::new([0, 0, 0, 0, 1, 0]).is_zero());
 47}
 48
 49#[test]
 50fn test_fq_repr_num_bits() {
 51    let mut a = BigInteger384::from(0);
 52    assert_eq!(0, a.num_bits());
 53    a = BigInteger384::from(1);
 54    for i in 1..385 {
 55        assert_eq!(i, a.num_bits());
 56        a.mul2();
 57    }
 58    assert_eq!(0, a.num_bits());
 59}
 60
 61#[test]
 62fn test_fq_num_bits() {
 63    assert_eq!(FqParameters::MODULUS_BITS, 377);
 64    assert_eq!(FqParameters::CAPACITY, 376);
 65}
 66
 67#[test]
 68fn test_fq_root_of_unity() {
 69    assert_eq!(FqParameters::TWO_ADICITY, 46);
 70    assert_eq!(
 71        Fq::multiplicative_generator().pow([
 72            0x7510c00000021423,
 73            0x88bee82520005c2d,
 74            0x67cc03d44e3c7bcd,
 75            0x1701b28524ec688b,
 76            0xe9185f1443ab18ec,
 77            0x6b8
 78        ]),
 79        Fq::two_adic_root_of_unity()
 80    );
 81    assert_eq!(
 82        Fq::two_adic_root_of_unity().pow([1 << FqParameters::TWO_ADICITY]),
 83        Fq::one()
 84    );
 85    assert!(Fq::multiplicative_generator().sqrt().is_none());
 86}
 87
 88#[test]
 89fn test_fq_ordering() {
 90    // BigInteger384's ordering is well-tested, but we still need to make sure the
 91    // Fq elements aren't being compared in Montgomery form.
 92    for i in 0..100 {
 93        assert!(Fq::from(BigInteger384::from(i + 1)) > Fq::from(BigInteger384::from(i)));
 94    }
 95}
 96
 97#[test]
 98fn test_fq_legendre() {
 99    use ark_ff::fields::LegendreSymbol::*;
100
101    assert_eq!(QuadraticResidue, Fq::one().legendre());
102    assert_eq!(Zero, Fq::zero().legendre());
103    assert_eq!(
104        QuadraticResidue,
105        Fq::from(BigInteger384::from(4)).legendre()
106    );
107    assert_eq!(
108        QuadraticNonResidue,
109        Fq::from(BigInteger384::from(5)).legendre()
110    );
111}
112
113#[test]
114fn test_fq2_ordering() {
115    let mut a = Fq2::new(Fq::zero(), Fq::zero());
116    let mut b = a.clone();
117
118    assert!(a.cmp(&b) == Ordering::Equal);
119    b.c0.add_assign(&Fq::one());
120    assert!(a.cmp(&b) == Ordering::Less);
121    a.c0.add_assign(&Fq::one());
122    assert!(a.cmp(&b) == Ordering::Equal);
123    b.c1.add_assign(&Fq::one());
124    assert!(a.cmp(&b) == Ordering::Less);
125    a.c0.add_assign(&Fq::one());
126    assert!(a.cmp(&b) == Ordering::Less);
127    a.c1.add_assign(&Fq::one());
128    assert!(a.cmp(&b) == Ordering::Greater);
129    b.c0.add_assign(&Fq::one());
130    assert!(a.cmp(&b) == Ordering::Equal);
131}
132
133#[test]
134fn test_fq2_basics() {
135    assert_eq!(Fq2::new(Fq::zero(), Fq::zero(),), Fq2::zero());
136    assert_eq!(Fq2::new(Fq::one(), Fq::zero(),), Fq2::one());
137    assert!(Fq2::zero().is_zero());
138    assert!(!Fq2::one().is_zero());
139    assert!(!Fq2::new(Fq::zero(), Fq::one(),).is_zero());
140}
141
142#[test]
143fn test_fq2_legendre() {
144    use ark_ff::fields::LegendreSymbol::*;
145
146    assert_eq!(Zero, Fq2::zero().legendre());
147    // i^2 = -1
148    let mut m1 = -Fq2::one();
149    assert_eq!(QuadraticResidue, m1.legendre());
150    m1 = Fq6Parameters::mul_fp2_by_nonresidue(&m1);
151    assert_eq!(QuadraticNonResidue, m1.legendre());
152}
153
154#[test]
155fn test_fq2_mul_nonresidue() {
156    let mut rng = test_rng();
157
158    let nqr = Fq2::new(Fq::zero(), Fq::one());
159
160    let quadratic_non_residue = Fq2::new(
161        Fq2Parameters::QUADRATIC_NONRESIDUE.0,
162        Fq2Parameters::QUADRATIC_NONRESIDUE.1,
163    );
164    for _ in 0..1000 {
165        let mut a = Fq2::rand(&mut rng);
166        let mut b = a;
167        a = quadratic_non_residue * &a;
168        b.mul_assign(&nqr);
169
170        assert_eq!(a, b);
171    }
172}
173
174#[test]
175fn test_fq6_mul_by_1() {
176    let mut rng = test_rng();
177
178    for _ in 0..1000 {
179        let c1 = Fq2::rand(&mut rng);
180        let mut a = Fq6::rand(&mut rng);
181        let mut b = a;
182
183        a.mul_by_1(&c1);
184        b.mul_assign(&Fq6::new(Fq2::zero(), c1, Fq2::zero()));
185
186        assert_eq!(a, b);
187    }
188}
189
190#[test]
191fn test_fq6_mul_by_01() {
192    let mut rng = test_rng();
193
194    for _ in 0..1000 {
195        let c0 = Fq2::rand(&mut rng);
196        let c1 = Fq2::rand(&mut rng);
197        let mut a = Fq6::rand(&mut rng);
198        let mut b = a;
199
200        a.mul_by_01(&c0, &c1);
201        b.mul_assign(&Fq6::new(c0, c1, Fq2::zero()));
202
203        assert_eq!(a, b);
204    }
205}
206
207#[test]
208fn test_fq12_mul_by_014() {
209    let mut rng = test_rng();
210
211    for _ in 0..1000 {
212        let c0 = Fq2::rand(&mut rng);
213        let c1 = Fq2::rand(&mut rng);
214        let c5 = Fq2::rand(&mut rng);
215        let mut a = Fq12::rand(&mut rng);
216        let mut b = a;
217
218        a.mul_by_014(&c0, &c1, &c5);
219        b.mul_assign(&Fq12::new(
220            Fq6::new(c0, c1, Fq2::zero()),
221            Fq6::new(Fq2::zero(), c5, Fq2::zero()),
222        ));
223
224        assert_eq!(a, b);
225    }
226}
227
228#[test]
229fn test_fq12_mul_by_034() {
230    let mut rng = test_rng();
231
232    for _ in 0..1000 {
233        let c0 = Fq2::rand(&mut rng);
234        let c3 = Fq2::rand(&mut rng);
235        let c4 = Fq2::rand(&mut rng);
236        let mut a = Fq12::rand(&mut rng);
237        let mut b = a;
238
239        a.mul_by_034(&c0, &c3, &c4);
240        b.mul_assign(&Fq12::new(
241            Fq6::new(c0, Fq2::zero(), Fq2::zero()),
242            Fq6::new(c3, c4, Fq2::zero()),
243        ));
244
245        assert_eq!(a, b);
246    }
247}