@@ -17,66 +17,75 @@ let required_extension_size: -> int = || match known_field() {
1717 None => panic( "The permutation/lookup argument is not implemented for the current field!" )
1818} ;
1919
20- /// Wrapper around Fp2 and Fp4 to abstract which extension field is used.
20+ /// Wrapper around T , Fp2<T> and Fp4<T> to abstract which extension field is used (if any) .
2121/// Once PIL supports traits , we can remove this type and the functions below.
2222enum Ext<T> {
23+ Fp(T) ,
2324 Fp2( std ::math::fp2::Fp2<T>) ,
2425 Fp4( std ::math::fp4::Fp4<T>)
2526}
2627
2728let<T: Add > add_ext: Ext<T> , Ext<T> - > Ext<T> = |a , b| match (a , b) {
29+ (Ext::Fp(aa) , Ext::Fp(bb)) => Ext::Fp(aa + bb) ,
2830 (Ext::Fp2(aa) , Ext::Fp2(bb)) => Ext::Fp2( std ::math::fp2::add_ext(aa , bb)) ,
2931 (Ext::Fp4(aa) , Ext::Fp4(bb)) => Ext::Fp4( std ::math::fp4::add_ext(aa , bb)) ,
3032 _ => panic( "Operands have different types" )
3133} ;
3234
3335let<T: Sub > sub_ext: Ext<T> , Ext<T> - > Ext<T> = |a , b| match (a , b) {
36+ (Ext::Fp(aa) , Ext::Fp(bb)) => Ext::Fp(aa - bb) ,
3437 (Ext::Fp2(aa) , Ext::Fp2(bb)) => Ext::Fp2( std ::math::fp2::sub_ext(aa , bb)) ,
3538 (Ext::Fp4(aa) , Ext::Fp4(bb)) => Ext::Fp4( std ::math::fp4::sub_ext(aa , bb)) ,
3639 _ => panic( "Operands have different types" )
3740} ;
3841
3942let<T: Add + FromLiteral + Mul > mul_ext: Ext<T> , Ext<T> - > Ext<T> = |a , b| match (a , b) {
43+ (Ext::Fp(aa) , Ext::Fp(bb)) => Ext::Fp(aa * bb) ,
4044 (Ext::Fp2(aa) , Ext::Fp2(bb)) => Ext::Fp2( std ::math::fp2::mul_ext(aa , bb)) ,
4145 (Ext::Fp4(aa) , Ext::Fp4(bb)) => Ext::Fp4( std ::math::fp4::mul_ext(aa , bb)) ,
4246 _ => panic( "Operands have different types" )
4347} ;
4448
4549let eval_ext: Ext<expr> - > Ext<fe> = query |a| match a {
50+ Ext::Fp(aa) => Ext::Fp( std ::prover::eval(aa)) ,
4651 Ext::Fp2(aa) => Ext::Fp2( std ::math::fp2::eval_ext(aa)) ,
4752 Ext::Fp4(aa) => Ext::Fp4( std ::math::fp4::eval_ext(aa)) ,
4853} ;
4954
5055let inv_ext: Ext<fe> - > Ext<fe> = query |a| match a {
56+ Ext::Fp(aa) => Ext::Fp( std ::math::ff::inv_field(aa)) ,
5157 Ext::Fp2(aa) => Ext::Fp2( std ::math::fp2::inv_ext(aa)) ,
5258 Ext::Fp4(aa) => Ext::Fp4( std ::math::fp4::inv_ext(aa)) ,
5359} ;
5460
5561let<T> unpack_ext_array: Ext<T> - > T [] = |a| match a {
62+ Ext::Fp(aa) => [ aa ],
5663 Ext::Fp2(aa) => std ::math::fp2::unpack_ext_array(aa) ,
5764 Ext::Fp4(aa) => std ::math::fp4::unpack_ext_array(aa) ,
5865} ;
5966
6067let next_ext: Ext<expr> - > Ext<expr> = |a| match a {
68+ Ext::Fp(aa) => Ext::Fp(aa') ,
6169 Ext::Fp2(aa) => Ext::Fp2( std ::math::fp2::next_ext(aa)) ,
6270 Ext::Fp4(aa) => Ext::Fp4( std ::math::fp4::next_ext(aa)) ,
6371} ;
6472
6573let<T: FromLiteral> from_base: T - > Ext<T> = |x| match required_extension_size() {
66- 1 => Ext::Fp2( std ::math::fp2::from_base(x) ),
74+ 1 => Ext::Fp(x ) ,
6775 2 => Ext::Fp2( std ::math::fp2::from_base(x)) ,
6876 4 => Ext::Fp4( std ::math::fp4::from_base(x)) ,
6977 _ => panic( "Expected 1, 2, or 4" )
7078} ;
7179
72- let<T: FromLiteral > from_array: T [] - > Ext<T> = |arr| match len(arr) {
73- 1 => Ext::Fp2( std ::math::fp2::from_array( arr) ),
80+ let<T> from_array: T [] - > Ext<T> = |arr| match len(arr) {
81+ 1 => Ext::Fp( arr [ 0 ] ) ,
7482 2 => Ext::Fp2( std ::math::fp2::from_array(arr)) ,
7583 4 => Ext::Fp4( std ::math::fp4::Fp4::Fp4(arr [ 0 ], arr [ 1 ], arr [ 2 ], arr [ 3 ] )) ,
7684 _ => panic( "Expected 1, 2, or 4" )
7785} ;
7886
7987let constrain_eq_ext: Ext<expr> , Ext<expr> - > Constr [] = |a , b| match (a , b) {
88+ (Ext::Fp(aa) , Ext::Fp(bb)) => [ aa = bb ],
8089 (Ext::Fp2(aa) , Ext::Fp2(bb)) => std ::math::fp2::constrain_eq_ext(aa , bb) ,
8190 (Ext::Fp4(aa) , Ext::Fp4(bb)) => std ::math::fp4::constrain_eq_ext(aa , bb) ,
8291 _ => panic( "Operands have different types" )
0 commit comments