1use crate::UniformRand;
2use ark_serialize::{
3 CanonicalDeserialize, CanonicalDeserializeWithFlags, CanonicalSerialize,
4 CanonicalSerializeWithFlags, EmptyFlags, Flags,
5};
6use ark_std::{
7 fmt::{Debug, Display},
8 hash::Hash,
9 iter::*,
10 ops::{Add, AddAssign, Div, DivAssign, Mul, MulAssign, Neg, Sub, SubAssign},
11 vec::*,
12};
13
14pub use ark_ff_macros;
15pub use ark_ff_macros::define_field;
16pub use num_traits::{One, Zero};
17use zeroize::Zeroize;
18
19pub mod utils;
20
21#[macro_use]
22pub mod arithmetic;
23
24#[macro_use]
25pub mod models;
26pub use self::models::*;
27
28pub mod field_hashers;
29
30mod prime;
31pub use prime::*;
32
33mod fft_friendly;
34pub use fft_friendly::*;
35
36mod cyclotomic;
37pub use cyclotomic::*;
38
39mod sqrt;
40pub use sqrt::*;
41
42#[cfg(feature = "parallel")]
43use ark_std::cmp::max;
44#[cfg(feature = "parallel")]
45use rayon::prelude::*;
46
47pub trait AdditiveGroup:
48 Eq
49 + 'static
50 + Sized
51 + CanonicalSerialize
52 + CanonicalDeserialize
53 + Copy
54 + Clone
55 + Default
56 + Send
57 + Sync
58 + Hash
59 + Debug
60 + Display
61 + UniformRand
62 + Zeroize
63 + Zero
64 + Neg<Output = Self>
65 + Add<Self, Output = Self>
66 + Sub<Self, Output = Self>
67 + Mul<<Self as AdditiveGroup>::Scalar, Output = Self>
68 + AddAssign<Self>
69 + SubAssign<Self>
70 + MulAssign<<Self as AdditiveGroup>::Scalar>
71 + for<'a> Add<&'a Self, Output = Self>
72 + for<'a> Sub<&'a Self, Output = Self>
73 + for<'a> Mul<&'a <Self as AdditiveGroup>::Scalar, Output = Self>
74 + for<'a> AddAssign<&'a Self>
75 + for<'a> SubAssign<&'a Self>
76 + for<'a> MulAssign<&'a <Self as AdditiveGroup>::Scalar>
77 + for<'a> Add<&'a mut Self, Output = Self>
78 + for<'a> Sub<&'a mut Self, Output = Self>
79 + for<'a> Mul<&'a mut <Self as AdditiveGroup>::Scalar, Output = Self>
80 + for<'a> AddAssign<&'a mut Self>
81 + for<'a> SubAssign<&'a mut Self>
82 + for<'a> MulAssign<&'a mut <Self as AdditiveGroup>::Scalar>
83 + ark_std::iter::Sum<Self>
84 + for<'a> ark_std::iter::Sum<&'a Self>
85{
86 type Scalar: Field;
87
88 const ZERO: Self;
90
91 #[must_use]
93 fn double(&self) -> Self {
94 let mut copy = *self;
95 copy.double_in_place();
96 copy
97 }
98 fn double_in_place(&mut self) -> &mut Self {
100 *self += *self;
101 self
102 }
103
104 fn neg_in_place(&mut self) -> &mut Self {
106 *self = -(*self);
107 self
108 }
109}
110
111pub trait Field:
161 'static
162 + Copy
163 + Clone
164 + Debug
165 + Display
166 + Default
167 + Send
168 + Sync
169 + Eq
170 + Zero
171 + One
172 + Ord
173 + Neg<Output = Self>
174 + UniformRand
175 + Zeroize
176 + Sized
177 + Hash
178 + CanonicalSerialize
179 + CanonicalSerializeWithFlags
180 + CanonicalDeserialize
181 + CanonicalDeserializeWithFlags
182 + AdditiveGroup<Scalar = Self>
183 + Div<Self, Output = Self>
184 + DivAssign<Self>
185 + for<'a> Div<&'a Self, Output = Self>
186 + for<'a> DivAssign<&'a Self>
187 + for<'a> Div<&'a mut Self, Output = Self>
188 + for<'a> DivAssign<&'a mut Self>
189 + for<'a> core::iter::Product<&'a Self>
190 + From<u128>
191 + From<u64>
192 + From<u32>
193 + From<u16>
194 + From<u8>
195 + From<i128>
196 + From<i64>
197 + From<i32>
198 + From<i16>
199 + From<i8>
200 + From<bool>
201 + Product<Self>
202{
203 type BasePrimeField: PrimeField;
204
205 const SQRT_PRECOMP: Option<SqrtPrecomputation<Self>>;
207
208 const ONE: Self;
210
211 const NEG_ONE: Self;
213
214 fn characteristic() -> &'static [u64] {
217 Self::BasePrimeField::characteristic()
218 }
219
220 fn extension_degree() -> u64;
223
224 fn to_base_prime_field_elements(&self) -> impl Iterator<Item = Self::BasePrimeField>;
225
226 fn from_base_prime_field_elems(
229 elems: impl IntoIterator<Item = Self::BasePrimeField>,
230 ) -> Option<Self>;
231
232 fn from_base_prime_field(elem: Self::BasePrimeField) -> Self;
241
242 fn from_random_bytes(bytes: &[u8]) -> Option<Self> {
248 Self::from_random_bytes_with_flags::<EmptyFlags>(bytes).map(|f| f.0)
249 }
250
251 fn from_random_bytes_with_flags<F: Flags>(bytes: &[u8]) -> Option<(Self, F)>;
258
259 fn legendre(&self) -> LegendreSymbol;
264
265 #[must_use]
267 fn sqrt(&self) -> Option<Self> {
268 match Self::SQRT_PRECOMP {
269 Some(tv) => tv.sqrt(self),
270 None => unimplemented!(),
271 }
272 }
273
274 fn sqrt_in_place(&mut self) -> Option<&mut Self> {
276 (*self).sqrt().map(|sqrt| {
277 *self = sqrt;
278 self
279 })
280 }
281
282 #[must_use]
284 fn square(&self) -> Self;
285
286 fn square_in_place(&mut self) -> &mut Self;
288
289 #[must_use]
291 fn inverse(&self) -> Option<Self>;
292
293 fn inverse_in_place(&mut self) -> Option<&mut Self>;
296
297 #[inline]
299 fn sum_of_products<const T: usize>(a: &[Self; T], b: &[Self; T]) -> Self {
300 let mut sum = Self::zero();
301 for i in 0..a.len() {
302 sum += a[i] * b[i];
303 }
304 sum
305 }
306
307 fn frobenius_map_in_place(&mut self, power: usize);
310
311 #[must_use]
314 fn frobenius_map(&self, power: usize) -> Self {
315 let mut this = *self;
316 this.frobenius_map_in_place(power);
317 this
318 }
319
320 #[must_use]
323 fn pow<S: AsRef<[u64]>>(&self, exp: S) -> Self {
324 let mut res = Self::one();
325
326 for i in crate::BitIteratorBE::without_leading_zeros(exp) {
327 res.square_in_place();
328
329 if i {
330 res *= self;
331 }
332 }
333 res
334 }
335
336 #[inline]
344 fn pow_with_table<S: AsRef<[u64]>>(powers_of_2: &[Self], exp: S) -> Option<Self> {
345 let mut res = Self::one();
346 for (pow, bit) in crate::BitIteratorLE::without_trailing_zeros(exp).enumerate() {
347 if bit {
348 res *= powers_of_2.get(pow)?;
349 }
350 }
351 Some(res)
352 }
353
354 fn mul_by_base_prime_field(&self, elem: &Self::BasePrimeField) -> Self;
355}
356
357pub fn batch_inversion<F: Field>(v: &mut [F]) {
359 batch_inversion_and_mul(v, &F::one());
360}
361
362#[cfg(not(feature = "parallel"))]
363pub fn batch_inversion_and_mul<F: Field>(v: &mut [F], coeff: &F) {
365 serial_batch_inversion_and_mul(v, coeff);
366}
367
368#[cfg(feature = "parallel")]
369pub fn batch_inversion_and_mul<F: Field>(v: &mut [F], coeff: &F) {
371 let min_elements_per_thread = 1;
373 let num_cpus_available = rayon::current_num_threads();
374 let num_elems = v.len();
375 let num_elem_per_thread = max(num_elems / num_cpus_available, min_elements_per_thread);
376
377 v.par_chunks_mut(num_elem_per_thread).for_each(|chunk| {
379 serial_batch_inversion_and_mul(chunk, coeff);
380 });
381}
382
383pub fn serial_batch_inversion_and_mul<F: Field>(v: &mut [F], coeff: &F) {
386 let mut prod = Vec::with_capacity(v.len());
394 let mut tmp = F::one();
395 for f in v.iter().filter(|f| !f.is_zero()) {
396 tmp *= f;
397 prod.push(tmp);
398 }
399
400 tmp = tmp.inverse().unwrap(); tmp *= coeff;
405
406 for (f, s) in v.iter_mut()
408 .rev()
410 .filter(|f| !f.is_zero())
412 .zip(prod.into_iter().rev().skip(1).chain(Some(F::one())))
414 {
415 let new_tmp = tmp * *f;
417 *f = tmp * &s;
418 tmp = new_tmp;
419 }
420}
421
422#[cfg(all(test, feature = "std"))]
423mod std_tests {
424 use crate::BitIteratorLE;
425
426 #[test]
427 fn bit_iterator_le() {
428 let bits = BitIteratorLE::new(&[0, 1 << 10]).collect::<Vec<_>>();
429 dbg!(&bits);
430 assert!(bits[74]);
431 for (i, bit) in bits.into_iter().enumerate() {
432 if i != 74 {
433 assert!(!bit)
434 } else {
435 assert!(bit)
436 }
437 }
438 }
439}
440
441#[cfg(test)]
442mod no_std_tests {
443 use super::*;
444 use ark_std::{str::FromStr, test_rng};
445 use num_bigint::*;
446
447 use ark_test_curves::{
451 ark_ff::{batch_inversion, batch_inversion_and_mul, PrimeField},
452 bls12_381::Fr,
453 };
454
455 #[test]
456 fn test_batch_inversion() {
457 let mut random_coeffs = Vec::new();
458 let vec_size = 1000;
459
460 for _ in 0..=vec_size {
461 random_coeffs.push(Fr::rand(&mut test_rng()));
462 }
463
464 let mut random_coeffs_inv = random_coeffs.clone();
465 batch_inversion(&mut random_coeffs_inv);
466 for i in 0..=vec_size {
467 assert_eq!(random_coeffs_inv[i] * random_coeffs[i], Fr::one());
468 }
469 let rand_multiplier = Fr::rand(&mut test_rng());
470 let mut random_coeffs_inv_shifted = random_coeffs.clone();
471 batch_inversion_and_mul(&mut random_coeffs_inv_shifted, &rand_multiplier);
472 for i in 0..=vec_size {
473 assert_eq!(
474 random_coeffs_inv_shifted[i] * random_coeffs[i],
475 rand_multiplier
476 );
477 }
478 }
479
480 #[test]
481 pub fn test_from_ints() {
482 let felt2 = Fr::one() + Fr::one();
483 let felt16 = felt2 * felt2 * felt2 * felt2;
484
485 assert_eq!(Fr::from(1u8), Fr::one());
486 assert_eq!(Fr::from(1u16), Fr::one());
487 assert_eq!(Fr::from(1u32), Fr::one());
488 assert_eq!(Fr::from(1u64), Fr::one());
489 assert_eq!(Fr::from(1u128), Fr::one());
490 assert_eq!(Fr::from(-1i8), -Fr::one());
491 assert_eq!(Fr::from(-1i64), -Fr::one());
492
493 assert_eq!(Fr::from(0), Fr::zero());
494
495 assert_eq!(Fr::from(-16i32), -felt16);
496 assert_eq!(Fr::from(16u32), felt16);
497 assert_eq!(Fr::from(16i64), felt16);
498
499 assert_eq!(Fr::from(-2i128), -felt2);
500 assert_eq!(Fr::from(2u16), felt2);
501 }
502
503 #[test]
504 fn test_from_into_biguint() {
505 let mut rng = ark_std::test_rng();
506
507 let modulus_bits = Fr::MODULUS_BIT_SIZE;
508 let modulus: num_bigint::BigUint = Fr::MODULUS.into();
509
510 let mut rand_bytes = Vec::new();
511 for _ in 0..(2 * modulus_bits / 8) {
512 rand_bytes.push(u8::rand(&mut rng));
513 }
514
515 let rand = BigUint::from_bytes_le(&rand_bytes);
516
517 let a: BigUint = Fr::from(rand.clone()).into();
518 let b = rand % modulus;
519
520 assert_eq!(a, b);
521 }
522
523 #[test]
524 fn test_from_be_bytes_mod_order() {
525 use ark_std::vec;
526 use ark_std::{rand::Rng, string::ToString};
532 use ark_test_curves::ark_ff::BigInteger;
533 use num_bigint::BigUint;
534
535 let ref_modulus = BigUint::from_bytes_be(&Fr::MODULUS.to_bytes_be());
536
537 let mut test_vectors = vec![
538 vec![0u8],
540 vec![1u8],
542 vec![255u8],
544 vec![1u8, 0u8],
546 vec![1u8, 0u8, 255u8],
548 vec![
550 115u8, 237u8, 167u8, 83u8, 41u8, 157u8, 125u8, 72u8, 51u8, 57u8, 216u8, 8u8, 9u8,
551 161u8, 216u8, 5u8, 83u8, 189u8, 164u8, 2u8, 255u8, 254u8, 91u8, 254u8, 255u8,
552 255u8, 255u8, 255u8, 0u8, 0u8, 0u8,
553 ],
554 vec![
556 115u8, 237u8, 167u8, 83u8, 41u8, 157u8, 125u8, 72u8, 51u8, 57u8, 216u8, 8u8, 9u8,
557 161u8, 216u8, 5u8, 83u8, 189u8, 164u8, 2u8, 255u8, 254u8, 91u8, 254u8, 255u8,
558 255u8, 255u8, 255u8, 0u8, 0u8, 1u8,
559 ],
560 vec![
562 115u8, 237u8, 167u8, 83u8, 41u8, 157u8, 125u8, 72u8, 51u8, 57u8, 216u8, 8u8, 9u8,
563 161u8, 216u8, 5u8, 83u8, 189u8, 164u8, 2u8, 255u8, 254u8, 91u8, 254u8, 255u8,
564 255u8, 255u8, 255u8, 0u8, 0u8, 0u8, 0u8,
565 ],
566 vec![
568 115u8, 237u8, 167u8, 83u8, 41u8, 157u8, 125u8, 72u8, 51u8, 57u8, 216u8, 8u8, 9u8,
569 161u8, 216u8, 5u8, 83u8, 189u8, 164u8, 2u8, 255u8, 254u8, 91u8, 254u8, 255u8,
570 255u8, 255u8, 255u8, 0u8, 0u8, 0u8, 1u8,
571 ],
572 vec![
574 115u8, 237u8, 167u8, 83u8, 41u8, 157u8, 125u8, 72u8, 51u8, 57u8, 216u8, 8u8, 9u8,
575 161u8, 216u8, 5u8, 83u8, 189u8, 164u8, 2u8, 255u8, 254u8, 91u8, 254u8, 255u8,
576 255u8, 255u8, 255u8, 0u8, 0u8, 0u8, 2u8,
577 ],
578 vec![
580 231u8, 219u8, 78u8, 166u8, 83u8, 58u8, 250u8, 144u8, 102u8, 115u8, 176u8, 16u8,
581 19u8, 67u8, 176u8, 10u8, 167u8, 123u8, 72u8, 5u8, 255u8, 252u8, 183u8, 253u8,
582 255u8, 255u8, 255u8, 254u8, 0u8, 0u8, 0u8, 2u8,
583 ],
584 vec![
586 115u8, 237u8, 167u8, 83u8, 41u8, 157u8, 125u8, 72u8, 51u8, 57u8, 216u8, 8u8, 9u8,
587 161u8, 216u8, 5u8, 83u8, 189u8, 164u8, 2u8, 255u8, 254u8, 91u8, 254u8, 255u8,
588 255u8, 255u8, 255u8, 0u8, 0u8, 0u8, 1u8, 0u8,
589 ],
590 vec![
592 1u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8,
593 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8,
594 17u8,
595 ],
596 vec![
598 1u8, 115u8, 237u8, 167u8, 83u8, 41u8, 157u8, 125u8, 72u8, 51u8, 57u8, 216u8, 8u8,
599 9u8, 161u8, 216u8, 5u8, 83u8, 189u8, 164u8, 2u8, 255u8, 254u8, 91u8, 254u8, 255u8,
600 255u8, 255u8, 255u8, 0u8, 0u8, 0u8, 20u8,
601 ],
602 vec![
604 1u8, 0u8, 115u8, 237u8, 167u8, 83u8, 41u8, 157u8, 125u8, 72u8, 51u8, 57u8, 216u8,
605 8u8, 9u8, 161u8, 216u8, 5u8, 83u8, 189u8, 164u8, 2u8, 255u8, 254u8, 91u8, 254u8,
606 255u8, 255u8, 255u8, 255u8, 0u8, 0u8, 0u8, 82u8,
607 ],
608 ];
609 for i in 1..512 {
611 let mut rng = test_rng();
612 let data: Vec<u8> = (0..i).map(|_| rng.gen()).collect();
613 test_vectors.push(data);
614 }
615 for i in test_vectors {
616 let mut expected_biguint = BigUint::from_bytes_be(&i);
617 expected_biguint =
619 expected_biguint.modpow(&BigUint::from_bytes_be(&[1u8]), &ref_modulus);
620 let expected_string = expected_biguint.to_string();
621 let expected = Fr::from_str(&expected_string).unwrap();
622 let actual = Fr::from_be_bytes_mod_order(&i);
623 assert_eq!(expected, actual, "failed on test {:?}", i);
624 }
625 }
626}