-
Notifications
You must be signed in to change notification settings - Fork 10
/
Copy pathEC_MNT4_InitFields.hpp
106 lines (89 loc) · 5.27 KB
/
EC_MNT4_InitFields.hpp
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
#ifndef _SNARKLIB_EC_MNT4_INIT_FIELDS_HPP_
#define _SNARKLIB_EC_MNT4_INIT_FIELDS_HPP_
#include <snarklib/EC.hpp>
#include <snarklib/EC_MNT4_Modulus.hpp>
namespace snarklib {
////////////////////////////////////////////////////////////////////////////////
// MNT4
// initialize fields
//
// MODULUS is: modulus_r; modulus_q
template <mp_size_t N, const BigInt<N>& MODULUS>
class MNT4_InitFields : public ECInitField<N, MODULUS, MNT4_InitFields<N, MODULUS>> // CRTP
{
typedef ECInitField<N, MODULUS, MNT4_InitFields<N, MODULUS>> BASE;
public:
static const BigInt<MNT4_Modulus::r_limbs>& modulus_r() {
return MNT4_Modulus::modulus_r();
}
static const BigInt<MNT4_Modulus::q_limbs>& modulus_q() {
return MNT4_Modulus::modulus_q();
}
typedef typename BASE::Fp F;
typedef typename BASE::Fp2 F2;
typedef typename BASE::Fp4 F4;
static void initModulusR()
{
if (8 == sizeof(mp_limb_t))
{
F::params.Rsquared("163983144722506446826715124368972380525894397127205577781234305496325861831001705438796139");
F::params.Rcubed("207236281459091063710247635236340312578688659363066707916716212805695955118593239854980171");
F::params.inv(0xbb4334a3ffffffff);
}
if (4 == sizeof(mp_limb_t))
{
F::params.Rsquared("163983144722506446826715124368972380525894397127205577781234305496325861831001705438796139");
F::params.Rcubed("207236281459091063710247635236340312578688659363066707916716212805695955118593239854980171");
F::params.inv(0xffffffff);
}
F::params.num_bits(298);
F::params.euler("237961143084630662876674624826524225772562439276411757776633867869582323653704245279981568");
F::params.s(34);
F::params.t("27702323054502562488973446286577291993024111641153199339359284829066871159442729");
F::params.t_minus_1_over_2("13851161527251281244486723143288645996512055820576599669679642414533435579721364");
F::params.multiplicative_generator("10");
F::params.root_of_unity("120638817826913173458768829485690099845377008030891618010109772937363554409782252579816313");
F::params.nqr("5");
F::params.nqr_to_t("406220604243090401056429458730298145937262552508985450684842547562990900634752279902740880");
}
static void initModulusQ()
{
if (8 == sizeof(mp_limb_t))
{
F::params.Rsquared("273000478523237720910981655601160860640083126627235719712980612296263966512828033847775776");
F::params.Rcubed("427298980065529822574935274648041073124704261331681436071990730954930769758106792920349077");
F::params.inv(0xb071a1b67165ffff);
}
if (4 == sizeof(mp_limb_t))
{
F::params.Rsquared("273000478523237720910981655601160860640083126627235719712980612296263966512828033847775776");
F::params.Rcubed("427298980065529822574935274648041073124704261331681436071990730954930769758106792920349077");
F::params.inv(0x7165ffff);
}
F::params.num_bits(298);
F::params.euler("237961143084630662876674624826524225772562439621347362697777564288105131408977900241879040");
F::params.s(17);
F::params.t("3630998887399759870554727551674258816109656366292531779446068791017229177993437198515");
F::params.t_minus_1_over_2("1815499443699879935277363775837129408054828183146265889723034395508614588996718599257");
F::params.multiplicative_generator("17");
F::params.root_of_unity("264706250571800080758069302369654305530125675521263976034054878017580902343339784464690243");
F::params.nqr("17");
F::params.nqr_to_t("264706250571800080758069302369654305530125675521263976034054878017580902343339784464690243");
F2::params.euler("113251011236288135098249345249154230895914381858788918106847214243419142422924133497460817468249854833067260038985710370091920860837014281886963086681184370139950267830740466401280");
F2::params.s(18);
F2::params.t("864036645784668999467844736092790457885088972921668381552484239528039111503022258739172496553419912972009735404859240494475714575477709059806542104196047745818712370534824115");
F2::params.t_minus_1_over_2("432018322892334499733922368046395228942544486460834190776242119764019555751511129369586248276709956486004867702429620247237857287738854529903271052098023872909356185267412057");
F2::params.non_residue("17");
F2::params.nqr("8", "1");
F2::params.nqr_to_t("0", "29402818985595053196743631544512156561638230562612542604956687802791427330205135130967658");
F2::params.Frobenius_coeffs_c1(0, "1");
F2::params.Frobenius_coeffs_c1(1, "475922286169261325753349249653048451545124879242694725395555128576210262817955800483758080");
F4::params.non_residue("17");
F4::params.Frobenius_coeffs_c1(0, "1");
F4::params.Frobenius_coeffs_c1(1, "7684163245453501615621351552473337069301082060976805004625011694147890954040864167002308");
F4::params.Frobenius_coeffs_c1(2, "475922286169261325753349249653048451545124879242694725395555128576210262817955800483758080");
F4::params.Frobenius_coeffs_c1(3, "468238122923807824137727898100575114475823797181717920390930116882062371863914936316755773");
}
};
} // namespace snarklib
#endif