1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
#[macro_use]
extern crate derivative;
#[macro_use]
extern crate thiserror;
#[macro_use]
mod macros;
mod errors;
pub use errors::*;
mod fp_256;
pub use fp_256::*;
mod fp_320;
pub use fp_320::*;
mod fp_384;
pub use fp_384::*;
mod fp_768;
pub use fp_768::*;
mod fp_832;
pub use fp_832::*;
mod fp2;
pub use fp2::*;
mod fp3;
pub use fp3::*;
pub mod fp6_2over3;
pub mod fp6_3over2;
mod fp12_2over3over2;
pub use fp12_2over3over2::*;
mod legendre;
pub use legendre::*;
pub mod tests_field;
mod to_field_vec;
pub use to_field_vec::*;
mod traits;
pub use traits::*;
use snarkvm_utilities::{
biginteger::*,
bytes::{FromBytes, ToBytes},
serialize::{
CanonicalDeserialize,
CanonicalDeserializeWithFlags,
CanonicalSerialize,
CanonicalSerializeWithFlags,
ConstantSerializedSize,
},
};
impl_field_into_bigint!(Fp256, BigInteger256, Fp256Parameters);
impl_field_into_bigint!(Fp320, BigInteger320, Fp320Parameters);
impl_field_into_bigint!(Fp384, BigInteger384, Fp384Parameters);
impl_field_into_bigint!(Fp768, BigInteger768, Fp768Parameters);
impl_field_into_bigint!(Fp832, BigInteger832, Fp832Parameters);
impl_prime_field_serializer!(Fp256, Fp256Parameters, 32);
impl_prime_field_serializer!(Fp320, Fp320Parameters, 40);
impl_prime_field_serializer!(Fp384, Fp384Parameters, 48);
impl_prime_field_serializer!(Fp768, Fp768Parameters, 96);
impl_prime_field_serializer!(Fp832, Fp832Parameters, 104);
pub fn batch_inversion<F: Field>(v: &mut [F]) {
let mut prod = Vec::with_capacity(v.len());
let mut tmp = F::one();
for f in v.iter().filter(|f| !f.is_zero()) {
tmp.mul_assign(&f);
prod.push(tmp);
}
tmp = tmp.inverse().unwrap();
for (f, s) in v
.iter_mut()
.rev()
.filter(|f| !f.is_zero())
.zip(prod.into_iter().rev().skip(1).chain(Some(F::one())))
{
let newtmp = tmp * &f;
*f = tmp * &s;
tmp = newtmp;
}
}