MCPcopy Create free account
hub / github.com/data61/MP-SPDZ / init

Method init

Math/Zp_Data.cpp:7–66  ·  view source on GitHub ↗

Source from the content-addressed store, hash-verified

5
6
7void Zp_Data::init(const bigint& p,bool mont)
8{
9 lock.lock();
10
11 if (pr != 0)
12 {
13#ifdef VERBOSE
14 if (pr != p)
15 cerr << "Changing prime from " << pr << " to " << p << endl;
16 if (mont != montgomery)
17 cerr << "Changing Montgomery" << endl;
18#endif
19 if (pr != p or mont != montgomery)
20 throw runtime_error("Zp_Data instance already initialized");
21 }
22
23 if (not probPrime(p))
24 throw runtime_error(p.get_str() + " is not a prime");
25
26 pr=p;
27 pr_half = p / 2;
28 mask=static_cast<mp_limb_t>(1ULL<<((mpz_sizeinbase(pr.get_mpz_t(),2)-1)%(8*sizeof(mp_limb_t))))-1;
29 pr_byte_length = numBytes(pr);
30 pr_bit_length = numBits(pr);
31 int k = pr_bit_length;
32 overhang = (uint64_t(-1LL) >> (63 - (k - 1) % 64));
33
34 montgomery=mont;
35 t=mpz_size(pr.get_mpz_t());
36 if (t>MAX_MOD_SZ)
37 throw max_mod_sz_too_small(t);
38 if (montgomery)
39 { inline_mpn_zero(R,MAX_MOD_SZ);
40 inline_mpn_zero(R2,MAX_MOD_SZ);
41 inline_mpn_zero(R3,MAX_MOD_SZ);
42 bigint r=2,pp=pr;
43 mpz_pow_ui(r.get_mpz_t(),r.get_mpz_t(),t*8*sizeof(mp_limb_t));
44 mpz_invert(pp.get_mpz_t(),pr.get_mpz_t(),r.get_mpz_t());
45 pp=r-pp; // pi=-1/p mod R
46 pi=(pp.get_mpz_t()->_mp_d)[0];
47
48 r=r%pr;
49 mpn_copyi(R,r.get_mpz_t()->_mp_d,mpz_size(r.get_mpz_t()));
50
51 bigint r2=(r*r)%pr;
52 mpn_copyi(R2,r2.get_mpz_t()->_mp_d,mpz_size(r2.get_mpz_t()));
53
54 bigint r3=(r2*r)%pr;
55 mpn_copyi(R3,r3.get_mpz_t()->_mp_d,mpz_size(r3.get_mpz_t()));
56
57 if (sizeof(unsigned long)!=sizeof(mp_limb_t))
58 { cout << "The underlying types of GMP mean we cannot use our Montgomery code" << endl;
59 throw not_implemented();
60 }
61 }
62 inline_mpn_zero(prA,MAX_MOD_SZ+1);
63 mpn_copyi(prA,pr.get_mpz_t()->_mp_d,t);
64

Callers 1

Zp_Data.cppFile · 0.45

Calls 9

runtime_errorFunction · 0.85
probPrimeFunction · 0.85
numBytesFunction · 0.85
numBitsFunction · 0.85
inline_mpn_zeroFunction · 0.85
not_implementedClass · 0.85
lockMethod · 0.45
unlockMethod · 0.45

Tested by

no test coverage detected