Changeset 287cc8 in git
- Timestamp:
- Jan 5, 2010, 5:51:13 PM (13 years ago)
- Branches:
- (u'spielwiese', '0d6b7fcd9813a1ca1ed4220cfa2b104b97a0a003')
- Children:
- 3c38b3810fd61108b01f123f5a91e13ccff52b20
- Parents:
- 1d43d184dd871d77c1ba8e095d768f22a0fbe92f
- Location:
- ntl
- Files:
-
- 99 edited
Legend:
- Unmodified
- Added
- Removed
-
ntl/COPYING
r1d43d18 r287cc8 1 1 2 2 COPYRIGHT NOTICE 3 for NTL 5. 43 for NTL 5.5 4 4 (modified for Singular 2-0-6 - 3-1) 5 5 6 6 NTL -- A Library for Doing Number Theory 7 Copyright (C) 1996-200 5Victor Shoup7 Copyright (C) 1996-2009 Victor Shoup 8 8 9 9 The most recent version of NTL is available at http://www.shoup.net -
ntl/doc/ZZ.txt
r1d43d18 r287cc8 141 141 // PROMOTIONS: operator * and procedure mul support promotion 142 142 // from long to ZZ on (a, b). 143 144 /**************************************************************************\ 145 146 Combined Multiply and Add 147 148 \**************************************************************************/ 149 150 151 void MulAddTo(ZZ& x, const ZZ& a, const ZZ& b); // x += a*b 152 void MulAddTo(ZZ& x, const ZZ& a, long b); // x += a*b 153 154 155 void MulSubFrom(ZZ& x, const ZZ& a, const ZZ& b); // x -= a*b 156 void MulSubFrom(ZZ& x, const ZZ& a, long b); // x -= a*b 157 158 // NOTE: these are provided for both convenience and efficiency. 159 // The single-precision versions may be significantly 160 // faster than the code sequence 161 // mul(tmp, a, b); add(x, x, tmp); 162 143 163 144 164 -
ntl/doc/tour-changes.html
r1d43d18 r287cc8 17 17 </p> 18 18 </h1> 19 20 <p> <hr> <p> 21 <h3> 22 2009.08.14: Changes between NTL 5.5.1 and 5.5.2 23 </h3> 24 25 <ul> 26 <li> 27 New routines <tt>MulAddTo</tt> and <tt>MulSubFrom</tt> 28 for computing <tt>x += a*b</tt> and <tt>x -= a*b</tt>, 29 where <tt>x</tt> and <tt>a</tt> are <tt>ZZ</tt>'s and 30 <tt>b</tt> is a <tt>ZZ</tt> or a <tt>long</tt>. 31 In the case where <tt>b</tt> is a <tt>long</tt>, 32 this may be much faster than writing 33 <tt>mul(t, a, b); add(x, x, t)</tt>. 34 See <a href="ZZ.txt">ZZ.txt</a> for details. 35 36 These new routines are used in a number of places in 37 NTL to get faster algorithms (for example, the <tt>LLL</tt> routine). 38 39 <li> 40 Fixed a relatively benign indexing bug in <tt>GF2EX</tt> 41 discovered by Berend-Benjamin Tams using the <tt>valgrind</tt> tool. 42 43 44 45 46 </ul> 19 47 20 48 <p> <hr> <p> -
ntl/doc/tour-unix.html
r1d43d18 r287cc8 502 502 in this case, you will want to set 503 503 <tt>LIBTOOL=glibtool</tt>. 504 On other systems, it may be necssary to downl aod and504 On other systems, it may be necssary to download and 505 505 install a fresh copy of the libtool program (which can be obtained from 506 506 <a href="http://www.gnu.org/software/libtool">here</a>). -
ntl/include/NTL/ZZ.h
r1d43d18 r287cc8 421 421 { mul(x, x, a); return x; } 422 422 423 // x += a*b 424 425 inline void 426 MulAddTo(ZZ& x, const ZZ& a, long b) 427 { 428 NTL_zsaddmul(a.rep, b, &x.rep); 429 } 430 431 inline void 432 MulAddTo(ZZ& x, const ZZ& a, const ZZ& b) 433 { 434 NTL_zaddmul(a.rep, b.rep, &x.rep); 435 } 436 437 // x -= a*b 438 439 inline void 440 MulSubFrom(ZZ& x, const ZZ& a, long b) 441 { 442 NTL_zssubmul(a.rep, b, &x.rep); 443 } 444 445 inline void 446 MulSubFrom(ZZ& x, const ZZ& a, const ZZ& b) 447 { 448 NTL_zsubmul(a.rep, b.rep, &x.rep); 449 } 450 423 451 424 452 // Special routines for implementing CRT in ZZ_pX arithmetic -
ntl/include/NTL/c_lip.h
r1d43d18 r287cc8 193 193 The division is performed in place (but may sometimes 194 194 cause *r to grow by one digit) */ 195 196 void _ntl_zsaddmul(_ntl_verylong x, long y, _ntl_verylong *ww); 197 /* *ww += x*y */ 198 199 void _ntl_zaddmul(_ntl_verylong x, _ntl_verylong y, _ntl_verylong *ww); 200 /* *ww += x*y */ 201 202 void _ntl_zssubmul(_ntl_verylong x, long y, _ntl_verylong *ww); 203 /* *ww -= x*y */ 204 205 void _ntl_zsubmul(_ntl_verylong x, _ntl_verylong y, _ntl_verylong *ww); 206 /* *ww -= x*y */ 207 195 208 196 209 /******************************************************************** … … 642 655 #define NTL_zzero _ntl_zzero1 643 656 657 #define NTL_zsaddmul _ntl_zsaddmul 658 #define NTL_zaddmul _ntl_zaddmul 659 #define NTL_zssubmul _ntl_zssubmul 660 #define NTL_zsubmul _ntl_zsubmul 661 -
ntl/include/NTL/g_lip.h
r1d43d18 r287cc8 95 95 assumes b > 0 and *r >= 0; 96 96 cause *r to grow by one digit) */ 97 98 void _ntl_gsaddmul(_ntl_gbigint x, long y, _ntl_gbigint *ww); 99 /* *ww += x*y */ 100 101 void _ntl_gaddmul(_ntl_gbigint x, _ntl_gbigint y, _ntl_gbigint *ww); 102 /* *ww += x*y */ 103 104 void _ntl_gssubmul(_ntl_gbigint x, long y, _ntl_gbigint *ww); 105 /* *ww -= x*y */ 106 107 void _ntl_gsubmul(_ntl_gbigint x, _ntl_gbigint y, _ntl_gbigint *ww); 108 /* *ww -= x*y */ 109 97 110 98 111 /******************************************************************** … … 529 542 #define NTL_zzero _ntl_gzero 530 543 544 #define NTL_zsaddmul _ntl_gsaddmul 545 #define NTL_zaddmul _ntl_gaddmul 546 #define NTL_zssubmul _ntl_gssubmul 547 #define NTL_zsubmul _ntl_gsubmul 548 531 549 #define NTL_GMP_LIP 532 550 -
ntl/include/NTL/tools.h
r1d43d18 r287cc8 251 251 #endif 252 252 long IsWhiteSpace(long c); 253 long IsEOFChar(long c); 253 254 254 255 long CharToIntVal(long c); -
ntl/include/NTL/version.h
r1d43d18 r287cc8 3 3 #define NTL_version__H 4 4 5 #define NTL_VERSION "5.5. 1"5 #define NTL_VERSION "5.5.2" 6 6 7 7 #define NTL_MAJOR_VERSION (5) 8 8 #define NTL_MINOR_VERSION (5) 9 #define NTL_REVISION ( 1)9 #define NTL_REVISION (2) 10 10 11 11 #endif -
ntl/src/CanZassTest.c
r1d43d18 r287cc8 73 73 74 74 cerr << "\n"; 75 75 76 76 77 77 cout << factors << "\n"; -
ntl/src/DIRNAME
r1d43d18 r287cc8 1 ntl-5.5. 11 ntl-5.5.2 -
ntl/src/DoConfig
r1d43d18 r287cc8 86 86 87 87 88 %Variable = (); 89 90 88 91 foreach $arg (@ARGV) { 89 92 … … 94 97 95 98 if (($name, $val) = ($arg =~ /(.*?)=(.*)/)) { 99 100 $Variable{$name} = 0; 96 101 97 102 if (exists($MakeFlag{$name}) && ($val =~ 'on|off')) { … … 139 144 } 140 145 141 # a special MakeVal value that is determined by NTL_GMP_LIP 142 # and NTL_GMP_HACK 143 146 # special GMP variables 147 148 $MakeVal{'GMPI'} = '# '; 149 $MakeVal{'GMPL'} = '# '; 150 $MakeVal{'GMP'} = '# '; 144 151 145 152 if ($ConfigFlag{'NTL_GMP_LIP'} eq 'on' || $ConfigFlag{'NTL_GMP_HACK'} eq 'on') { 146 153 $MakeVal{'GMP'} = ''; 147 } 148 else { 149 $MakeVal{'GMP'} = '# '; 150 } 151 152 # a special MakeVal value that is determined by NTL_GF2X_LIB 154 if (exists($Variable{'DEF_PREFIX'}) || 155 exists($Variable{'GMP_PREFIX'}) || 156 exists($Variable{'GMP_INCDIR'})) { 157 $MakeVal{'GMPI'} = ''; 158 } 159 if (exists($Variable{'DEF_PREFIX'}) || 160 exists($Variable{'GMP_PREFIX'}) || 161 exists($Variable{'GMP_LIBDIR'})) { 162 $MakeVal{'GMPL'} = ''; 163 } 164 } 165 166 # special GF2X variables 167 168 169 $MakeVal{'GF2XI'} = '# '; 170 $MakeVal{'GF2XL'} = '# '; 171 $MakeVal{'GF2X'} = '# '; 153 172 154 173 155 174 if ($ConfigFlag{'NTL_GF2X_LIB'} eq 'on') { 156 175 $MakeVal{'GF2X'} = ''; 157 } 158 else { 159 $MakeVal{'GF2X'} = '# '; 176 if (exists($Variable{'DEF_PREFIX'}) || 177 exists($Variable{'GF2X_PREFIX'}) || 178 exists($Variable{'GF2X_INCDIR'})) { 179 $MakeVal{'GF2XI'} = ''; 180 } 181 if (exists($Variable{'DEF_PREFIX'}) || 182 exists($Variable{'GF2X_PREFIX'}) || 183 exists($Variable{'GF2X_LIBDIR'})) { 184 $MakeVal{'GF2XL'} = ''; 185 } 160 186 } 161 187 -
ntl/src/FFT.c
r1d43d18 r287cc8 29 29 30 30 if (n % 7 == 0) return 0; 31 31 32 32 m = n - 1; 33 33 k = 0; … … 54 54 if (z != 1 || y != n-1) return 0; 55 55 56 if (j == k) 56 if (j == k) 57 57 break; 58 58 } … … 65 65 if (TrialBound > 0) { 66 66 if (!ProbPrime(n, 5)) return 0; 67 67 68 68 /* we have to do trial division by special numbers */ 69 69 70 70 TrialBound = SqrRoot(TrialBound); 71 71 72 72 long a, b; 73 73 74 74 for (a = 1; a <= TrialBound; a++) { 75 75 b = (a << k) + 1; 76 if (n % b == 0) return 0; 76 if (n % b == 0) return 0; 77 77 } 78 78 } … … 127 127 return NTL_FFTMaxRoot; 128 128 else 129 return k; 129 return k; 130 130 } 131 131 … … 146 146 // tables are allocated in increments of 100 147 147 148 if (index == 0) { 148 if (index == 0) { 149 149 FFTPrime = (long *) NTL_MALLOC(100, sizeof(long), 0); 150 150 RootTable = (long **) NTL_MALLOC(100, sizeof(long *), 0); … … 155 155 else if ((index % 100) == 0) { 156 156 FFTPrime = (long *) NTL_REALLOC(FFTPrime, index+100, sizeof(long), 0); 157 RootTable = (long **) 157 RootTable = (long **) 158 158 NTL_REALLOC(RootTable, index+100, sizeof(long *), 0); 159 RootInvTable = (long **) 159 RootInvTable = (long **) 160 160 NTL_REALLOC(RootInvTable, index+100, sizeof(long *), 0); 161 TwoInvTable = (long **) 161 TwoInvTable = (long **) 162 162 NTL_REALLOC(TwoInvTable, index+100, sizeof(long *), 0); 163 FFTPrimeInv = (double *) 163 FFTPrimeInv = (double *) 164 164 NTL_REALLOC(FFTPrimeInv, index+100, sizeof(double), 0); 165 165 } 166 166 167 167 if (!FFTPrime || !RootTable || !RootInvTable || !TwoInvTable || 168 !FFTPrimeInv) 168 !FFTPrimeInv) 169 169 Error("out of space"); 170 170 … … 200 200 NumFFTPrimes++; 201 201 } 202 202 203 203 204 204 static … … 207 207 long j, m; 208 208 209 j = k; 209 j = k; 210 210 m = 1L << (k-1); 211 211 … … 272 272 // assume k > 1 273 273 274 274 275 275 276 276 static long tab_size = 0; … … 282 282 283 283 wtab = (long *) NTL_MALLOC(1L << (k-2), sizeof(long), 0); 284 wqinvtab = (mulmod_precon_t *) 284 wqinvtab = (mulmod_precon_t *) 285 285 NTL_MALLOC(1L << (k-2), sizeof(mulmod_precon_t), 0); 286 286 if (!wtab || !wqinvtab) Error("out of space"); … … 290 290 291 291 wtab = (long *) NTL_REALLOC(wtab, 1L << (k-2), sizeof(long), 0); 292 wqinvtab = (mulmod_precon_t *) 292 wqinvtab = (mulmod_precon_t *) 293 293 NTL_REALLOC(wqinvtab, 1L << (k-2), sizeof(mulmod_precon_t), 0); 294 294 if (!wtab || !wqinvtab) Error("out of space"); … … 320 320 } 321 321 322 323 322 323 324 324 for (s = 2; s < k; s++) { 325 325 m = 1L << s; … … 341 341 for (i = 0; i < n; i+= m) { 342 342 343 343 344 344 t = A[i + m_half]; 345 345 u = A[i]; … … 402 402 t = MulModPrecon(A[j + m_half], wtab[j >> 1], q, wqinvtab[j >> 1]); 403 403 u = A[j]; 404 t1 = MulModPrecon(A[j + 1+ m_half], wtab[j >> 1], q, 404 t1 = MulModPrecon(A[j + 1+ m_half], wtab[j >> 1], q, 405 405 wqinvtab[j >> 1]); 406 406 t1 = MulModPrecon(t1, w, q, wqinv); … … 411 411 A[j + 1] = AddMod(u1, t1, q); 412 412 A[j + 1 + m_half] = SubMod(u1, t1, q); 413 413 414 414 } 415 415 } -
ntl/src/FacVec.c
r1d43d18 r287cc8 60 60 (fvec[NumFactors].a)++; 61 61 fvec[NumFactors].val *= q; 62 } 62 } 63 63 fvec[NumFactors].link = -1; 64 64 NumFactors++; -
ntl/src/GF2.c
r1d43d18 r287cc8 38 38 } 39 39 40 if (e < 0 && a == 0) 40 if (e < 0 && a == 0) 41 41 Error("GF2: division by zero"); 42 42 -
ntl/src/GF2E.c
r1d43d18 r287cc8 26 26 else if (p.size == 6) 27 27 KarCross = 3; 28 else 28 else 29 29 KarCross = 2; 30 30 … … 57 57 else if (p.size <= 13) 58 58 DivCross = 100; 59 else 59 else 60 60 DivCross = 75; 61 61 … … 80 80 81 81 82 GF2EInfoT *GF2EInfo = 0; 82 GF2EInfoT *GF2EInfo = 0; 83 83 84 84 … … 87 87 88 88 89 static 89 static 90 90 void CopyPointer(GF2EInfoPtr& dst, GF2EInfoPtr src) 91 91 { … … 95 95 dst->ref_count--; 96 96 97 if (dst->ref_count < 0) 97 if (dst->ref_count < 0) 98 98 Error("internal error: negative GF2EContext ref_count"); 99 99 … … 102 102 103 103 if (src) { 104 if (src->ref_count == NTL_MAX_LONG) 104 if (src->ref_count == NTL_MAX_LONG) 105 105 Error("internal error: GF2EContext ref_count overflow"); 106 106 … … 111 111 dst = src; 112 112 } 113 113 114 114 115 115 -
ntl/src/GF2EX.c
r1d43d18 r287cc8 56 56 long j, m; 57 57 58 if (i < 0) 58 if (i < 0) 59 59 Error("SetCoeff: negative index"); 60 60 … … 63 63 64 64 m = deg(x); 65 66 if (i > m && IsZero(a)) return; 65 67 66 68 if (i > m) { … … 114 116 long j, m; 115 117 116 if (i < 0) 118 if (i < 0) 117 119 Error("coefficient index out of range"); 118 120 … … 143 145 return deg(a) == 1 && IsOne(LeadCoeff(a)) && IsZero(ConstTerm(a)); 144 146 } 145 146 147 148 147 149 148 150 const GF2E& coeff(const GF2EX& a, long i) … … 210 212 { 211 213 GF2X a = aa; // in case a aliases the rep of a coefficient of x 212 214 213 215 long n = deg(a)+1; 214 216 long i; … … 235 237 236 238 long i; 237 const GF2E *ap, *bp; 239 const GF2E *ap, *bp; 238 240 GF2E* xp; 239 241 … … 326 328 const GF2E *ap, *bp; 327 329 GF2E *xp; 328 330 329 331 GF2EX la, lb; 330 332 … … 388 390 389 391 390 static 392 static 391 393 void PlainMul1(GF2X *xp, const GF2X *ap, long sa, const GF2X& b) 392 394 { … … 506 508 507 509 static 508 void KarMul(GF2X *c, const GF2X *a, 510 void KarMul(GF2X *c, const GF2X *a, 509 511 long sa, const GF2X *b, long sb, GF2X *stk) 510 512 { … … 514 516 } 515 517 516 if (sb == 1) { 517 if (sa == 1) 518 if (sb == 1) { 519 if (sa == 1) 518 520 mul(*c, *a, *b); 519 521 else … … 531 533 q_add(c[1], c[1], c[0]); 532 534 q_add(c[1], c[1], c[2]); 533 535 534 536 return; 535 537 } … … 618 620 cp[i] = (ap[i+wn] >> bn) | (ap[i+wn+1] << (NTL_BITS_PER_LONG - bn)); 619 621 620 if ( (k + n) % NTL_BITS_PER_LONG != 0)622 if (k > sc*NTL_BITS_PER_LONG - bn) 621 623 cp[sc-1] = (ap[sc+wn-1] >> bn)|(ap[sc+wn] << (NTL_BITS_PER_LONG - bn)); 622 624 else … … 625 627 626 628 long p = k % NTL_BITS_PER_LONG; 627 if (p != 0) 629 if (p != 0) 628 630 cp[sc-1] &= ((1UL << p) - 1UL); 629 631 … … 649 651 paa[i] = 0; 650 652 651 for (i = 0; i < sa; i++) 653 for (i = 0; i < sa; i++) 652 654 ShiftAdd(paa, rep(a.rep[i]).xrep.elts(), rep(a.rep[i]).xrep.length(), 653 655 blocksz*i); 654 656 655 aa.normalize(); 657 aa.normalize(); 656 658 } 657 659 … … 736 738 return; 737 739 } 738 740 739 741 740 742 /* karatsuba */ … … 751 753 752 754 GF2XVec stk; 753 stk.SetSize(sp + 2*(sa+sb)-1, 2*GF2E::WordLength()); 755 stk.SetSize(sp + 2*(sa+sb)-1, 2*GF2E::WordLength()); 754 756 755 757 long i; … … 761 763 stk[i+2*sa+sb-1] = rep(b.rep[i]); 762 764 763 KarMul(&stk[0], &stk[sa+sb-1], sa, &stk[2*sa+sb-1], sb, 765 KarMul(&stk[0], &stk[sa+sb-1], sa, &stk[2*sa+sb-1], sb, 764 766 &stk[2*(sa+sb)-1]); 765 767 … … 1168 1170 1169 1171 1170 inv(t, LeadCoeff(x)); 1171 mul(x, x, t); 1172 } 1173 1174 1175 1176 1172 inv(t, LeadCoeff(x)); 1173 mul(x, x, t); 1174 } 1175 1176 1177 1178 1177 1179 1178 1180 void XGCD(GF2EX& d, GF2EX& s, GF2EX& t, const GF2EX& a, const GF2EX& b) … … 1194 1196 long e = max(deg(a), deg(b)) + 1; 1195 1197 1196 GF2EX temp(INIT_SIZE, e), u(INIT_SIZE, e), v(INIT_SIZE, e), 1197 u0(INIT_SIZE, e), v0(INIT_SIZE, e), 1198 u1(INIT_SIZE, e), v1(INIT_SIZE, e), 1198 GF2EX temp(INIT_SIZE, e), u(INIT_SIZE, e), v(INIT_SIZE, e), 1199 u0(INIT_SIZE, e), v0(INIT_SIZE, e), 1200 u1(INIT_SIZE, e), v1(INIT_SIZE, e), 1199 1201 u2(INIT_SIZE, e), v2(INIT_SIZE, e), q(INIT_SIZE, e); 1200 1202 … … 1236 1238 void MulMod(GF2EX& x, const GF2EX& a, const GF2EX& b, const GF2EX& f) 1237 1239 { 1238 if (deg(a) >= deg(f) || deg(b) >= deg(f) || deg(f) == 0) 1240 if (deg(a) >= deg(f) || deg(b) >= deg(f) || deg(f) == 0) 1239 1241 Error("MulMod: bad args"); 1240 1242 … … 1350 1352 1351 1353 for (i = 0; i < n; i++) 1352 random(x.rep[i]); 1354 random(x.rep[i]); 1353 1355 1354 1356 x.normalize(); … … 1381 1383 1382 1384 x.normalize(); 1383 } 1385 } 1384 1386 1385 1387 … … 1387 1389 void trunc(GF2EX& x, const GF2EX& a, long m) 1388 1390 1389 // x = a % X^m, output may alias input 1391 // x = a % X^m, output may alias input 1390 1392 1391 1393 { … … 1791 1793 return k; 1792 1794 } 1793 1795 1794 1796 1795 1797 … … 1857 1859 1858 1860 v[0] = g; 1859 1861 1860 1862 if (k > 1) { 1861 1863 GF2EX t; … … 1873 1875 val = 0; 1874 1876 for (i = n-1; i >= 0; i--) { 1875 val = (val << 1) | bit(e, i); 1877 val = (val << 1) | bit(e, i); 1876 1878 if (val == 0) 1877 1879 SqrMod(res, res, F); … … 1905 1907 } 1906 1908 1907 1909 1908 1910 1909 1911 … … 1938 1940 1939 1941 1940 1942 1941 1943 1942 1944 … … 1958 1960 mul(P1, P2, b); 1959 1961 add(P1, P1, a); 1960 1962 1961 1963 r = P1; 1962 1964 } … … 1979 1981 mul(P1, P2, b); 1980 1982 add(P1, P1, a); 1981 1983 1982 1984 r = P1; 1983 1985 q = P2; … … 1999 2001 mul(P2, P1, P2); 2000 2002 RightShift(P2, P2, da-db); 2001 2003 2002 2004 q = P2; 2003 2005 } … … 2059 2061 q = a; 2060 2062 } 2061 2063 2062 2064 2063 2065 … … 2121 2123 long da = deg(a); 2122 2124 long i; 2123 2125 2124 2126 if (da < n) { 2125 2127 clear(x); … … 2147 2149 2148 2150 if (n < 0) { 2149 if (n < -NTL_MAX_LONG) 2151 if (n < -NTL_MAX_LONG) 2150 2152 clear(x); 2151 2153 else … … 2214 2216 mul(a[0], a[0], b); 2215 2217 } 2216 } 2218 } 2217 2219 2218 2220 … … 2266 2268 b.SetLength(m); 2267 2269 long i; 2268 for (i = 0; i < m; i++) 2270 for (i = 0; i < m; i++) 2269 2271 eval(b[i], f, a[i]); 2270 2272 } … … 2341 2343 } 2342 2344 2343 2344 void InnerProduct(GF2EX& x, const vec_GF2E& v, long low, long high, 2345 2346 void InnerProduct(GF2EX& x, const vec_GF2E& v, long low, long high, 2345 2347 const vec_GF2EX& H, long n, GF2XVec& t) 2346 2348 { … … 2370 2372 2371 2373 2372 void CompMod(GF2EX& x, const GF2EX& g, const GF2EXArgument& A, 2374 void CompMod(GF2EX& x, const GF2EX& g, const GF2EXArgument& A, 2373 2375 const GF2EXModulus& F) 2374 2376 { … … 2420 2422 set(A.H[0]); 2421 2423 A.H[1] = h; 2422 for (i = 2; i <= m; i++) 2424 for (i = 2; i <= m; i++) 2423 2425 MulMod(A.H[i], A.H[i-1], h, F); 2424 2426 } … … 2475 2477 } 2476 2478 2477 void Comp3Mod(GF2EX& x1, GF2EX& x2, GF2EX& x3, 2479 void Comp3Mod(GF2EX& x1, GF2EX& x2, GF2EX& x3, 2478 2480 const GF2EX& g1, const GF2EX& g2, const GF2EX& g3, 2479 2481 const GF2EX& h, const GF2EXModulus& F) … … 2527 2529 B.shamt_fbi = 0; 2528 2530 else 2529 B.shamt_fbi = F.n-2 - d; 2531 B.shamt_fbi = F.n-2 - d; 2530 2532 2531 2533 CopyReverse(B.fbi, t, d); 2532 2534 2533 // The following code optimizes the case when 2535 // The following code optimizes the case when 2534 2536 // f = X^n + low degree poly 2535 2537 … … 2574 2576 2575 2577 2576 void UpdateMap(vec_GF2E& x, const vec_GF2E& a, 2578 void UpdateMap(vec_GF2E& x, const vec_GF2E& a, 2577 2579 const GF2EXTransMultiplier& B, const GF2EXModulus& F) 2578 2580 { … … 2581 2583 x = xx.rep; 2582 2584 } 2583 2585 2584 2586 2585 2587 2586 2588 static 2587 void ProjectPowers(vec_GF2E& x, const GF2EX& a, long k, 2589 void ProjectPowers(vec_GF2E& x, const GF2EX& a, long k, 2588 2590 const GF2EXArgument& H, const GF2EXModulus& F) 2589 2591 { 2590 if (k < 0 || NTL_OVERFLOW(k, 1, 0) || deg(a) >= F.n) 2592 if (k < 0 || NTL_OVERFLOW(k, 1, 0) || deg(a) >= F.n) 2591 2593 Error("ProjectPowers: bad args"); 2592 2594 … … 2614 2616 2615 2617 static 2616 void ProjectPowers(vec_GF2E& x, const GF2EX& a, long k, const GF2EX& h, 2618 void ProjectPowers(vec_GF2E& x, const GF2EX& a, long k, const GF2EX& h, 2617 2619 const GF2EXModulus& F) 2618 2620 { … … 2639 2641 } 2640 2642 2641 void ProjectPowers(vec_GF2E& x, const vec_GF2E& a, long k, 2643 void ProjectPowers(vec_GF2E& x, const vec_GF2E& a, long k, 2642 2644 const GF2EX& h, const GF2EXModulus& F) 2643 2645 { … … 2704 2706 } 2705 2707 2706 // cerr << "finished: " << L << " " << deg(Lambda) << "\n"; 2708 // cerr << "finished: " << L << " " << deg(Lambda) << "\n"; 2707 2709 2708 2710 dl = deg(Lambda); … … 2726 2728 2727 2729 2728 void DoMinPolyMod(GF2EX& h, const GF2EX& g, const GF2EXModulus& F, long m, 2730 void DoMinPolyMod(GF2EX& h, const GF2EX& g, const GF2EXModulus& F, long m, 2729 2731 const GF2EX& R) 2730 2732 { … … 2770 2772 GF2EX R; 2771 2773 GF2EXTransMultiplier H1; 2772 2774 2773 2775 2774 2776 for (;;) { … … 2839 2841 GF2EX lq, r; 2840 2842 DivRem(lq, r, a, b); 2841 if (!IsZero(r)) return 0; 2843 if (!IsZero(r)) return 0; 2842 2844 q = lq; 2843 2845 return 1; … … 2849 2851 GF2EX lq, r; 2850 2852 DivRem(lq, r, a, b); 2851 if (!IsZero(r)) return 0; 2853 if (!IsZero(r)) return 0; 2852 2854 return 1; 2853 2855 } … … 2914 2916 res.SetMaxLength(da*e + 1); 2915 2917 res = 1; 2916 2918 2917 2919 long k = NumBits(e); 2918 2920 long i; … … 3025 3027 Error("trace: bad args"); 3026 3028 3027 if (F.tracevec.length() == 0) 3029 if (F.tracevec.length() == 0) 3028 3030 ComputeTraceVec(F); 3029 3031 … … 3043 3045 { 3044 3046 GF2E res; 3045 3047 3046 3048 if (IsZero(a) || IsZero(b)) 3047 3049 clear(res); 3048 else if (deg(a) == 0 && deg(b) == 0) 3050 else if (deg(a) == 0 && deg(b) == 0) 3049 3051 set(res); 3050 3052 else { … … 3081 3083 else 3082 3084 clear(res); 3083 3085 3084 3086 break; 3085 3087 } … … 3092 3094 void resultant(GF2E& rres, const GF2EX& a, const GF2EX& b) 3093 3095 { 3094 PlainResultant(rres, a, b); 3096 PlainResultant(rres, a, b); 3095 3097 } 3096 3098 … … 3098 3100 void NormMod(GF2E& x, const GF2EX& a, const GF2EX& f) 3099 3101 { 3100 if (deg(f) <= 0 || deg(a) >= deg(f)) 3102 if (deg(f) <= 0 || deg(a) >= deg(f)) 3101 3103 Error("norm: bad args"); 3102 3104 … … 3179 3181 3180 3182 3181 void CompTower(GF2EX& x, const GF2X& g, const GF2EX& h, 3183 void CompTower(GF2EX& x, const GF2X& g, const GF2EX& h, 3182 3184 const GF2EXModulus& F) 3183 3185 // x = g(h) mod f … … 3213 3215 } 3214 3216 3215 void ProjectedInnerProduct(GF2& x, const vec_GF2E& a, 3217 void ProjectedInnerProduct(GF2& x, const vec_GF2E& a, 3216 3218 const vec_vec_GF2& b) 3217 3219 { … … 3317 3319 3318 3320 ProjectPowersTower(x, R, 2*m, g, F, proj); 3319 3321 3320 3322 MinPolySeq(h, x, m); 3321 3323 } 3322 3324 3323 3325 3324 void ProbMinPolyTower(GF2X& h, const GF2EX& g, const GF2EXModulus& F, 3326 void ProbMinPolyTower(GF2X& h, const GF2EX& g, const GF2EXModulus& F, 3325 3327 long m) 3326 3328 { … … 3339 3341 } 3340 3342 3341 void ProbMinPolyTower(GF2X& h, const GF2EX& g, const GF2EXModulus& F, 3343 void ProbMinPolyTower(GF2X& h, const GF2EX& g, const GF2EXModulus& F, 3342 3344 long m, const vec_GF2& proj) 3343 3345 { … … 3380 3382 vec_GF2E R; 3381 3383 GF2EXTransMultiplier H1; 3382 3384 3383 3385 3384 3386 for (;;) { … … 3393 3395 CompTower(h3, h2, g, F); 3394 3396 MulMod(h1, h3, h1, F); 3395 if (IsZero(h1)) { 3396 hh = h; 3397 return; 3397 if (IsZero(h1)) { 3398 hh = h; 3399 return; 3398 3400 } 3399 3401 } -
ntl/src/GF2EXFactoring.c
r1d43d18 r287cc8 29 29 c = res; 30 30 } 31 31 32 32 33 33 … … 79 79 d = deg(r)/2; 80 80 f.rep.SetLength(d+1); 81 for (k = 0; k <= d; k++) 81 for (k = 0; k <= d; k++) 82 82 IterSqr(f.rep[k], r.rep[k*2], GF2E::degree()-1); 83 83 m = m*2; … … 85 85 } while (!finished); 86 86 } 87 87 88 88 89 89 … … 216 216 SetX(res); 217 217 long i; 218 for (i = 0; i < GF2E::degree(); i++) 218 for (i = 0; i < GF2E::degree(); i++) 219 219 SqrMod(res, res, F); 220 220 … … 241 241 long m1 = 2*m; 242 242 if (i & d) m1++; 243 243 244 244 if (m1 >= NTL_BITS_PER_LONG-1 || (1L << m1) >= n) break; 245 245 246 246 m = m1; 247 247 i = i >> 1; … … 290 290 long m1 = 2*m; 291 291 if (i & d) m1++; 292 292 293 293 if (m1 >= NTL_BITS_PER_LONG-1 || (1L << m1) >= n) break; 294 294 295 295 m = m1; 296 296 i = i >> 1; … … 344 344 345 345 346 346 347 347 348 348 … … 359 359 return; 360 360 } 361 361 362 362 GF2EX h; 363 363 364 364 GF2E r; 365 365 366 366 367 367 { 368 368 GF2EXModulus F; … … 379 379 380 380 RecFindRoots(x, h); 381 div(h, f, h); 381 div(h, f, h); 382 382 RecFindRoots(x, h); 383 383 } … … 435 435 static 436 436 void split(GF2EX& f1, GF2EX& g1, GF2EX& f2, GF2EX& g2, 437 const GF2EX& f, const GF2EX& g, 437 const GF2EX& f, const GF2EX& g, 438 438 const vec_GF2E& roots, long lo, long mid) 439 439 { … … 456 456 457 457 GCD(f1, a, f); 458 458 459 459 div(f2, f, f1); 460 460 … … 520 520 521 521 522 522 523 523 524 524 void SFBerlekamp(vec_GF2EX& factors, const GF2EX& ff, long verbose) … … 619 619 Error("berlekamp: bad args"); 620 620 621 621 622 622 SquareFreeDecomp(sfd, f); 623 623 … … 644 644 645 645 static 646 void ProcessTable(GF2EX& f, vec_pair_GF2EX_long& factors, 646 void ProcessTable(GF2EX& f, vec_pair_GF2EX_long& factors, 647 647 const GF2EXModulus& F, long limit, const vec_GF2EX& tbl, 648 648 long d, long verbose) … … 681 681 682 682 while (2*d <= deg(t1)) { 683 GCD(t2, tbl[i], t1); 683 GCD(t2, tbl[i], t1); 684 684 if (deg(t2) > 0) { 685 685 AddFactor(factors, t2, d, verbose); … … 696 696 697 697 698 void TraceMap(GF2EX& w, const GF2EX& a, long d, const GF2EXModulus& F, 698 void TraceMap(GF2EX& w, const GF2EX& a, long d, const GF2EXModulus& F, 699 699 const GF2EX& b) 700 700 … … 710 710 while (d) { 711 711 if (d == 1) { 712 if (IsZero(w)) 712 if (IsZero(w)) 713 713 w = y; 714 714 else { … … 817 817 long GF2EX_BlockingFactor = 10; 818 818 819 void DDF(vec_pair_GF2EX_long& factors, const GF2EX& ff, const GF2EX& hh, 819 void DDF(vec_pair_GF2EX_long& factors, const GF2EX& ff, const GF2EX& hh, 820 820 long verbose) 821 821 { … … 836 836 } 837 837 838 long CompTableSize = 2*SqrRoot(deg(f)); 838 long CompTableSize = 2*SqrRoot(deg(f)); 839 839 840 840 long GCDTableSize = GF2EX_BlockingFactor; … … 876 876 877 877 if (deg(f) < old_n) { 878 // f has changed 878 // f has changed 879 879 880 880 build(F, f); … … 916 916 GF2EXModulus F; 917 917 vec_GF2E roots; 918 918 919 919 build(F, f); 920 920 long n = F.n; … … 947 947 } 948 948 } 949 949 950 950 951 951 void EDF(vec_GF2EX& factors, const GF2EX& ff, const GF2EX& bb, … … 978 978 } 979 979 980 980 981 981 factors.SetLength(0); 982 982 … … 1008 1008 double t; 1009 1009 1010 1010 1011 1011 GF2EXModulus F; 1012 1012 build(F, f); … … 1050 1050 } 1051 1051 } 1052 1052 1053 1053 void CanZass(vec_pair_GF2EX_long& factors, const GF2EX& f, long verbose) 1054 1054 { … … 1060 1060 vec_GF2EX x; 1061 1061 1062 1062 1063 1063 SquareFreeDecomp(sfd, f); 1064 1064 … … 1121 1121 1122 1122 static 1123 void TandemPowerCompose(GF2EX& y1, GF2EX& y2, const GF2EX& h, 1123 void TandemPowerCompose(GF2EX& y1, GF2EX& y2, const GF2EX& h, 1124 1124 long q1, long q2, const GF2EXModulus& F) 1125 1125 { … … 1201 1201 long q1, q2, r1, r2; 1202 1202 1203 q1 = fvec[fvec[u].link].val; 1203 q1 = fvec[fvec[u].link].val; 1204 1204 q2 = fvec[fvec[u].link+1].val; 1205 1205 … … 1210 1210 } 1211 1211 1212 1212 1213 1213 1214 1214 … … 1218 1218 // the common degree of the irreducible factors of f is computed 1219 1219 { 1220 if (F.n == 1 || IsX(h)) 1220 if (F.n == 1 || IsX(h)) 1221 1221 return 1; 1222 1222 … … 1239 1239 1240 1240 f = ff; 1241 1241 1242 1242 if (!IsOne(LeadCoeff(f))) 1243 1243 Error("FindRoot: bad args"); … … 1261 1261 } 1262 1262 } 1263 1263 1264 1264 root = ConstTerm(f); 1265 1265 } … … 1308 1308 1309 1309 1310 q1 = fvec[fvec[u].link].val; 1310 q1 = fvec[fvec[u].link].val; 1311 1311 q2 = fvec[fvec[u].link+1].val; 1312 1312 1313 1313 TandemPowerCompose(h1, h2, h, q1, q2, F); 1314 return RecIrredTest(fvec[u].link, h2, F, fvec) 1314 return RecIrredTest(fvec[u].link, h2, F, fvec) 1315 1315 && RecIrredTest(fvec[u].link+1, h1, F, fvec); 1316 1316 } … … 1324 1324 1325 1325 build(F, f); 1326 1326 1327 1327 GF2EX h; 1328 1328 … … 1350 1350 1351 1351 build(F, f); 1352 1352 1353 1353 GF2EX h; 1354 1354 … … 1672 1672 long i; 1673 1673 1674 long HexOutput = GF2X::HexOutput; 1674 long HexOutput = GF2X::HexOutput; 1675 1675 GF2X::HexOutput = 1; 1676 1676 … … 1708 1708 } 1709 1709 1710 1710 1711 1711 1712 1712 … … 1778 1778 } 1779 1779 } 1780 1780 1781 1781 1782 1782 … … 1838 1838 1839 1839 long i; 1840 for (i = 1; i <= k-1; i++) 1840 for (i = 1; i <= k-1; i++) 1841 1841 rem(BabyStep[i], BabyStep[i], F); 1842 1842 } … … 1847 1847 } 1848 1848 1849 if (deg(f) > 0) 1849 if (deg(f) > 0) 1850 1850 NewAddFactor(u, f, 0, verbose); 1851 1851 … … 1902 1902 NewProcessTable(factors, f, F, buf, size, first_d, 1, verbose); 1903 1903 1904 if (deg(f) > 0) 1904 if (deg(f) > 0) 1905 1905 NewAddFactor(factors, f, deg(f), verbose); 1906 1906 } 1907 1907 1908 1908 1909 1909 … … 1935 1935 } 1936 1936 1937 1938 1939 1940 1937 1938 1939 1940 1941 1941 1942 1942 void NewDDF(vec_pair_GF2EX_long& factors, … … 1962 1962 if (!GF2EX_stem[0]) 1963 1963 sprintf(GF2EX_stem, "ddf-%ld", RandomBnd(10000)); 1964 1964 1965 1965 long B = deg(f)/2; 1966 1966 long k = SqrRoot(B); -
ntl/src/GF2X.c
r1d43d18 r287cc8 55 55 } 56 56 57 long IsZero(const GF2X& a) 57 long IsZero(const GF2X& a) 58 58 { return a.xrep.length() == 0; } 59 59 … … 133 133 x.xrep[wi] |= (1UL << bi); 134 134 } 135 135 136 136 137 137 … … 157 157 long wi = i/NTL_BITS_PER_LONG; 158 158 159 if (wi >= n) 159 if (wi >= n) 160 160 return; 161 161 … … 204 204 return NTL_BITS_PER_LONG*(n-1) + i - 1; 205 205 } 206 206 207 207 208 208 long operator==(const GF2X& a, const GF2X& b) … … 213 213 long operator==(const GF2X& a, long b) 214 214 { 215 if (b & 1) 215 if (b & 1) 216 216 return IsOne(a); 217 217 else … … 221 221 long operator==(const GF2X& a, GF2 b) 222 222 { 223 if (b == 1) 223 if (b == 1) 224 224 return IsOne(a); 225 225 else … … 274 274 x.xrep.QuickSetLength(i+1); 275 275 } 276 276 277 277 else if (sa < sb) { 278 278 x.xrep.SetLength(sb); … … 342 342 343 343 344 static 344 static 345 345 void mul1(_ntl_ulong *c, _ntl_ulong a, _ntl_ulong b) 346 346 { … … 368 368 } 369 369 370 #define mul1_IL mul1_inline 370 #define mul1_IL mul1_inline 371 371 #endif 372 372 373 373 374 static 374 static 375 375 void Mul1(_ntl_ulong *cp, const _ntl_ulong *bp, long sb, _ntl_ulong a) 376 376 { 377 377 378 378 379 379 NTL_EFF_BB_MUL_CODE1 … … 382 382 } 383 383 384 static 384 static 385 385 void AddMul1(_ntl_ulong *cp, const _ntl_ulong* bp, long sb, _ntl_ulong a) 386 386 { … … 393 393 394 394 395 static 395 static 396 396 void Mul1_short(_ntl_ulong *cp, const _ntl_ulong *bp, long sb, _ntl_ulong a) 397 397 { 398 398 399 399 400 400 NTL_EFF_SHORT_BB_MUL_CODE1 … … 407 407 408 408 409 static 409 static 410 410 void mul_half(_ntl_ulong *c, _ntl_ulong a, _ntl_ulong b) 411 411 { … … 445 445 446 446 /* 447 * This version of mul3 I got from Weimerskirch, Stebila, 447 * This version of mul3 I got from Weimerskirch, Stebila, 448 448 * and Shantz, "Generic GF(2^m) arithmetic in software 449 449 * an its application to ECC" (ACISP 2003). … … 462 462 mul1_IL(d12, a[1]^a[2], b[1]^b[2]); 463 463 464 464 465 465 c[0] = d0[0]; 466 466 c[1] = d0[1] ^ d01[0] ^ d1[0] ^ d0[0]; … … 484 484 485 485 mul2(c, a, b); 486 mul2(c+4, a+2, b+2); 486 mul2(c+4, a+2, b+2); 487 487 mul2(hl2, hs0, hs1); 488 488 … … 491 491 hl2[2] = hl2[2] ^ c[2] ^ c[6]; 492 492 hl2[3] = hl2[3] ^ c[3] ^ c[7]; 493 493 494 494 c[2] ^= hl2[0]; 495 495 c[3] ^= hl2[1]; … … 504 504 _ntl_ulong hl2[6]; 505 505 506 hs0[0] = a[0] ^ a[3]; 506 hs0[0] = a[0] ^ a[3]; 507 507 hs0[1] = a[1] ^ a[4]; 508 508 hs0[2] = a[2]; 509 hs1[0] = b[0] ^ b[3]; 509 hs1[0] = b[0] ^ b[3]; 510 510 hs1[1] = b[1] ^ b[4]; 511 511 hs1[2] = b[2]; 512 512 513 mul3(c, a, b); 513 mul3(c, a, b); 514 514 mul3(hl2, hs0, hs1); 515 515 mul2(c+6, a+3, b+3); 516 516 517 hl2[0] = hl2[0] ^ c[0] ^ c[6]; 517 hl2[0] = hl2[0] ^ c[0] ^ c[6]; 518 518 hl2[1] = hl2[1] ^ c[1] ^ c[7]; 519 519 hl2[2] = hl2[2] ^ c[2] ^ c[8]; … … 522 522 hl2[5] = hl2[5] ^ c[5]; 523 523 524 524 525 525 c[3] ^= hl2[0]; 526 526 c[4] ^= hl2[1]; … … 537 537 _ntl_ulong hl2[6]; 538 538 539 hs0[0] = a[0] ^ a[3]; 539 hs0[0] = a[0] ^ a[3]; 540 540 hs0[1] = a[1] ^ a[4]; 541 541 hs0[2] = a[2] ^ a[5]; 542 hs1[0] = b[0] ^ b[3]; 542 hs1[0] = b[0] ^ b[3]; 543 543 hs1[1] = b[1] ^ b[4]; 544 544 hs1[2] = b[2] ^ b[5]; 545 545 546 mul3(c, a, b); 547 mul3(c+6, a+3, b+3); 548 mul3(hl2, hs0, hs1); 546 mul3(c, a, b); 547 mul3(c+6, a+3, b+3); 548 mul3(hl2, hs0, hs1); 549 549 550 550 hl2[0] = hl2[0] ^ c[0] ^ c[6]; … … 554 554 hl2[4] = hl2[4] ^ c[4] ^ c[10]; 555 555 hl2[5] = hl2[5] ^ c[5] ^ c[11]; 556 556 557 557 c[3] ^= hl2[0]; 558 558 c[4] ^= hl2[1]; … … 569 569 _ntl_ulong hl2[8]; 570 570 571 hs0[0] = a[0] ^ a[4]; 571 hs0[0] = a[0] ^ a[4]; 572 572 hs0[1] = a[1] ^ a[5]; 573 573 hs0[2] = a[2] ^ a[6]; 574 574 hs0[3] = a[3]; 575 hs1[0] = b[0] ^ b[4]; 575 hs1[0] = b[0] ^ b[4]; 576 576 hs1[1] = b[1] ^ b[5]; 577 577 hs1[2] = b[2] ^ b[6]; 578 578 hs1[3] = b[3]; 579 579 580 mul4(c, a, b); 580 mul4(c, a, b); 581 581 mul4(hl2, hs0, hs1); 582 mul3(c+8, a+4, b+4); 582 mul3(c+8, a+4, b+4); 583 583 584 584 hl2[0] = hl2[0] ^ c[0] ^ c[8]; … … 590 590 hl2[6] = hl2[6] ^ c[6]; 591 591 hl2[7] = hl2[7] ^ c[7]; 592 592 593 593 c[4] ^= hl2[0]; 594 594 c[5] ^= hl2[1]; … … 607 607 _ntl_ulong hl2[8]; 608 608 609 hs0[0] = a[0] ^ a[4]; 609 hs0[0] = a[0] ^ a[4]; 610 610 hs0[1] = a[1] ^ a[5]; 611 611 hs0[2] = a[2] ^ a[6]; 612 612 hs0[3] = a[3] ^ a[7]; 613 hs1[0] = b[0] ^ b[4]; 613 hs1[0] = b[0] ^ b[4]; 614 614 hs1[1] = b[1] ^ b[5]; 615 615 hs1[2] = b[2] ^ b[6]; 616 616 hs1[3] = b[3] ^ b[7]; 617 617 618 mul4(c, a, b); 618 mul4(c, a, b); 619 619 mul4(c+8, a+4, b+4); 620 mul4(hl2, hs0, hs1); 620 mul4(hl2, hs0, hs1); 621 621 622 622 hl2[0] = hl2[0] ^ c[0] ^ c[8]; … … 628 628 hl2[6] = hl2[6] ^ c[6] ^ c[14]; 629 629 hl2[7] = hl2[7] ^ c[7] ^ c[15]; 630 630 631 631 c[4] ^= hl2[0]; 632 632 c[5] ^= hl2[1]; … … 640 640 641 641 static 642 void KarMul(_ntl_ulong *c, const _ntl_ulong *a, const _ntl_ulong *b, 642 void KarMul(_ntl_ulong *c, const _ntl_ulong *a, const _ntl_ulong *b, 643 643 long len, _ntl_ulong *stk) 644 644 { … … 717 717 return; 718 718 } 719 719 720 720 _ntl_ulong a0 = a.xrep[0]; 721 721 _ntl_ulong b0 = b.xrep[0]; … … 868 868 return; 869 869 } 870 870 871 871 _ntl_ulong a0 = a.xrep[0]; 872 872 _ntl_ulong b0 = b.xrep[0]; … … 1057 1057 } 1058 1058 } 1059 return; 1059 return; 1060 1060 1061 1061 case 7: { … … 1098 1098 } 1099 1099 } 1100 return; 1100 return; 1101 1101 1102 1102 case 8: { … … 1143 1143 } 1144 1144 } 1145 return; 1145 return; 1146 1146 1147 1147 } … … 1183 1183 // finally: the general case 1184 1184 1185 1185 1186 1186 static WordVector mem; 1187 1187 static WordVector stk; … … 1244 1244 if (sa == 1) { 1245 1245 AddMul1(cp, bp, sb, ap[0]); 1246 1246 1247 1247 break; 1248 1248 } … … 1253 1253 KarMul(v, ap, bp + i, sa, stk_p); 1254 1254 for (j = 0; j < 2*sa; j++) 1255 cp[i+j] ^= v[j]; 1255 cp[i+j] ^= v[j]; 1256 1256 } 1257 1257 … … 1314 1314 } 1315 1315 } 1316 else if (n*NTL_BITS_PER_LONG <= m) 1316 else if (n*NTL_BITS_PER_LONG <= m) 1317 1317 x = a; 1318 1318 else { … … 1334 1334 } 1335 1335 } 1336 1336 1337 1337 1338 1338 /****** implementation of vec_GF2X ******/ … … 1376 1376 static _ntl_ulong sqrtab[256] = { 1377 1377 1378 0UL, 1UL, 4UL, 5UL, 16UL, 17UL, 20UL, 21UL, 64UL, 1379 65UL, 68UL, 69UL, 80UL, 81UL, 84UL, 85UL, 256UL, 1380 257UL, 260UL, 261UL, 272UL, 273UL, 276UL, 277UL, 320UL, 1381 321UL, 324UL, 325UL, 336UL, 337UL, 340UL, 341UL, 1024UL, 1382 1025UL, 1028UL, 1029UL, 1040UL, 1041UL, 1044UL, 1045UL, 1088UL, 1383 1089UL, 1092UL, 1093UL, 1104UL, 1105UL, 1108UL, 1109UL, 1280UL, 1384 1281UL, 1284UL, 1285UL, 1296UL, 1297UL, 1300UL, 1301UL, 1344UL, 1385 1345UL, 1348UL, 1349UL, 1360UL, 1361UL, 1364UL, 1365UL, 4096UL, 1386 4097UL, 4100UL, 4101UL, 4112UL, 4113UL, 4116UL, 4117UL, 4160UL, 1387 4161UL, 4164UL, 4165UL, 4176UL, 4177UL, 4180UL, 4181UL, 4352UL, 1388 4353UL, 4356UL, 4357UL, 4368UL, 4369UL, 4372UL, 4373UL, 4416UL, 1389 4417UL, 4420UL, 4421UL, 4432UL, 4433UL, 4436UL, 4437UL, 5120UL, 1390 5121UL, 5124UL, 5125UL, 5136UL, 5137UL, 5140UL, 5141UL, 5184UL, 1391 5185UL, 5188UL, 5189UL, 5200UL, 5201UL, 5204UL, 5205UL, 5376UL, 1392 5377UL, 5380UL, 5381UL, 5392UL, 5393UL, 5396UL, 5397UL, 5440UL, 1393 5441UL, 5444UL, 5445UL, 5456UL, 5457UL, 5460UL, 5461UL, 16384UL, 1394 16385UL, 16388UL, 16389UL, 16400UL, 16401UL, 16404UL, 16405UL, 16448UL, 1395 16449UL, 16452UL, 16453UL, 16464UL, 16465UL, 16468UL, 16469UL, 16640UL, 1396 16641UL, 16644UL, 16645UL, 16656UL, 16657UL, 16660UL, 16661UL, 16704UL, 1397 16705UL, 16708UL, 16709UL, 16720UL, 16721UL, 16724UL, 16725UL, 17408UL, 1398 17409UL, 17412UL, 17413UL, 17424UL, 17425UL, 17428UL, 17429UL, 17472UL, 1399 17473UL, 17476UL, 17477UL, 17488UL, 17489UL, 17492UL, 17493UL, 17664UL, 1400 17665UL, 17668UL, 17669UL, 17680UL, 17681UL, 17684UL, 17685UL, 17728UL, 1401 17729UL, 17732UL, 17733UL, 17744UL, 17745UL, 17748UL, 17749UL, 20480UL, 1402 20481UL, 20484UL, 20485UL, 20496UL, 20497UL, 20500UL, 20501UL, 20544UL, 1403 20545UL, 20548UL, 20549UL, 20560UL, 20561UL, 20564UL, 20565UL, 20736UL, 1404 20737UL, 20740UL, 20741UL, 20752UL, 20753UL, 20756UL, 20757UL, 20800UL, 1405 20801UL, 20804UL, 20805UL, 20816UL, 20817UL, 20820UL, 20821UL, 21504UL, 1406 21505UL, 21508UL, 21509UL, 21520UL, 21521UL, 21524UL, 21525UL, 21568UL, 1407 21569UL, 21572UL, 21573UL, 21584UL, 21585UL, 21588UL, 21589UL, 21760UL, 1408 21761UL, 21764UL, 21765UL, 21776UL, 21777UL, 21780UL, 21781UL, 21824UL, 1378 0UL, 1UL, 4UL, 5UL, 16UL, 17UL, 20UL, 21UL, 64UL, 1379 65UL, 68UL, 69UL, 80UL, 81UL, 84UL, 85UL, 256UL, 1380 257UL, 260UL, 261UL, 272UL, 273UL, 276UL, 277UL, 320UL, 1381 321UL, 324UL, 325UL, 336UL, 337UL, 340UL, 341UL, 1024UL, 1382 1025UL, 1028UL, 1029UL, 1040UL, 1041UL, 1044UL, 1045UL, 1088UL, 1383 1089UL, 1092UL, 1093UL, 1104UL, 1105UL, 1108UL, 1109UL, 1280UL, 1384 1281UL, 1284UL, 1285UL, 1296UL, 1297UL, 1300UL, 1301UL, 1344UL, 1385 1345UL, 1348UL, 1349UL, 1360UL, 1361UL, 1364UL, 1365UL, 4096UL, 1386 4097UL, 4100UL, 4101UL, 4112UL, 4113UL, 4116UL, 4117UL, 4160UL, 1387 4161UL, 4164UL, 4165UL, 4176UL, 4177UL, 4180UL, 4181UL, 4352UL, 1388 4353UL, 4356UL, 4357UL, 4368UL, 4369UL, 4372UL, 4373UL, 4416UL, 1389 4417UL, 4420UL, 4421UL, 4432UL, 4433UL, 4436UL, 4437UL, 5120UL, 1390 5121UL, 5124UL, 5125UL, 5136UL, 5137UL, 5140UL, 5141UL, 5184UL, 1391 5185UL, 5188UL, 5189UL, 5200UL, 5201UL, 5204UL, 5205UL, 5376UL, 1392 5377UL, 5380UL, 5381UL, 5392UL, 5393UL, 5396UL, 5397UL, 5440UL, 1393 5441UL, 5444UL, 5445UL, 5456UL, 5457UL, 5460UL, 5461UL, 16384UL, 1394 16385UL, 16388UL, 16389UL, 16400UL, 16401UL, 16404UL, 16405UL, 16448UL, 1395 16449UL, 16452UL, 16453UL, 16464UL, 16465UL, 16468UL, 16469UL, 16640UL, 1396 16641UL, 16644UL, 16645UL, 16656UL, 16657UL, 16660UL, 16661UL, 16704UL, 1397 16705UL, 16708UL, 16709UL, 16720UL, 16721UL, 16724UL, 16725UL, 17408UL, 1398 17409UL, 17412UL, 17413UL, 17424UL, 17425UL, 17428UL, 17429UL, 17472UL, 1399 17473UL, 17476UL, 17477UL, 17488UL, 17489UL, 17492UL, 17493UL, 17664UL, 1400 17665UL, 17668UL, 17669UL, 17680UL, 17681UL, 17684UL, 17685UL, 17728UL, 1401 17729UL, 17732UL, 17733UL, 17744UL, 17745UL, 17748UL, 17749UL, 20480UL, 1402 20481UL, 20484UL, 20485UL, 20496UL, 20497UL, 20500UL, 20501UL, 20544UL, 1403 20545UL, 20548UL, 20549UL, 20560UL, 20561UL, 20564UL, 20565UL, 20736UL, 1404 20737UL, 20740UL, 20741UL, 20752UL, 20753UL, 20756UL, 20757UL, 20800UL, 1405 20801UL, 20804UL, 20805UL, 20816UL, 20817UL, 20820UL, 20821UL, 21504UL, 1406 21505UL, 21508UL, 21509UL, 21520UL, 21521UL, 21524UL, 21525UL, 21568UL, 1407 21569UL, 21572UL, 21573UL, 21584UL, 21585UL, 21588UL, 21589UL, 21760UL, 1408 21761UL, 21764UL, 21765UL, 21776UL, 21777UL, 21780UL, 21781UL, 21824UL, 1409 1409 21825UL, 21828UL, 21829UL, 21840UL, 21841UL, 21844UL, 21845UL }; 1410 1410 … … 1412 1412 1413 1413 1414 static inline 1414 static inline 1415 1415 void sqr1(_ntl_ulong *c, _ntl_ulong a) 1416 1416 { … … 1461 1461 1462 1462 if (n < 0) { 1463 if (n < -NTL_MAX_LONG) 1463 if (n < -NTL_MAX_LONG) 1464 1464 clear(c); 1465 1465 else … … 1535 1535 if (bn) ss++; 1536 1536 1537 if (ss > sc) 1537 if (ss > sc) 1538 1538 c.xrep.SetLength(ss); 1539 1539 … … 1614 1614 static _ntl_ulong revtab[256] = { 1615 1615 1616 0UL, 128UL, 64UL, 192UL, 32UL, 160UL, 96UL, 224UL, 16UL, 144UL, 1617 80UL, 208UL, 48UL, 176UL, 112UL, 240UL, 8UL, 136UL, 72UL, 200UL, 1618 40UL, 168UL, 104UL, 232UL, 24UL, 152UL, 88UL, 216UL, 56UL, 184UL, 1619 120UL, 248UL, 4UL, 132UL, 68UL, 196UL, 36UL, 164UL, 100UL, 228UL, 1620 20UL, 148UL, 84UL, 212UL, 52UL, 180UL, 116UL, 244UL, 12UL, 140UL, 1621 76UL, 204UL, 44UL, 172UL, 108UL, 236UL, 28UL, 156UL, 92UL, 220UL, 1622 60UL, 188UL, 124UL, 252UL, 2UL, 130UL, 66UL, 194UL, 34UL, 162UL, 1623 98UL, 226UL, 18UL, 146UL, 82UL, 210UL, 50UL, 178UL, 114UL, 242UL, 1624 10UL, 138UL, 74UL, 202UL, 42UL, 170UL, 106UL, 234UL, 26UL, 154UL, 1625 90UL, 218UL, 58UL, 186UL, 122UL, 250UL, 6UL, 134UL, 70UL, 198UL, 1626 38UL, 166UL, 102UL, 230UL, 22UL, 150UL, 86UL, 214UL, 54UL, 182UL, 1627 118UL, 246UL, 14UL, 142UL, 78UL, 206UL, 46UL, 174UL, 110UL, 238UL, 1628 30UL, 158UL, 94UL, 222UL, 62UL, 190UL, 126UL, 254UL, 1UL, 129UL, 1629 65UL, 193UL, 33UL, 161UL, 97UL, 225UL, 17UL, 145UL, 81UL, 209UL, 1630 49UL, 177UL, 113UL, 241UL, 9UL, 137UL, 73UL, 201UL, 41UL, 169UL, 1631 105UL, 233UL, 25UL, 153UL, 89UL, 217UL, 57UL, 185UL, 121UL, 249UL, 1632 5UL, 133UL, 69UL, 197UL, 37UL, 165UL, 101UL, 229UL, 21UL, 149UL, 1633 85UL, 213UL, 53UL, 181UL, 117UL, 245UL, 13UL, 141UL, 77UL, 205UL, 1634 45UL, 173UL, 109UL, 237UL, 29UL, 157UL, 93UL, 221UL, 61UL, 189UL, 1635 125UL, 253UL, 3UL, 131UL, 67UL, 195UL, 35UL, 163UL, 99UL, 227UL, 1636 19UL, 147UL, 83UL, 211UL, 51UL, 179UL, 115UL, 243UL, 11UL, 139UL, 1637 75UL, 203UL, 43UL, 171UL, 107UL, 235UL, 27UL, 155UL, 91UL, 219UL, 1638 59UL, 187UL, 123UL, 251UL, 7UL, 135UL, 71UL, 199UL, 39UL, 167UL, 1639 103UL, 231UL, 23UL, 151UL, 87UL, 215UL, 55UL, 183UL, 119UL, 247UL, 1640 15UL, 143UL, 79UL, 207UL, 47UL, 175UL, 111UL, 239UL, 31UL, 159UL, 1641 95UL, 223UL, 63UL, 191UL, 127UL, 255UL }; 1642 1643 static inline 1616 0UL, 128UL, 64UL, 192UL, 32UL, 160UL, 96UL, 224UL, 16UL, 144UL, 1617 80UL, 208UL, 48UL, 176UL, 112UL, 240UL, 8UL, 136UL, 72UL, 200UL, 1618 40UL, 168UL, 104UL, 232UL, 24UL, 152UL, 88UL, 216UL, 56UL, 184UL, 1619 120UL, 248UL, 4UL, 132UL, 68UL, 196UL, 36UL, 164UL, 100UL, 228UL, 1620 20UL, 148UL, 84UL, 212UL, 52UL, 180UL, 116UL, 244UL, 12UL, 140UL, 1621 76UL, 204UL, 44UL, 172UL, 108UL, 236UL, 28UL, 156UL, 92UL, 220UL, 1622 60UL, 188UL, 124UL, 252UL, 2UL, 130UL, 66UL, 194UL, 34UL, 162UL, 1623 98UL, 226UL, 18UL, 146UL, 82UL, 210UL, 50UL, 178UL, 114UL, 242UL, 1624 10UL, 138UL, 74UL, 202UL, 42UL, 170UL, 106UL, 234UL, 26UL, 154UL, 1625 90UL, 218UL, 58UL, 186UL, 122UL, 250UL, 6UL, 134UL, 70UL, 198UL, 1626 38UL, 166UL, 102UL, 230UL, 22UL, 150UL, 86UL, 214UL, 54UL, 182UL, 1627 118UL, 246UL, 14UL, 142UL, 78UL, 206UL, 46UL, 174UL, 110UL, 238UL, 1628 30UL, 158UL, 94UL, 222UL, 62UL, 190UL, 126UL, 254UL, 1UL, 129UL, 1629 65UL, 193UL, 33UL, 161UL, 97UL, 225UL, 17UL, 145UL, 81UL, 209UL, 1630 49UL, 177UL, 113UL, 241UL, 9UL, 137UL, 73UL, 201UL, 41UL, 169UL, 1631 105UL, 233UL, 25UL, 153UL, 89UL, 217UL, 57UL, 185UL, 121UL, 249UL, 1632 5UL, 133UL, 69UL, 197UL, 37UL, 165UL, 101UL, 229UL, 21UL, 149UL, 1633 85UL, 213UL, 53UL, 181UL, 117UL, 245UL, 13UL, 141UL, 77UL, 205UL, 1634 45UL, 173UL, 109UL, 237UL, 29UL, 157UL, 93UL, 221UL, 61UL, 189UL, 1635 125UL, 253UL, 3UL, 131UL, 67UL, 195UL, 35UL, 163UL, 99UL, 227UL, 1636 19UL, 147UL, 83UL, 211UL, 51UL, 179UL, 115UL, 243UL, 11UL, 139UL, 1637 75UL, 203UL, 43UL, 171UL, 107UL, 235UL, 27UL, 155UL, 91UL, 219UL, 1638 59UL, 187UL, 123UL, 251UL, 7UL, 135UL, 71UL, 199UL, 39UL, 167UL, 1639 103UL, 231UL, 23UL, 151UL, 87UL, 215UL, 55UL, 183UL, 119UL, 247UL, 1640 15UL, 143UL, 79UL, 207UL, 47UL, 175UL, 111UL, 239UL, 31UL, 159UL, 1641 95UL, 223UL, 63UL, 191UL, 127UL, 255UL }; 1642 1643 static inline 1644 1644 _ntl_ulong rev1(_ntl_ulong a) 1645 1645 { … … 1675 1675 1676 1676 c.xrep.SetLength(wn); 1677 1677 1678 1678 _ntl_ulong *cp = c.xrep.elts(); 1679 1679 const _ntl_ulong *ap = a.xrep.elts(); … … 1737 1737 r = n - lw*BytesPerLong; 1738 1738 1739 if (r != 0) 1739 if (r != 0) 1740 1740 lw++; 1741 1741 else -
ntl/src/GF2X1.c
r1d43d18 r287cc8 16 16 #ifdef NTL_GF2X_LIB 17 17 18 #define NTL_GF2X_GCD_CROSSOVER (400L*NTL_BITS_PER_LONG) 18 #define NTL_GF2X_GCD_CROSSOVER (400L*NTL_BITS_PER_LONG) 19 19 #define NTL_GF2X_HalfGCD_CROSSOVER (6L*NTL_BITS_PER_LONG) 20 20 #define NTL_GF2X_BERMASS_CROSSOVER (200L*NTL_BITS_PER_LONG) … … 22 22 #else 23 23 24 #define NTL_GF2X_GCD_CROSSOVER (900L*NTL_BITS_PER_LONG) 24 #define NTL_GF2X_GCD_CROSSOVER (900L*NTL_BITS_PER_LONG) 25 25 #define NTL_GF2X_HalfGCD_CROSSOVER (6L*NTL_BITS_PER_LONG) 26 26 #define NTL_GF2X_BERMASS_CROSSOVER (450L*NTL_BITS_PER_LONG) … … 46 46 47 47 ~GF2XRegisterType() 48 { xrep->xrep.release(); 48 { xrep->xrep.release(); 49 49 GF2XRegisterTop--; } 50 50 … … 102 102 103 103 stab[posb] = b; 104 for (i = 1; i <= min(dq, NTL_BITS_PER_LONG-1); i++) 105 MulByX(stab[((_ntl_ulong)(posb+i))%NTL_BITS_PER_LONG], 104 for (i = 1; i <= min(dq, NTL_BITS_PER_LONG-1); i++) 105 MulByX(stab[((_ntl_ulong)(posb+i))%NTL_BITS_PER_LONG], 106 106 stab[((_ntl_ulong)(posb+i-1))%NTL_BITS_PER_LONG]); 107 107 … … 206 206 207 207 stab[posb] = b; 208 for (i = 1; i <= min(da-db, NTL_BITS_PER_LONG-1); i++) 209 MulByX(stab[((_ntl_ulong)(posb+i))%NTL_BITS_PER_LONG], 208 for (i = 1; i <= min(da-db, NTL_BITS_PER_LONG-1); i++) 209 MulByX(stab[((_ntl_ulong)(posb+i))%NTL_BITS_PER_LONG], 210 210 stab[((_ntl_ulong)(posb+i-1))%NTL_BITS_PER_LONG]); 211 211 … … 349 349 350 350 351 static 351 static 352 352 long weight1(_ntl_ulong a) 353 353 { … … 392 392 393 393 trunc(g, g, n); 394 394 395 395 long t = deg(g); 396 396 … … 440 440 long posb = n - NTL_BITS_PER_LONG*(sb-1); 441 441 442 F.posn = posb; 442 F.posn = posb; 443 443 444 444 if (F.posn > 0) { … … 467 467 long deg_f0 = deg(f0); 468 468 469 if (F.sn > 1 && deg_f0 < NTL_BITS_PER_LONG 469 if (F.sn > 1 && deg_f0 < NTL_BITS_PER_LONG 470 470 && deg_f0 >= NTL_BITS_PER_LONG/2) { 471 471 if (F.size >= 6) … … 482 482 else if (F.size >= 8) 483 483 F.method = GF2X_MOD_MUL; 484 else 484 else 485 485 F.method = GF2X_MOD_PLAIN; 486 486 487 487 488 488 if (F.method == GF2X_MOD_SPECIAL) { … … 505 505 506 506 stab1[kk1<<1] = stab1[kk0<<1] << 1; 507 stab1[(kk1<<1)+1] = (stab1[(kk0<<1)+1] << 1) 507 stab1[(kk1<<1)+1] = (stab1[(kk0<<1)+1] << 1) 508 508 | (stab1[kk0<<1] >> (NTL_BITS_PER_LONG-1)); 509 509 510 if (kk1 < posb) 510 if (kk1 < posb) 511 511 stab_cnt[kk1] = -sb; 512 512 else … … 526 526 long *stab_cnt = F.stab_cnt; 527 527 if (!stab_cnt) Error("out of memory"); 528 529 528 529 530 530 stab[posb] = f; 531 for (i = 1; i < NTL_BITS_PER_LONG; i++) 532 MulByX(stab[((_ntl_ulong)(posb+i))%NTL_BITS_PER_LONG], 531 for (i = 1; i < NTL_BITS_PER_LONG; i++) 532 MulByX(stab[((_ntl_ulong)(posb+i))%NTL_BITS_PER_LONG], 533 533 stab[((_ntl_ulong)(posb+i-1))%NTL_BITS_PER_LONG]); 534 535 534 535 536 536 for (i = 0; i < NTL_BITS_PER_LONG; i++) { 537 537 WordVector& st = stab[((_ntl_ulong)(posb+i))%NTL_BITS_PER_LONG].xrep; … … 568 568 GF2XModulus::GF2XModulus(const GF2XModulus& F) : 569 569 f(F.f), n(F.n), sn(F.sn), posn(F.posn), k3(F.k3), k2(F.k2), k1(F.k1), 570 size(F.size), 570 size(F.size), 571 571 msk(F.msk), method(F.method), stab(F.stab), h0(F.h0), f0(F.f0), 572 572 stab_cnt(0), stab_ptr(0), stab1(0), tracevec(F.tracevec) … … 596 596 stab_ptr = NTL_NEW_OP _ntl_ulong_ptr[NTL_BITS_PER_LONG]; 597 597 if (!stab_ptr) Error("GF2XModulus: out of memory"); 598 598 599 599 for (i = 0; i < NTL_BITS_PER_LONG; i++) { 600 600 WordVector& st = stab[((_ntl_ulong)(posn+i))%NTL_BITS_PER_LONG].xrep; … … 611 611 if (this == &F) return *this; 612 612 613 f=F.f; n=F.n; sn=F.sn; posn=F.posn; 613 f=F.f; n=F.n; sn=F.sn; posn=F.posn; 614 614 k3=F.k3; k2=F.k2; k1=F.k1; 615 size=F.size; 615 size=F.size; 616 616 msk=F.msk; method=F.method; stab=F.stab; h0=F.h0; f0 = F.f0; 617 617 tracevec=F.tracevec; … … 641 641 if (!stab_ptr) stab_ptr = NTL_NEW_OP _ntl_ulong_ptr[NTL_BITS_PER_LONG]; 642 642 if (!stab_ptr) Error("GF2XModulus: out of memory"); 643 643 644 644 for (i = 0; i < NTL_BITS_PER_LONG; i++) { 645 645 WordVector& st = stab[((_ntl_ulong)(posn+i))%NTL_BITS_PER_LONG].xrep; … … 653 653 return *this; 654 654 } 655 656 657 658 GF2XModulus::~GF2XModulus() 659 { 660 delete [] stab_ptr; 661 delete [] stab_cnt; 662 delete [] stab1; 655 656 657 658 GF2XModulus::~GF2XModulus() 659 { 660 delete [] stab_ptr; 661 delete [] stab_cnt; 662 delete [] stab1; 663 663 } 664 664 … … 751 751 r = buf; 752 752 } 753 753 754 754 755 755 void UseMulDivRemX1(GF2X& q, GF2X& r, const GF2X& aa, const GF2XModulus& F) … … 795 795 GF2XRegister(qq); 796 796 GF2XRegister(qbuf); 797 797 798 798 clear(buf); 799 799 a = aa; … … 890 890 p[0] ^= (w >> bn); 891 891 892 p[m] &= ((1UL<<bn)-1UL); 892 p[m] &= ((1UL<<bn)-1UL); 893 893 } 894 894 else { … … 911 911 if (m-wdiff-1 >= 0) p[m-wdiff-1] ^= (w << (NTL_BITS_PER_LONG-bdiff)); 912 912 p[0] ^= (w >> bn); 913 p[m] &= ((1UL<<bn)-1UL); 913 p[m] &= ((1UL<<bn)-1UL); 914 914 } 915 915 } … … 960 960 w = p[m]; 961 961 962 if (bn == 0) 962 if (bn == 0) 963 963 p[m-wn] ^= w; 964 964 else { … … 968 968 } 969 969 970 if (bdiff1 == 0) 970 if (bdiff1 == 0) 971 971 p[m-wdiff1] ^= w; 972 972 else { … … 976 976 } 977 977 978 if (bdiff2 == 0) 978 if (bdiff2 == 0) 979 979 p[m-wdiff2] ^= w; 980 980 else { … … 984 984 } 985 985 986 if (bdiff3 == 0) 986 if (bdiff3 == 0) 987 987 p[m-wdiff3] ^= w; 988 988 else { … … 997 997 w = (p[m] >> bn) << bn; 998 998 999 p[0] ^= (w >> bn); 999 p[0] ^= (w >> bn); 1000 1000 1001 1001 if (bdiff1 == 0) … … 1023 1023 p[m] &= ((1UL<<bn)-1UL); 1024 1024 1025 1025 1026 1026 if (bn == 0) 1027 1027 wn--; … … 1092 1092 1093 1093 RightShift(P1, a, n); 1094 if (k != 1) 1094 if (k != 1) 1095 1095 RightShiftAdd(P1, P1, n-k); 1096 1096 … … 1098 1098 } 1099 1099 1100 static 1100 static 1101 1101 void TriDivRem21(GF2X& q, GF2X& r, const GF2X& a, long n, long k) 1102 1102 { … … 1120 1120 1121 1121 RightShift(P1, a, n); 1122 1122 1123 1123 RightShift(P2, P1, n-k3); 1124 1124 RightShiftAdd(P2, P1, n-k2); … … 1132 1132 } 1133 1133 1134 static 1135 void PentDivRem21(GF2X& q, GF2X& r, const GF2X& a, long n, 1134 static 1135 void PentDivRem21(GF2X& q, GF2X& r, const GF2X& a, long n, 1136 1136 long k3, long k2, long k1) 1137 1137 { … … 1185 1185 GF2XRegister(qq); 1186 1186 GF2XRegister(qbuf); 1187 1187 1188 1188 clear(buf); 1189 1189 a = aa; … … 1211 1211 1212 1212 static 1213 void PentDivRemX1(GF2X& q, GF2X& r, const GF2X& aa, long n, 1213 void PentDivRemX1(GF2X& q, GF2X& r, const GF2X& aa, long n, 1214 1214 long k3, long k2, long k1) 1215 1215 { … … 1254 1254 GF2XRegister(qq); 1255 1255 GF2XRegister(qbuf); 1256 1256 1257 1257 clear(buf); 1258 1258 a = aa; … … 1304 1304 } 1305 1305 else if (F.method == GF2X_MOD_MUL) { 1306 if (da <= 2*(n-1)) 1306 if (da <= 2*(n-1)) 1307 1307 UseMulRem21(r, a, F); 1308 1308 else … … 1312 1312 long sa = a.xrep.length(); 1313 1313 long posa = da - NTL_BITS_PER_LONG*(sa-1); 1314 1314 1315 1315 _ntl_ulong *ap; 1316 1316 if (&r == &a) … … 1320 1320 ap = GF2X_rembuf.elts(); 1321 1321 } 1322 1322 1323 1323 _ntl_ulong *atop = &ap[sa-1]; 1324 1324 _ntl_ulong *stab_top; 1325 1325 1326 1326 long i; 1327 1327 1328 1328 while (1) { 1329 1329 if (atop[0] & (1UL << posa)) { … … 1343 1343 } 1344 1344 } 1345 1345 1346 1346 long sn = F.size; 1347 1347 r.xrep.SetLength(sn); … … 1357 1357 long sa = a.xrep.length(); 1358 1358 long posa = da - NTL_BITS_PER_LONG*(sa-1); 1359 1360 1359 1360 1361 1361 _ntl_ulong *ap; 1362 1362 if (&r == &a) … … 1366 1366 ap = GF2X_rembuf.elts(); 1367 1367 } 1368 1368 1369 1369 _ntl_ulong *atop = &ap[sa-1]; 1370 1370 _ntl_ulong *stab_top; 1371 1371 1372 1372 long i; 1373 1373 1374 1374 while (1) { 1375 1375 if (atop[0] & (1UL << posa)) { … … 1378 1378 atop[i] ^= stab_top[i]; 1379 1379 } 1380 1380 1381 1381 da--; 1382 1382 if (da < n) break; … … 1388 1388 } 1389 1389 } 1390 1390 1391 1391 long sn = F.size; 1392 1392 r.xrep.SetLength(sn); … … 1414 1414 } 1415 1415 else if (F.method == GF2X_MOD_TRI) { 1416 if (da <= 2*(n-1)) 1416 if (da <= 2*(n-1)) 1417 1417 TriDivRem21(q, r, a, F.n, F.k3); 1418 1418 else … … 1420 1420 } 1421 1421 else if (F.method == GF2X_MOD_PENT) { 1422 if (da <= 2*(n-1)) 1422 if (da <= 2*(n-1)) 1423 1423 PentDivRem21(q, r, a, F.n, F.k3, F.k2, F.k1); 1424 1424 else … … 1426 1426 } 1427 1427 else if (F.method == GF2X_MOD_MUL) { 1428 if (da <= 2*(n-1)) 1428 if (da <= 2*(n-1)) 1429 1429 UseMulDivRem21(q, r, a, F); 1430 1430 else … … 1434 1434 long sa = a.xrep.length(); 1435 1435 long posa = da - NTL_BITS_PER_LONG*(sa-1); 1436 1436 1437 1437 long dq = da - n; 1438 1438 long sq = dq/NTL_BITS_PER_LONG + 1; 1439 1439 long posq = dq - NTL_BITS_PER_LONG*(sq-1); 1440 1440 1441 1441 _ntl_ulong *ap; 1442 1442 if (&r == &a) … … 1446 1446 ap = GF2X_rembuf.elts(); 1447 1447 } 1448 1448 1449 1449 _ntl_ulong *atop = &ap[sa-1]; 1450 1450 _ntl_ulong *stab_top; … … 1459 1459 _ntl_ulong *qtop = &qp[sq-1]; 1460 1460 1461 1461 1462 1462 while (1) { 1463 1463 if (atop[0] & (1UL << posa)) { … … 1468 1468 atop[i+1] ^= stab_top[1]; 1469 1469 } 1470 1470 1471 1471 da--; 1472 1472 if (da < n) break; … … 1484 1484 } 1485 1485 } 1486 1486 1487 1487 long sn = F.size; 1488 1488 r.xrep.SetLength(sn); … … 1498 1498 long sa = a.xrep.length(); 1499 1499 long posa = da - NTL_BITS_PER_LONG*(sa-1); 1500 1500 1501 1501 long dq = da - n; 1502 1502 long sq = dq/NTL_BITS_PER_LONG + 1; 1503 1503 long posq = dq - NTL_BITS_PER_LONG*(sq-1); 1504 1504 1505 1505 _ntl_ulong *ap; 1506 1506 if (&r == &a) … … 1510 1510 ap = GF2X_rembuf.elts(); 1511 1511 } 1512 1512 1513 1513 _ntl_ulong *atop = &ap[sa-1]; 1514 1514 _ntl_ulong *stab_top; 1515 1515 1516 1516 long i; 1517 1517 … … 1522 1522 1523 1523 _ntl_ulong *qtop = &qp[sq-1]; 1524 1524 1525 1525 while (1) { 1526 1526 if (atop[0] & (1UL << posa)) { … … 1530 1530 atop[i] ^= stab_top[i]; 1531 1531 } 1532 1532 1533 1533 da--; 1534 1534 if (da < n) break; … … 1546 1546 } 1547 1547 } 1548 1548 1549 1549 long sn = F.size; 1550 1550 r.xrep.SetLength(sn); … … 1574 1574 } 1575 1575 else if (F.method == GF2X_MOD_TRI) { 1576 if (da <= 2*(n-1)) 1576 if (da <= 2*(n-1)) 1577 1577 TriDiv21(q, a, F.n, F.k3); 1578 1578 else … … 1580 1580 } 1581 1581 else if (F.method == GF2X_MOD_PENT) { 1582 if (da <= 2*(n-1)) 1582 if (da <= 2*(n-1)) 1583 1583 PentDiv21(q, a, F.n, F.k3, F.k2, F.k1); 1584 1584 else … … 1586 1586 } 1587 1587 else if (F.method == GF2X_MOD_MUL) { 1588 if (da <= 2*(n-1)) 1588 if (da <= 2*(n-1)) 1589 1589 UseMulDiv21(q, a, F); 1590 1590 else … … 1594 1594 long sa = a.xrep.length(); 1595 1595 long posa = da - NTL_BITS_PER_LONG*(sa-1); 1596 1596 1597 1597 long dq = da - n; 1598 1598 long sq = dq/NTL_BITS_PER_LONG + 1; 1599 1599 long posq = dq - NTL_BITS_PER_LONG*(sq-1); 1600 1600 1601 1601 _ntl_ulong *ap; 1602 1602 GF2X_rembuf = a.xrep; 1603 1603 ap = GF2X_rembuf.elts(); 1604 1604 1605 1605 1606 1606 _ntl_ulong *atop = &ap[sa-1]; 1607 1607 _ntl_ulong *stab_top; … … 1615 1615 1616 1616 _ntl_ulong *qtop = &qp[sq-1]; 1617 1617 1618 1618 while (1) { 1619 1619 if (atop[0] & (1UL << posa)) { … … 1624 1624 atop[i+1] ^= stab_top[1]; 1625 1625 } 1626 1626 1627 1627 da--; 1628 1628 if (da < n) break; … … 1644 1644 long sa = a.xrep.length(); 1645 1645 long posa = da - NTL_BITS_PER_LONG*(sa-1); 1646 1646 1647 1647 long dq = da - n; 1648 1648 long sq = dq/NTL_BITS_PER_LONG + 1; 1649 1649 long posq = dq - NTL_BITS_PER_LONG*(sq-1); 1650 1650 1651 1651 _ntl_ulong *ap; 1652 1652 GF2X_rembuf = a.xrep; 1653 1653 ap = GF2X_rembuf.elts(); 1654 1654 1655 1655 _ntl_ulong *atop = &ap[sa-1]; 1656 1656 _ntl_ulong *stab_top; 1657 1657 1658 1658 long i; 1659 1659 … … 1664 1664 1665 1665 _ntl_ulong *qtop = &qp[sq-1]; 1666 1666 1667 1667 while (1) { 1668 1668 if (atop[0] & (1UL << posa)) { … … 1672 1672 atop[i] ^= stab_top[i]; 1673 1673 } 1674 1674 1675 1675 da--; 1676 1676 if (da < n) break; … … 1754 1754 return k; 1755 1755 } 1756 1756 1757 1757 1758 1758 … … 1821 1821 1822 1822 v[0] = g; 1823 1823 1824 1824 if (k > 1) { 1825 1825 GF2X t; … … 1837 1837 val = 0; 1838 1838 for (i = n-1; i >= 0; i--) { 1839 val = (val << 1) | bit(e, i); 1839 val = (val << 1) | bit(e, i); 1840 1840 if (val == 0) 1841 1841 SqrMod(res, res, F); … … 1869 1869 } 1870 1870 1871 1871 1872 1872 1873 1873 … … 1904 1904 1905 1905 1906 1906 1907 1907 1908 1908 … … 1924 1924 mul(P1, P2, b); 1925 1925 add(P1, P1, a); 1926 1926 1927 1927 r = P1; 1928 1928 } … … 1945 1945 mul(P1, P2, b); 1946 1946 add(P1, P1, a); 1947 1947 1948 1948 r = P1; 1949 1949 q = P2; … … 1965 1965 mul(P2, P1, P2); 1966 1966 RightShift(P2, P2, da-db); 1967 1967 1968 1968 q = P2; 1969 1969 } 1970 1970 1971 1971 1972 const long GF2X_DIV_CROSS = 100; 1972 const long GF2X_DIV_CROSS = 100; 1973 1973 1974 1974 void DivRem(GF2X& q, GF2X& r, const GF2X& a, const GF2X& b) … … 2021 2021 2022 2022 2023 static inline 2024 void swap(_ntl_ulong_ptr& a, _ntl_ulong_ptr& b) 2023 static inline 2024 void swap(_ntl_ulong_ptr& a, _ntl_ulong_ptr& b) 2025 2025 { _ntl_ulong_ptr t; t = a; a = b; b = t; } 2026 2026 … … 2033 2033 GF2XRegister(a); 2034 2034 GF2XRegister(b); 2035 2035 2036 2036 if (IsZero(a_in)) { 2037 2037 d = b_in; … … 2043 2043 return; 2044 2044 } 2045 2045 2046 2046 a.xrep.SetMaxLength(a_in.xrep.length()+1); 2047 2047 b.xrep.SetMaxLength(b_in.xrep.length()+1); … … 2240 2240 return; 2241 2241 } 2242 2242 2243 2243 a.xrep.SetMaxLength(a_in.xrep.length()+1); 2244 2244 b.xrep.SetMaxLength(b_in.xrep.length()+1); … … 2348 2348 BaseXGCD(d, s1, t1, b, r); 2349 2349 2350 2350 2351 2351 mul(r, t1, q); 2352 2352 add(r, r, s1); // r = s1 - t1*q, but sign doesn't matter 2353 2353 2354 2354 s = t1; 2355 t = r; 2355 t = r; 2356 2356 } 2357 2357 else if (sa >= 10 && 2*sb > 3*sa) { … … 2365 2365 BaseXGCD(d, s1, t1, a, r); 2366 2366 2367 2367 2368 2368 mul(r, t1, q); 2369 2369 add(r, r, s1); // r = s1 - t1*q, but sign doesn't matter 2370 2370 2371 2371 t = t1; 2372 s = r; 2372 s = r; 2373 2373 } 2374 2374 else { … … 2389 2389 long sf = f.xrep.length(); 2390 2390 2391 if ((sa >= 10 && 2*sf > 3*sa) || 2391 if ((sa >= 10 && 2*sf > 3*sa) || 2392 2392 sf > NTL_GF2X_GCD_CROSSOVER/NTL_BITS_PER_LONG) { 2393 2393 GF2XRegister(t); … … 2404 2404 2405 2405 void InvMod(GF2X& c, const GF2X& a, const GF2X& f) 2406 { 2406 { 2407 2407 GF2XRegister(d); 2408 2408 GF2XRegister(s); … … 2417 2417 2418 2418 long InvModStatus(GF2X& c, const GF2X& a, const GF2X& f) 2419 { 2419 { 2420 2420 GF2XRegister(d); 2421 2421 GF2XRegister(s); … … 2433 2433 2434 2434 2435 2435 2436 2436 void diff(GF2X& c, const GF2X& a) 2437 2437 { 2438 2438 RightShift(c, a, 1); 2439 2439 2440 2440 // clear odd coeffs 2441 2441 … … 2475 2475 void VectorCopy(vec_GF2& x, const GF2X& a, long n) 2476 2476 { 2477 if (n < 0) Error("VectorCopy: negative length"); 2477 if (n < 0) Error("VectorCopy: negative length"); 2478 2478 2479 2479 if (NTL_OVERFLOW(n, 1, 0)) … … 2511 2511 if (b & 1) { 2512 2512 long n = c.xrep.length(); 2513 if (n == 0) 2513 if (n == 0) 2514 2514 set(c); 2515 2515 else { … … 2577 2577 2578 2578 2579 void InnerProduct(GF2X& x, const GF2X& v, long dv, long low, long high, 2579 void InnerProduct(GF2X& x, const GF2X& v, long dv, long low, long high, 2580 2580 const vec_GF2X& H, long n, WordVector& t) 2581 2581 { … … 2591 2591 long b_low = low - w_low*NTL_BITS_PER_LONG; 2592 2592 2593 2593 2594 2594 const _ntl_ulong *vp = &v.xrep[w_low]; 2595 2595 _ntl_ulong msk = 1UL << b_low; … … 2660 2660 set(A.H[0]); 2661 2661 A.H[1] = h; 2662 for (i = 2; i <= m; i++) 2662 for (i = 2; i <= m; i++) 2663 2663 MulMod(A.H[i], A.H[i-1], h, F); 2664 2664 } … … 2710 2710 } 2711 2711 2712 void Comp3Mod(GF2X& x1, GF2X& x2, GF2X& x3, 2712 void Comp3Mod(GF2X& x1, GF2X& x2, GF2X& x3, 2713 2713 const GF2X& g1, const GF2X& g2, const GF2X& g3, 2714 2714 const GF2X& h, const GF2XModulus& F) … … 2760 2760 B.shamt_fbi = 0; 2761 2761 else 2762 B.shamt_fbi = F.n-2 - d; 2762 B.shamt_fbi = F.n-2 - d; 2763 2763 2764 2764 CopyReverse(B.fbi, t, d); 2765 2765 2766 2766 if (F.method != GF2X_MOD_TRI && F.method != GF2X_MOD_PENT) { 2767 2768 // The following code optimizes the case when 2767 2768 // The following code optimizes the case when 2769 2769 // f = X^n + low degree poly 2770 2770 2771 2771 trunc(t, F.f, F.n); 2772 2772 d = deg(t); … … 2836 2836 conv(x, xx); 2837 2837 } 2838 2838 2839 2839 2840 2840 void ProjectPowers(GF2X& x, const GF2X& a, long k, const GF2XArgument& H, … … 2843 2843 long n = F.n; 2844 2844 2845 if (deg(a) >= n || k < 0 || NTL_OVERFLOW(k, 1, 0)) 2845 if (deg(a) >= n || k < 0 || NTL_OVERFLOW(k, 1, 0)) 2846 2846 Error("ProjectPowers: bad args"); 2847 2847 … … 2870 2870 2871 2871 2872 void ProjectPowers(vec_GF2& x, const vec_GF2& a, long k, 2872 void ProjectPowers(vec_GF2& x, const vec_GF2& a, long k, 2873 2873 const GF2XArgument& H, const GF2XModulus& F) 2874 2874 { … … 2879 2879 2880 2880 2881 void ProjectPowers(GF2X& x, const GF2X& a, long k, const GF2X& h, 2881 void ProjectPowers(GF2X& x, const GF2X& a, long k, const GF2X& h, 2882 2882 const GF2XModulus& F) 2883 2883 { … … 2920 2920 2921 2921 CopyReverse(b_in, x, 2*m-1); 2922 2922 2923 2923 a.xrep.SetMaxLength(a_in.xrep.length()+1); 2924 2924 b.xrep.SetMaxLength(b_in.xrep.length()+1); … … 2977 2977 long t = ss + (da-db+NTL_BITS_PER_LONG-1)/NTL_BITS_PER_LONG; 2978 2978 if (t > sr) { 2979 while (t > 0 && rp[t-1] == 0) t--; 2979 while (t > 0 && rp[t-1] == 0) t--; 2980 2980 sr = t; 2981 2981 } … … 3012 3012 3013 3013 3014 void DoMinPolyMod(GF2X& h, const GF2X& g, const GF2XModulus& F, long m, 3014 void DoMinPolyMod(GF2X& h, const GF2X& g, const GF2XModulus& F, long m, 3015 3015 const GF2X& R) 3016 3016 { … … 3066 3066 GF2X R; 3067 3067 GF2XTransMultiplier H1; 3068 3068 3069 3069 3070 3070 for (;;) { … … 3112 3112 long da = deg(a); 3113 3113 long df = deg(F); 3114 if (da >= df) Error("MulByXMod: bad args"); 3114 if (da >= df) Error("MulByXMod: bad args"); 3115 3115 3116 3116 MulByX(c, a); … … 3125 3125 long da = deg(a); 3126 3126 long df = deg(f); 3127 if (da >= df) Error("MulByXMod: bad args"); 3127 if (da >= df) Error("MulByXMod: bad args"); 3128 3128 3129 3129 MulByX(c, a); … … 3171 3171 res.SetMaxLength(da*e + 1); 3172 3172 res = 1; 3173 3173 3174 3174 long k = NumBits(e); 3175 3175 long i; … … 3203 3203 long n = deg(f); 3204 3204 3205 if (n <= 0) 3205 if (n <= 0) 3206 3206 Error("TraceVec: bad args"); 3207 3207 … … 3213 3213 GF2X x = reverse(-LeftShift(reverse(diff(reverse(f)), n-1), n-1)/f, n-1); 3214 3214 3215 VectorCopy(S, x, n); 3215 VectorCopy(S, x, n); 3216 3216 S.put(0, to_GF2(n)); 3217 3217 } … … 3246 3246 Error("trace: bad args"); 3247 3247 3248 if (F.tracevec.length() == 0) 3248 if (F.tracevec.length() == 0) 3249 3249 ComputeTraceVec(F); 3250 3250 … … 3499 3499 return; 3500 3500 } 3501 3501 3502 3502 GF2X u1, v1; 3503 3503 … … 3665 3665 3666 3666 void MinPolyInternal(GF2X& h, const GF2X& x, long m) 3667 { 3667 { 3668 3668 if (m < NTL_GF2X_BERMASS_CROSSOVER) { 3669 3669 OldMinPolyInternal(h, x, m); … … 3673 3673 GF2X a, b; 3674 3674 _NTL_GF2XMatrix M; 3675 3675 3676 3676 SetCoeff(b, 2*m); 3677 3677 CopyReverse(a, x, 2*m-1); -
ntl/src/GF2XFactoring.c
r1d43d18 r287cc8 17 17 18 18 build(F, f); 19 19 20 20 GF2X h; 21 21 SetX(h); … … 119 119 } while (!finished); 120 120 } 121 121 122 122 123 123 … … 130 130 131 131 static 132 void ProcessTable(GF2X& f, vec_pair_GF2X_long& factors, 132 void ProcessTable(GF2X& f, vec_pair_GF2X_long& factors, 133 133 const GF2XModulus& F, long limit, const vec_GF2X& tbl, 134 134 long d, long verbose) … … 167 167 168 168 while (2*d <= deg(t1)) { 169 GCD(t2, tbl[i], t1); 169 GCD(t2, tbl[i], t1); 170 170 if (deg(t2) > 0) { 171 171 AddFactor(factors, t2, d, verbose); … … 255 255 256 256 if (deg(f) < old_n) { 257 // f has changed 257 // f has changed 258 258 259 259 build(F, f); … … 278 278 GF2X a, g; 279 279 GF2XModulus F; 280 280 281 281 build(F, f); 282 282 long n = F.n; … … 305 305 RecEDF(factors, f2, d); 306 306 } 307 307 308 308 309 309 void EDF(vec_GF2X& factors, const GF2X& ff, long d, long verbose) … … 338 338 } 339 339 340 340 341 341 double t; 342 342 … … 369 369 double t; 370 370 371 371 372 372 vec_pair_GF2X_long u; 373 373 DDF(u, f, verbose); … … 394 394 } 395 395 } 396 396 397 397 void CanZass(vec_pair_GF2X_long& factors, const GF2X& f, long verbose) 398 398 { … … 404 404 vec_GF2X x; 405 405 406 406 407 407 SquareFreeDecomp(sfd, f); 408 408 … … 497 497 498 498 499 static int GF2X_irred_tab[][3] = 499 static int GF2X_irred_tab[][3] = 500 500 501 501 {{0,0,0}, {0,0,0}, 502 {1,0,0}, {1,0,0}, {1,0,0}, {2,0,0}, {1,0,0}, {1,0,0}, 503 {4,3,1}, {1,0,0}, {3,0,0}, {2,0,0}, {3,0,0}, {4,3,1}, 504 {5,0,0}, {1,0,0}, {5,3,1}, {3,0,0}, {3,0,0}, {5,2,1}, 505 {3,0,0}, {2,0,0}, {1,0,0}, {5,0,0}, {4,3,1}, {3,0,0}, 506 {4,3,1}, {5,2,1}, {1,0,0}, {2,0,0}, {1,0,0}, {3,0,0}, 507 {7,3,2}, {10,0,0}, {7,0,0}, {2,0,0}, {9,0,0}, {6,4,1}, 508 {6,5,1}, {4,0,0}, {5,4,3}, {3,0,0}, {7,0,0}, {6,4,3}, 509 {5,0,0}, {4,3,1}, {1,0,0}, {5,0,0}, {5,3,2}, {9,0,0}, 510 {4,3,2}, {6,3,1}, {3,0,0}, {6,2,1}, {9,0,0}, {7,0,0}, 511 {7,4,2}, {4,0,0}, {19,0,0}, {7,4,2}, {1,0,0}, {5,2,1}, 512 {29,0,0}, {1,0,0}, {4,3,1}, {18,0,0}, {3,0,0}, {5,2,1}, 513 {9,0,0}, {6,5,2}, {5,3,1}, {6,0,0}, {10,9,3}, {25,0,0}, 514 {35,0,0}, {6,3,1}, {21,0,0}, {6,5,2}, {6,5,3}, {9,0,0}, 515 {9,4,2}, {4,0,0}, {8,3,1}, {7,4,2}, {5,0,0}, {8,2,1}, 516 {21,0,0}, {13,0,0}, {7,6,2}, {38,0,0}, {27,0,0}, {8,5,1}, 517 {21,0,0}, {2,0,0}, {21,0,0}, {11,0,0}, {10,9,6}, {6,0,0}, 518 {11,0,0}, {6,3,1}, {15,0,0}, {7,6,1}, {29,0,0}, {9,0,0}, 519 {4,3,1}, {4,0,0}, {15,0,0}, {9,7,4}, {17,0,0}, {5,4,2}, 520 {33,0,0}, {10,0,0}, {5,4,3}, {9,0,0}, {5,3,2}, {8,7,5}, 521 {4,2,1}, {5,2,1}, {33,0,0}, {8,0,0}, {4,3,1}, {18,0,0}, 522 {6,2,1}, {2,0,0}, {19,0,0}, {7,6,5}, {21,0,0}, {1,0,0}, 523 {7,2,1}, {5,0,0}, {3,0,0}, {8,3,2}, {17,0,0}, {9,8,2}, 524 {57,0,0}, {11,0,0}, {5,3,2}, {21,0,0}, {8,7,1}, {8,5,3}, 525 {15,0,0}, {10,4,1}, {21,0,0}, {5,3,2}, {7,4,2}, {52,0,0}, 526 {71,0,0}, {14,0,0}, {27,0,0}, {10,9,7}, {53,0,0}, {3,0,0}, 527 {6,3,2}, {1,0,0}, {15,0,0}, {62,0,0}, {9,0,0}, {6,5,2}, 528 {8,6,5}, {31,0,0}, {5,3,2}, {18,0,0}, {27,0,0}, {7,6,3}, 529 {10,8,7}, {9,8,3}, {37,0,0}, {6,0,0}, {15,3,2}, {34,0,0}, 530 {11,0,0}, {6,5,2}, {1,0,0}, {8,5,2}, {13,0,0}, {6,0,0}, 531 {11,3,2}, {8,0,0}, {31,0,0}, {4,2,1}, {3,0,0}, {7,6,1}, 532 {81,0,0}, {56,0,0}, {9,8,7}, {24,0,0}, {11,0,0}, {7,6,5}, 533 {6,5,2}, {6,5,2}, {8,7,6}, {9,0,0}, {7,2,1}, {15,0,0}, 534 {87,0,0}, {8,3,2}, {3,0,0}, {9,4,2}, {9,0,0}, {34,0,0}, 535 {5,3,2}, {14,0,0}, {55,0,0}, {8,7,1}, {27,0,0}, {9,5,2}, 536 {10,9,5}, {43,0,0}, {9,3,1}, {6,0,0}, {7,0,0}, {11,10,8}, 537 {105,0,0}, {6,5,2}, {73,0,0}, {23,0,0}, {7,3,1}, {45,0,0}, 538 {11,0,0}, {8,4,1}, {7,0,0}, {8,6,2}, {5,4,2}, {33,0,0}, 539 {9,8,3}, {32,0,0}, {10,7,3}, {10,9,4}, {113,0,0}, {10,4,1}, 540 {8,7,6}, {26,0,0}, {9,4,2}, {74,0,0}, {31,0,0}, {9,6,1}, 541 {5,0,0}, {7,4,1}, {73,0,0}, {36,0,0}, {8,5,3}, {70,0,0}, 542 {95,0,0}, {8,5,1}, {111,0,0}, {6,4,1}, {11,2,1}, {82,0,0}, 543 {15,14,10}, {35,0,0}, {103,0,0}, {7,4,2}, {15,0,0}, {46,0,0}, 544 {7,2,1}, {52,0,0}, {10,5,2}, {12,0,0}, {71,0,0}, {10,6,2}, 545 {15,0,0}, {7,6,4}, {9,8,4}, {93,0,0}, {9,6,2}, {42,0,0}, 546 {47,0,0}, {8,6,3}, {25,0,0}, {7,6,1}, {53,0,0}, {58,0,0}, 547 {9,3,2}, {23,0,0}, {67,0,0}, {11,10,9}, {63,0,0}, {12,6,3}, 548 {5,0,0}, {5,0,0}, {9,5,2}, {93,0,0}, {35,0,0}, {12,7,5}, 549 {53,0,0}, {10,7,5}, {69,0,0}, {71,0,0}, {11,10,1}, {21,0,0}, 550 {5,3,2}, {12,11,5}, {37,0,0}, {11,6,1}, {33,0,0}, {48,0,0}, 551 {7,3,2}, {5,0,0}, {11,8,4}, {11,6,4}, {5,0,0}, {9,5,2}, 552 {41,0,0}, {1,0,0}, {11,2,1}, {102,0,0}, {7,3,1}, {8,4,2}, 553 {15,0,0}, {10,6,4}, {93,0,0}, {7,5,3}, {9,7,4}, {79,0,0}, 554 {15,0,0}, {10,9,1}, {63,0,0}, {7,4,2}, {45,0,0}, {36,0,0}, 555 {4,3,1}, {31,0,0}, {67,0,0}, {10,3,1}, {51,0,0}, {10,5,2}, 556 {10,3,1}, {34,0,0}, {8,3,1}, {50,0,0}, {99,0,0}, {10,6,2}, 557 {89,0,0}, {2,0,0}, {5,2,1}, {10,7,2}, {7,4,1}, {55,0,0}, 558 {4,3,1}, {16,10,7}, {45,0,0}, {10,8,6}, {125,0,0}, {75,0,0}, 559 {7,2,1}, {22,0,0}, {63,0,0}, {11,10,3}, {103,0,0}, {6,5,2}, 560 {53,0,0}, {34,0,0}, {13,11,6}, {69,0,0}, {99,0,0}, {6,5,1}, 561 {10,9,7}, {11,10,2}, {57,0,0}, {68,0,0}, {5,3,2}, {7,4,1}, 562 {63,0,0}, {8,5,3}, {9,0,0}, {9,6,5}, {29,0,0}, {21,0,0}, 563 {7,3,2}, {91,0,0}, {139,0,0}, {8,3,2}, {111,0,0}, {8,7,2}, 564 {8,6,5}, {16,0,0}, {8,7,5}, {41,0,0}, {43,0,0}, {10,8,5}, 565 {47,0,0}, {5,2,1}, {81,0,0}, {90,0,0}, {12,3,2}, {6,0,0}, 566 {83,0,0}, {8,7,1}, {159,0,0}, {10,9,5}, {9,0,0}, {28,0,0}, 567 {13,10,6}, {7,0,0}, {135,0,0}, {11,6,5}, {25,0,0}, {12,7,6}, 568 {7,6,2}, {26,0,0}, {5,3,2}, {152,0,0}, {171,0,0}, {9,8,5}, 569 {65,0,0}, {13,8,2}, {141,0,0}, {71,0,0}, {5,3,2}, {87,0,0}, 570 {10,4,3}, {12,10,3}, {147,0,0}, {10,7,6}, {13,0,0}, {102,0,0}, 571 {9,5,2}, {107,0,0}, {199,0,0}, {15,5,4}, {7,0,0}, {5,4,2}, 572 {149,0,0}, {25,0,0}, {9,7,2}, {12,0,0}, {63,0,0}, {11,6,5}, 573 {105,0,0}, {10,8,7}, {14,6,1}, {120,0,0}, {13,4,3}, {33,0,0}, 574 {12,11,5}, {12,9,5}, {165,0,0}, {6,2,1}, {65,0,0}, {49,0,0}, 575 {4,3,1}, {7,0,0}, {7,5,2}, {10,6,1}, {81,0,0}, {7,6,4}, 576 {105,0,0}, {73,0,0}, {11,6,4}, {134,0,0}, {47,0,0}, {16,10,1}, 577 {6,5,4}, {15,6,4}, {8,6,1}, {38,0,0}, {18,9,6}, {16,0,0}, 578 {203,0,0}, {12,5,2}, {19,0,0}, {7,6,1}, {73,0,0}, {93,0,0}, 579 {19,18,13}, {31,0,0}, {14,11,6}, {11,6,1}, {27,0,0}, {9,5,2}, 580 {9,0,0}, {1,0,0}, {11,3,2}, {200,0,0}, {191,0,0}, {9,8,4}, 581 {9,0,0}, {16,15,7}, {121,0,0}, {104,0,0}, {15,9,6}, {138,0,0}, 582 {9,6,5}, {9,6,4}, {105,0,0}, {17,16,6}, {81,0,0}, {94,0,0}, 583 {4,3,1}, {83,0,0}, {219,0,0}, {11,6,3}, {7,0,0}, {10,5,3}, 584 {17,0,0}, {76,0,0}, {16,5,2}, {78,0,0}, {155,0,0}, {11,6,5}, 585 {27,0,0}, {5,4,2}, {8,5,4}, {3,0,0}, {15,14,6}, {156,0,0}, 586 {23,0,0}, {13,6,3}, {9,0,0}, {8,7,3}, {69,0,0}, {10,0,0}, 587 {8,5,2}, {26,0,0}, {67,0,0}, {14,7,4}, {21,0,0}, {12,10,2}, 588 {33,0,0}, {79,0,0}, {15,11,2}, {32,0,0}, {39,0,0}, {13,6,2}, 589 {167,0,0}, {6,4,1}, {97,0,0}, {47,0,0}, {11,6,2}, {42,0,0}, 590 {10,7,3}, {10,5,4}, {1,0,0}, {4,3,2}, {161,0,0}, {8,6,2}, 591 {7,5,3}, {94,0,0}, {195,0,0}, {10,5,4}, {9,0,0}, {13,10,4}, 592 {8,6,1}, {16,0,0}, {8,3,1}, {122,0,0}, {8,2,1}, {13,7,4}, 593 {10,5,3}, {16,4,3}, {193,0,0}, {135,0,0}, {19,16,9}, {39,0,0}, 594 {10,8,7}, {10,9,4}, {153,0,0}, {7,6,5}, {73,0,0}, {34,0,0}, 595 {11,9,6}, {71,0,0}, {11,4,2}, {14,7,3}, {163,0,0}, {11,6,1}, 596 {153,0,0}, {28,0,0}, {15,7,6}, {77,0,0}, {67,0,0}, {10,5,2}, 597 {12,8,1}, {10,6,4}, {13,0,0}, {146,0,0}, {13,4,3}, {25,0,0}, 598 {23,22,16}, {12,9,7}, {237,0,0}, {13,7,6}, {85,0,0}, {130,0,0}, 599 {14,13,3}, {88,0,0}, {7,5,2}, {11,6,1}, {35,0,0}, {10,4,3}, 600 {93,0,0}, {9,6,4}, {13,6,3}, {86,0,0}, {19,0,0}, {9,2,1}, 601 {273,0,0}, {14,12,9}, {7,6,1}, {30,0,0}, {9,5,2}, {201,0,0}, 602 {215,0,0}, {6,4,3}, {105,0,0}, {10,7,5}, {165,0,0}, {105,0,0}, 603 {19,13,6}, {31,0,0}, {127,0,0}, {10,4,2}, {81,0,0}, {19,10,4}, 604 {45,0,0}, {211,0,0}, {19,10,3}, {200,0,0}, {295,0,0}, {9,8,5}, 605 {9,0,0}, {12,6,5}, {297,0,0}, {68,0,0}, {11,6,5}, {133,0,0}, 606 {251,0,0}, {13,8,4}, {223,0,0}, {6,5,2}, {7,4,2}, {307,0,0}, 607 {9,2,1}, {101,0,0}, {39,0,0}, {14,10,4}, {217,0,0}, {14,9,1}, 608 {6,5,1}, {16,0,0}, {14,3,2}, {11,0,0}, {119,0,0}, {11,3,2}, 609 {11,6,5}, {11,8,4}, {249,0,0}, {5,0,0}, {13,3,1}, {37,0,0}, 610 {3,0,0}, {14,0,0}, {93,0,0}, {10,8,7}, {33,0,0}, {88,0,0}, 611 {7,5,4}, {38,0,0}, {55,0,0}, {15,4,2}, {11,0,0}, {12,11,4}, 612 {21,0,0}, {107,0,0}, {11,9,8}, {33,0,0}, {10,7,2}, {18,7,3}, 613 {147,0,0}, {5,4,2}, {153,0,0}, {15,0,0}, {11,6,5}, {28,0,0}, 614 {11,7,4}, {6,3,1}, {31,0,0}, {8,4,3}, {15,5,3}, {66,0,0}, 615 {23,16,9}, {11,9,3}, {171,0,0}, {11,6,1}, {209,0,0}, {4,3,1}, 616 {197,0,0}, {13,0,0}, {19,14,6}, {14,0,0}, {79,0,0}, {13,6,2}, 617 {299,0,0}, {15,8,2}, {169,0,0}, {177,0,0}, {23,10,2}, {267,0,0}, 618 {215,0,0}, {15,10,1}, {75,0,0}, {16,4,2}, {37,0,0}, {12,7,1}, 619 {8,3,2}, {17,0,0}, {12,11,8}, {15,8,5}, {15,0,0}, {4,3,1}, 620 {13,12,4}, {92,0,0}, {5,4,3}, {41,0,0}, {23,0,0}, {7,4,1}, 621 {183,0,0}, {16,7,1}, {165,0,0}, {150,0,0}, {9,6,4}, {9,0,0}, 622 {231,0,0}, {16,10,4}, {207,0,0}, {9,6,5}, {5,0,0}, {180,0,0}, 623 {4,3,2}, {58,0,0}, {147,0,0}, {8,6,2}, {343,0,0}, {8,7,2}, 624 {11,6,1}, {44,0,0}, {13,8,6}, {5,0,0}, {347,0,0}, {18,16,8}, 625 {135,0,0}, {9,8,3}, {85,0,0}, {90,0,0}, {13,11,1}, {258,0,0}, 626 {351,0,0}, {10,6,4}, {19,0,0}, {7,6,1}, {309,0,0}, {18,0,0}, 627 {13,10,3}, {158,0,0}, {19,0,0}, {12,10,1}, {45,0,0}, {7,6,1}, 628 {233,0,0}, {98,0,0}, {11,6,5}, {3,0,0}, {83,0,0}, {16,14,9}, 629 {6,5,3}, {9,7,4}, {22,19,9}, {168,0,0}, {19,17,4}, {120,0,0}, 630 {14,5,2}, {17,15,6}, {7,0,0}, {10,8,6}, {185,0,0}, {93,0,0}, 631 {15,14,7}, {29,0,0}, {375,0,0}, {10,8,3}, {13,0,0}, {17,16,2}, 632 {329,0,0}, {68,0,0}, {13,9,6}, {92,0,0}, {12,10,3}, {7,6,3}, 633 {17,10,3}, {5,2,1}, {9,6,1}, {30,0,0}, {9,7,3}, {253,0,0}, 634 {143,0,0}, {7,4,1}, {9,4,1}, {12,10,4}, {53,0,0}, {25,0,0}, 635 {9,7,1}, {217,0,0}, {15,13,9}, {14,9,2}, {75,0,0}, {8,7,2}, 636 {21,0,0}, {7,0,0}, {14,3,2}, {15,0,0}, {159,0,0}, {12,10,8}, 637 {29,0,0}, {10,3,1}, {21,0,0}, {333,0,0}, {11,8,2}, {52,0,0}, 638 {119,0,0}, {16,9,7}, {123,0,0}, {15,11,2}, {17,0,0}, {9,0,0}, 639 {11,6,4}, {38,0,0}, {255,0,0}, {12,10,7}, {189,0,0}, {4,3,1}, 640 {17,10,7}, {49,0,0}, {13,5,2}, {149,0,0}, {15,0,0}, {14,7,5}, 641 {10,9,2}, {8,6,5}, {61,0,0}, {54,0,0}, {11,5,1}, {144,0,0}, 642 {47,0,0}, {11,10,7}, {105,0,0}, {2,0,0}, {105,0,0}, {136,0,0}, 643 {11,4,1}, {253,0,0}, {111,0,0}, {13,10,5}, {159,0,0}, {10,7,1}, 644 {7,5,3}, {29,0,0}, {19,10,3}, {119,0,0}, {207,0,0}, {17,15,4}, 645 {35,0,0}, {14,0,0}, {349,0,0}, {6,3,2}, {21,10,6}, {1,0,0}, 646 {75,0,0}, {9,5,2}, {145,0,0}, {11,7,6}, {301,0,0}, {378,0,0}, 647 {13,3,1}, {352,0,0}, {12,7,4}, {12,8,1}, {149,0,0}, {6,5,4}, 648 {12,9,8}, {11,0,0}, {15,7,5}, {78,0,0}, {99,0,0}, {17,16,12}, 649 {173,0,0}, {8,7,1}, {13,9,8}, {147,0,0}, {19,18,10}, {127,0,0}, 650 {183,0,0}, {12,4,1}, {31,0,0}, {11,8,6}, {173,0,0}, {12,0,0}, 651 {7,5,3}, {113,0,0}, {207,0,0}, {18,15,5}, {1,0,0}, {13,7,6}, 652 {21,0,0}, {35,0,0}, {12,7,2}, {117,0,0}, {123,0,0}, {12,10,2}, 653 {143,0,0}, {14,4,1}, {15,9,7}, {204,0,0}, {7,5,1}, {91,0,0}, 654 {4,2,1}, {8,6,3}, {183,0,0}, {12,10,7}, {77,0,0}, {36,0,0}, 655 {14,9,6}, {221,0,0}, {7,6,5}, {16,14,13}, {31,0,0}, {16,15,7}, 656 {365,0,0}, {403,0,0}, {10,3,2}, {11,4,3}, {31,0,0}, {10,9,4}, 657 {177,0,0}, {16,6,1}, {22,6,5}, {417,0,0}, {15,13,12}, {217,0,0}, 658 {207,0,0}, {7,5,4}, {10,7,1}, {11,6,1}, {45,0,0}, {24,0,0}, 659 {12,11,9}, {77,0,0}, {21,20,13}, {9,6,5}, {189,0,0}, {8,3,2}, 660 {13,12,10}, {260,0,0}, {16,9,7}, {168,0,0}, {131,0,0}, {7,6,3}, 661 {305,0,0}, {10,9,6}, {13,9,4}, {143,0,0}, {12,9,3}, {18,0,0}, 662 {15,8,5}, {20,9,6}, {103,0,0}, {15,4,2}, {201,0,0}, {36,0,0}, 663 {9,5,2}, {31,0,0}, {11,7,2}, {6,2,1}, {7,0,0}, {13,6,4}, 664 {9,8,7}, {19,0,0}, {17,10,6}, {15,0,0}, {9,3,1}, {178,0,0}, 665 {8,7,6}, {12,6,5}, {177,0,0}, {230,0,0}, {24,9,3}, {222,0,0}, 666 {3,0,0}, {16,13,12}, {121,0,0}, {10,4,2}, {161,0,0}, {39,0,0}, 667 {17,15,13}, {62,0,0}, {223,0,0}, {15,12,2}, {65,0,0}, {12,6,3}, 668 {101,0,0}, {59,0,0}, {5,4,3}, {17,0,0}, {5,3,2}, {13,8,3}, 669 {10,9,7}, {12,8,2}, {5,4,3}, {75,0,0}, {19,17,8}, {55,0,0}, 670 {99,0,0}, {10,7,4}, {115,0,0}, {9,8,6}, {385,0,0}, {186,0,0}, 671 {15,6,3}, {9,4,1}, {12,10,5}, {10,8,1}, {135,0,0}, {5,2,1}, 672 {317,0,0}, {7,0,0}, {19,6,1}, {294,0,0}, {35,0,0}, {13,12,6}, 673 {119,0,0}, {98,0,0}, {93,0,0}, {68,0,0}, {21,15,3}, {108,0,0}, 674 {75,0,0}, {12,6,5}, {411,0,0}, {12,7,2}, {13,7,2}, {21,0,0}, 675 {15,10,8}, {412,0,0}, {439,0,0}, {10,7,6}, {41,0,0}, {13,9,6}, 676 {8,5,2}, {10,0,0}, {15,7,2}, {141,0,0}, {159,0,0}, {13,12,10}, 677 {291,0,0}, {10,9,1}, {105,0,0}, {24,0,0}, {11,2,1}, {198,0,0}, 678 {27,0,0}, {6,3,1}, {439,0,0}, {10,3,1}, {49,0,0}, {168,0,0}, 679 {13,11,9}, {463,0,0}, {10,9,3}, {13,9,8}, {15,8,3}, {18,16,8}, 680 {15,14,11}, {7,0,0}, {19,9,8}, {12,6,3}, {7,4,3}, {15,14,5}, 681 {8,6,3}, {10,9,7}, {361,0,0}, {230,0,0}, {15,9,6}, {24,0,0}, 682 {407,0,0}, {16,7,2}, {189,0,0}, {62,0,0}, {189,0,0}, {112,0,0}, 683 {22,21,10}, {91,0,0}, {79,0,0}, {12,10,5}, {23,0,0}, {7,6,1}, 684 {57,0,0}, {139,0,0}, {24,15,6}, {14,0,0}, {83,0,0}, {16,9,1}, 685 {35,0,0}, {9,7,4}, {117,0,0}, {65,0,0}, {21,9,6}, {21,0,0}, 686 {195,0,0}, {23,11,10}, {327,0,0}, {17,14,3}, {417,0,0}, {13,0,0}, 687 {15,8,6}, {107,0,0}, {19,10,6}, {18,15,3}, {59,0,0}, {12,10,4}, 688 {9,7,5}, {283,0,0}, {13,9,6}, {62,0,0}, {427,0,0}, {14,7,3}, 689 {8,7,4}, {15,8,3}, {105,0,0}, {27,0,0}, {7,3,1}, {103,0,0}, 690 {551,0,0}, {10,6,1}, {6,4,1}, {11,6,4}, {129,0,0}, {9,0,0}, 691 {9,4,2}, {277,0,0}, {31,0,0}, {13,12,5}, {141,0,0}, {12,7,3}, 692 {357,0,0}, {7,2,1}, {11,9,7}, {227,0,0}, {131,0,0}, {7,6,3}, 693 {23,0,0}, {20,17,3}, {13,4,1}, {90,0,0}, {15,3,2}, {241,0,0}, 694 {75,0,0}, {13,6,1}, {307,0,0}, {8,7,3}, {245,0,0}, {66,0,0}, 695 {15,11,2}, {365,0,0}, {18,16,11}, {11,10,1}, {19,0,0}, {8,6,1}, 696 {189,0,0}, {133,0,0}, {12,7,2}, {114,0,0}, {27,0,0}, {6,5,1}, 697 {15,5,2}, {17,14,5}, {133,0,0}, {476,0,0}, {11,9,3}, {16,0,0}, 698 {375,0,0}, {15,8,6}, {25,0,0}, {17,11,6}, {77,0,0}, {87,0,0}, 699 {5,3,2}, {134,0,0}, {171,0,0}, {13,8,4}, {75,0,0}, {8,3,1}, 700 {233,0,0}, {196,0,0}, {9,8,7}, {173,0,0}, {15,14,12}, {13,6,5}, 701 {281,0,0}, {9,8,2}, {405,0,0}, {114,0,0}, {15,9,6}, {171,0,0}, 702 {287,0,0}, {8,4,2}, {43,0,0}, {4,2,1}, {513,0,0}, {273,0,0}, 703 {11,10,6}, {118,0,0}, {243,0,0}, {14,7,1}, {203,0,0}, {9,5,2}, 704 {257,0,0}, {302,0,0}, {27,25,9}, {393,0,0}, {91,0,0}, {12,10,6}, 705 {413,0,0}, {15,14,9}, {18,16,1}, {255,0,0}, {12,9,7}, {234,0,0}, 706 {167,0,0}, {16,13,10}, {27,0,0}, {15,6,2}, {433,0,0}, {105,0,0}, 707 {25,10,2}, {151,0,0}, {427,0,0}, {13,9,8}, {49,0,0}, {10,6,4}, 708 {153,0,0}, {4,0,0}, {17,7,5}, {54,0,0}, {203,0,0}, {16,15,1}, 709 {16,14,7}, {13,6,1}, {25,0,0}, {14,0,0}, {15,5,3}, {187,0,0}, 710 {15,13,10}, {13,10,5}, {97,0,0}, {11,10,9}, {19,10,4}, {589,0,0}, 711 {31,30,2}, {289,0,0}, {9,6,4}, {11,8,6}, {21,0,0}, {7,4,1}, 712 {7,4,2}, {77,0,0}, {5,3,2}, {119,0,0}, {7,0,0}, {9,5,2}, 713 {345,0,0}, {17,10,8}, {333,0,0}, {17,0,0}, {16,9,7}, {168,0,0}, 714 {15,13,4}, {11,10,1}, {217,0,0}, {18,11,10}, {189,0,0}, {216,0,0}, 715 {12,7,5}, {229,0,0}, {231,0,0}, {12,9,3}, {223,0,0}, {10,9,1}, 716 {153,0,0}, {470,0,0}, {23,16,6}, {99,0,0}, {10,4,3}, {9,8,4}, 717 {12,10,1}, {14,9,6}, {201,0,0}, {38,0,0}, {15,14,2}, {198,0,0}, 718 {399,0,0}, {14,11,5}, {75,0,0}, {11,10,1}, {77,0,0}, {16,12,8}, 719 {20,17,15}, {326,0,0}, {39,0,0}, {14,12,9}, {495,0,0}, {8,3,2}, 720 {333,0,0}, {476,0,0}, {15,14,2}, {164,0,0}, {19,0,0}, {12,4,2}, 721 {8,6,3}, {13,12,3}, {12,11,5}, {129,0,0}, {12,9,3}, {52,0,0}, 722 {10,8,3}, {17,16,2}, {337,0,0}, {12,9,3}, {397,0,0}, {277,0,0}, 723 {21,11,3}, {73,0,0}, {11,6,1}, {7,5,4}, {95,0,0}, {11,3,2}, 724 {617,0,0}, {392,0,0}, {8,3,2}, {75,0,0}, {315,0,0}, {15,6,4}, 725 {125,0,0}, {6,5,2}, {15,9,7}, {348,0,0}, {15,6,1}, {553,0,0}, 726 {6,3,2}, {10,9,7}, {553,0,0}, {14,10,4}, {237,0,0}, {39,0,0}, 727 {17,14,6}, {371,0,0}, {255,0,0}, {8,4,1}, {131,0,0}, {14,6,1}, 728 {117,0,0}, {98,0,0}, {5,3,2}, {56,0,0}, {655,0,0}, {9,5,2}, 729 {239,0,0}, {11,8,4}, {1,0,0}, {134,0,0}, {15,9,5}, {88,0,0}, 730 {10,5,3}, {10,9,4}, {181,0,0}, {15,11,2}, {609,0,0}, {52,0,0}, 731 {19,18,10}, {100,0,0}, {7,6,3}, {15,8,2}, {183,0,0}, {18,7,6}, 732 {10,9,2}, {130,0,0}, {11,5,1}, {12,0,0}, {219,0,0}, {13,10,7}, 733 {11,0,0}, {19,9,4}, {129,0,0}, {3,0,0}, {17,15,5}, {300,0,0}, 734 {17,13,9}, {14,6,5}, {97,0,0}, {13,8,3}, {601,0,0}, {55,0,0}, 735 {8,3,1}, {92,0,0}, {127,0,0}, {12,11,2}, {81,0,0}, {15,10,8}, 736 {13,2,1}, {47,0,0}, {14,13,6}, {194,0,0}, {383,0,0}, {25,14,11}, 737 {125,0,0}, {20,19,16}, {429,0,0}, {282,0,0}, {10,9,6}, {342,0,0}, 738 {5,3,2}, {15,9,4}, {33,0,0}, {9,4,2}, {49,0,0}, {15,0,0}, 739 {11,6,2}, {28,0,0}, {103,0,0}, {18,17,8}, {27,0,0}, {11,6,5}, 740 {33,0,0}, {17,0,0}, {11,10,6}, {387,0,0}, {363,0,0}, {15,10,9}, 741 {83,0,0}, {7,6,4}, {357,0,0}, {13,12,4}, {14,13,7}, {322,0,0}, 742 {395,0,0}, {16,5,1}, {595,0,0}, {13,10,3}, {421,0,0}, {195,0,0}, 743 {11,3,2}, {13,0,0}, {16,12,3}, {14,3,1}, {315,0,0}, {26,10,5}, 744 {297,0,0}, {52,0,0}, {9,4,2}, {314,0,0}, {243,0,0}, {16,14,9}, 745 {185,0,0}, {12,5,3}, {13,5,2}, {575,0,0}, {12,9,3}, {39,0,0}, 746 {311,0,0}, {13,5,2}, {181,0,0}, {20,18,14}, {49,0,0}, {25,0,0}, 747 {11,4,1}, {77,0,0}, {17,11,10}, {15,14,8}, {21,0,0}, {17,10,5}, 748 {69,0,0}, {49,0,0}, {11,10,2}, {32,0,0}, {411,0,0}, {21,16,3}, 749 {11,7,4}, {22,10,3}, {85,0,0}, {140,0,0}, {9,8,6}, {252,0,0}, 750 {279,0,0}, {9,5,2}, {307,0,0}, {17,10,4}, {13,12,9}, {94,0,0}, 751 {13,11,4}, {49,0,0}, {17,11,10}, {16,12,5}, {25,0,0}, {6,5,2}, 752 {12,5,1}, {80,0,0}, {8,3,2}, {246,0,0}, {11,5,2}, {11,10,2}, 753 {599,0,0}, {18,12,10}, {189,0,0}, {278,0,0}, {10,9,3}, {399,0,0}, 754 {299,0,0}, {13,10,6}, {277,0,0}, {13,10,6}, {69,0,0}, {220,0,0}, 755 {13,10,3}, {229,0,0}, {18,11,10}, {16,15,1}, {27,0,0}, {18,9,3}, 756 {473,0,0}, {373,0,0}, {18,17,7}, {60,0,0}, {207,0,0}, {13,9,8}, 757 {22,20,13}, {25,18,7}, {225,0,0}, {404,0,0}, {21,6,2}, {46,0,0}, 758 {6,2,1}, {17,12,6}, {75,0,0}, {4,2,1}, {365,0,0}, {445,0,0}, 759 {11,7,1}, {44,0,0}, {10,8,5}, {12,5,2}, {63,0,0}, {17,4,2}, 760 {189,0,0}, {557,0,0}, {19,12,2}, {252,0,0}, {99,0,0}, {10,8,5}, 761 {65,0,0}, {14,9,3}, {9,0,0}, {119,0,0}, {8,5,2}, {339,0,0}, 762 {95,0,0}, {12,9,7}, {7,0,0}, {13,10,2}, {77,0,0}, {127,0,0}, 763 {21,10,7}, {319,0,0}, {667,0,0}, {17,10,3}, {501,0,0}, {18,12,9}, 764 {9,8,5}, {17,0,0}, {20,9,2}, {341,0,0}, {731,0,0}, {7,6,5}, 765 {647,0,0}, {10,4,2}, {121,0,0}, {20,0,0}, {21,19,13}, {574,0,0}, 766 {399,0,0}, {15,10,7}, {85,0,0}, {16,8,3}, {169,0,0}, {15,0,0}, 767 {12,7,5}, {568,0,0}, {10,7,1}, {18,2,1}, {3,0,0}, {14,3,2}, 768 {13,7,3}, {643,0,0}, {14,11,1}, {548,0,0}, {783,0,0}, {14,11,1}, 769 {317,0,0}, {7,6,4}, {153,0,0}, {87,0,0}, {15,13,1}, {231,0,0}, 770 {11,5,3}, {18,13,7}, {771,0,0}, {30,20,11}, {15,6,3}, {103,0,0}, 771 {13,4,3}, {182,0,0}, {211,0,0}, {17,6,1}, {27,0,0}, {13,12,10}, 772 {15,14,10}, {17,0,0}, {13,11,5}, {69,0,0}, {11,5,1}, {18,6,1}, 773 {603,0,0}, {10,4,2}, {741,0,0}, {668,0,0}, {17,15,3}, {147,0,0}, 774 {227,0,0}, {15,10,9}, {37,0,0}, {16,6,1}, {173,0,0}, {427,0,0}, 775 {7,5,1}, {287,0,0}, {231,0,0}, {20,15,10}, {18,9,1}, {14,12,5}, 776 {16,5,1}, {310,0,0}, {18,13,1}, {434,0,0}, {579,0,0}, {18,13,8}, 777 {45,0,0}, {12,8,3}, {16,9,5}, {53,0,0}, {19,15,10}, {16,0,0}, 778 {17,6,5}, {17,10,1}, {37,0,0}, {17,10,9}, {21,13,7}, {99,0,0}, 779 {17,9,6}, {176,0,0}, {271,0,0}, {18,17,13}, {459,0,0}, {21,17,10}, 780 {6,5,2}, {202,0,0}, {5,4,3}, {90,0,0}, {755,0,0}, {15,7,2}, 781 {363,0,0}, {8,4,2}, {129,0,0}, {20,0,0}, {11,6,2}, {135,0,0}, 782 {15,8,7}, {14,13,2}, {10,4,3}, {24,13,10}, {19,14,11}, {31,0,0}, 783 {15,8,6}, {758,0,0}, {16,11,5}, {16,5,1}, {359,0,0}, {23,18,17}, 784 {501,0,0}, {29,0,0}, {15,6,3}, {201,0,0}, {459,0,0}, {12,10,7}, 785 {225,0,0}, {22,17,13}, {24,22,5}, {161,0,0}, {14,11,3}, {52,0,0}, 786 {19,17,6}, {21,14,12}, {93,0,0}, {13,10,3}, {201,0,0}, {178,0,0}, 787 {15,12,5}, {250,0,0}, {7,6,4}, {17,13,6}, {221,0,0}, {13,11,8}, 788 {17,14,9}, {113,0,0}, {17,14,10}, {300,0,0}, {39,0,0}, {18,13,3}, 789 {261,0,0}, {15,14,8}, {753,0,0}, {8,4,3}, {11,10,5}, {94,0,0}, 790 {15,13,1}, {10,4,2}, {14,11,10}, {8,6,2}, {461,0,0}, {418,0,0}, 791 {19,14,6}, {403,0,0}, {267,0,0}, {10,9,2}, {259,0,0}, {20,4,3}, 792 {869,0,0}, {173,0,0}, {19,18,2}, {369,0,0}, {255,0,0}, {22,12,9}, 793 {567,0,0}, {20,11,7}, {457,0,0}, {482,0,0}, {6,3,2}, {775,0,0}, 794 {19,17,6}, {6,4,3}, {99,0,0}, {15,14,8}, {6,5,2}, {165,0,0}, 795 {8,3,2}, {13,12,10}, {25,21,17}, {17,14,9}, {105,0,0}, {17,15,14}, 796 {10,3,2}, {250,0,0}, {25,6,5}, {327,0,0}, {279,0,0}, {13,6,5}, 797 {371,0,0}, {15,9,4}, {117,0,0}, {486,0,0}, {10,9,3}, {217,0,0}, 798 {635,0,0}, {30,27,17}, {457,0,0}, {16,6,2}, {57,0,0}, {439,0,0}, 799 {23,21,6}, {214,0,0}, {20,13,6}, {20,16,1}, {819,0,0}, {15,11,8}, 800 {593,0,0}, {190,0,0}, {17,14,3}, {114,0,0}, {21,18,3}, {10,5,2}, 801 {12,9,5}, {8,6,3}, {69,0,0}, {312,0,0}, {22,5,2}, {502,0,0}, 802 {843,0,0}, {15,10,3}, {747,0,0}, {6,5,2}, {101,0,0}, {123,0,0}, 803 {19,16,9}, {521,0,0}, {171,0,0}, {16,7,2}, {12,6,5}, {22,21,20}, 804 {545,0,0}, {163,0,0}, {23,18,1}, {479,0,0}, {495,0,0}, {13,6,5}, 805 {11,0,0}, {17,5,2}, {18,8,1}, {684,0,0}, {7,5,1}, {9,0,0}, 806 {18,11,3}, {22,20,13}, {273,0,0}, {4,3,2}, {381,0,0}, {51,0,0}, 807 {18,13,7}, {518,0,0}, {9,5,1}, {14,12,3}, {243,0,0}, {21,17,2}, 808 {53,0,0}, {836,0,0}, {21,10,2}, {66,0,0}, {12,10,7}, {13,9,8}, 809 {339,0,0}, {16,11,5}, {901,0,0}, {180,0,0}, {16,13,3}, {49,0,0}, 810 {6,3,2}, {15,4,1}, {16,13,6}, {18,15,12}, {885,0,0}, {39,0,0}, 811 {11,9,4}, {688,0,0}, {16,15,7}, {13,10,6}, {13,0,0}, {25,23,12}, 812 {149,0,0}, {260,0,0}, {11,9,1}, {53,0,0}, {11,0,0}, {12,4,2}, 813 {9,7,5}, {11,8,1}, {121,0,0}, {261,0,0}, {10,5,2}, {199,0,0}, 814 {20,4,3}, {17,9,2}, {13,9,4}, {12,8,7}, {253,0,0}, {174,0,0}, 815 {15,4,2}, {370,0,0}, {9,6,1}, {16,10,9}, {669,0,0}, {20,10,9}, 816 {833,0,0}, {353,0,0}, {17,13,2}, {29,0,0}, {371,0,0}, {9,8,5}, 817 {8,7,1}, {19,8,7}, {12,11,10}, {873,0,0}, {26,11,2}, {12,9,1}, 818 {10,7,2}, {13,6,1}, {235,0,0}, {26,24,19}, {733,0,0}, {778,0,0}, 819 {12,11,1}, {344,0,0}, {931,0,0}, {16,6,4}, {945,0,0}, {21,19,14}, 820 {18,13,11}, {67,0,0}, {20,15,10}, {462,0,0}, {14,5,1}, {10,9,6}, 821 {18,11,10}, {16,9,7}, {477,0,0}, {105,0,0}, {11,3,2}, {468,0,0}, 822 {23,16,15}, {16,15,6}, {327,0,0}, {23,10,4}, {357,0,0}, {25,0,0}, 823 {17,16,7}, {31,0,0}, {7,5,2}, {16,7,6}, {277,0,0}, {14,13,6}, 824 {413,0,0}, {103,0,0}, {15,10,1}, {231,0,0}, {747,0,0}, {5,2,1}, 825 {113,0,0}, {20,10,7}, {15,9,6}, {11,0,0}, {27,22,18}, {91,0,0}, 826 {51,0,0}, {18,13,12}, {603,0,0}, {10,7,3}, {9,0,0}, {121,0,0}, 827 {15,14,6}, {17,0,0}, {16,11,2}, {23,15,6}, {279,0,0}, {16,12,6}, 828 {89,0,0}, {371,0,0}, {17,15,2}, {771,0,0}, {99,0,0}, {7,6,3}, 829 {21,0,0}, {10,7,5}, {801,0,0}, {26,0,0}, {25,19,14}, {175,0,0}, 830 {10,7,2}, {20,5,4}, {12,11,1}, {22,5,1}, {165,0,0}, {841,0,0}, 831 {25,19,17}, {238,0,0}, {11,8,6}, {22,21,4}, {33,0,0}, {8,7,6}, 832 {14,9,2}, {113,0,0}, {13,11,5}, {311,0,0}, {891,0,0}, {20,16,14}, 833 {555,0,0}, {23,14,8}, {133,0,0}, {546,0,0}, {6,3,2}, {103,0,0}, 834 {15,0,0}, {10,7,3}, {307,0,0}, {14,10,1}, {15,12,2}, {367,0,0}, 835 {13,10,6}, {169,0,0}, {22,21,11}, {12,10,8}, {441,0,0}, {17,12,7}, 836 {917,0,0}, {205,0,0}, {26,23,13}, {54,0,0}, {459,0,0}, {17,15,4}, 837 {19,15,4}, {5,4,2}, {9,7,6}, {42,0,0}, {21,15,7}, {330,0,0}, 838 {20,7,3}, {20,7,2}, {81,0,0}, {19,14,1}, {349,0,0}, {165,0,0}, 839 {40,35,9}, {274,0,0}, {475,0,0}, {11,10,3}, {93,0,0}, {12,7,4}, 840 {13,12,2}, {386,0,0}, {7,6,2}, {881,0,0}, {143,0,0}, {9,8,4}, 841 {71,0,0}, {19,18,3}, {16,11,6}, {155,0,0}, {7,2,1}, {735,0,0}, 842 {16,8,7}, {9,7,4}, {45,0,0}, {7,6,4}, {12,11,3}, {3,0,0}, 502 {1,0,0}, {1,0,0}, {1,0,0}, {2,0,0}, {1,0,0}, {1,0,0}, 503 {4,3,1}, {1,0,0}, {3,0,0}, {2,0,0}, {3,0,0}, {4,3,1}, 504 {5,0,0}, {1,0,0}, {5,3,1}, {3,0,0}, {3,0,0}, {5,2,1}, 505 {3,0,0}, {2,0,0}, {1,0,0}, {5,0,0}, {4,3,1}, {3,0,0}, 506 {4,3,1}, {5,2,1}, {1,0,0}, {2,0,0}, {1,0,0}, {3,0,0}, 507 {7,3,2}, {10,0,0}, {7,0,0}, {2,0,0}, {9,0,0}, {6,4,1}, 508 {6,5,1}, {4,0,0}, {5,4,3}, {3,0,0}, {7,0,0}, {6,4,3}, 509 {5,0,0}, {4,3,1}, {1,0,0}, {5,0,0}, {5,3,2}, {9,0,0}, 510 {4,3,2}, {6,3,1}, {3,0,0}, {6,2,1}, {9,0,0}, {7,0,0}, 511 {7,4,2}, {4,0,0}, {19,0,0}, {7,4,2}, {1,0,0}, {5,2,1}, 512 {29,0,0}, {1,0,0}, {4,3,1}, {18,0,0}, {3,0,0}, {5,2,1}, 513 {9,0,0}, {6,5,2}, {5,3,1}, {6,0,0}, {10,9,3}, {25,0,0}, 514 {35,0,0}, {6,3,1}, {21,0,0}, {6,5,2}, {6,5,3}, {9,0,0}, 515 {9,4,2}, {4,0,0}, {8,3,1}, {7,4,2}, {5,0,0}, {8,2,1}, 516 {21,0,0}, {13,0,0}, {7,6,2}, {38,0,0}, {27,0,0}, {8,5,1}, 517 {21,0,0}, {2,0,0}, {21,0,0}, {11,0,0}, {10,9,6}, {6,0,0}, 518 {11,0,0}, {6,3,1}, {15,0,0}, {7,6,1}, {29,0,0}, {9,0,0}, 519 {4,3,1}, {4,0,0}, {15,0,0}, {9,7,4}, {17,0,0}, {5,4,2}, 520 {33,0,0}, {10,0,0}, {5,4,3}, {9,0,0}, {5,3,2}, {8,7,5}, 521 {4,2,1}, {5,2,1}, {33,0,0}, {8,0,0}, {4,3,1}, {18,0,0}, 522 {6,2,1}, {2,0,0}, {19,0,0}, {7,6,5}, {21,0,0}, {1,0,0}, 523 {7,2,1}, {5,0,0}, {3,0,0}, {8,3,2}, {17,0,0}, {9,8,2}, 524 {57,0,0}, {11,0,0}, {5,3,2}, {21,0,0}, {8,7,1}, {8,5,3}, 525 {15,0,0}, {10,4,1}, {21,0,0}, {5,3,2}, {7,4,2}, {52,0,0}, 526 {71,0,0}, {14,0,0}, {27,0,0}, {10,9,7}, {53,0,0}, {3,0,0}, 527 {6,3,2}, {1,0,0}, {15,0,0}, {62,0,0}, {9,0,0}, {6,5,2}, 528 {8,6,5}, {31,0,0}, {5,3,2}, {18,0,0}, {27,0,0}, {7,6,3}, 529 {10,8,7}, {9,8,3}, {37,0,0}, {6,0,0}, {15,3,2}, {34,0,0}, 530 {11,0,0}, {6,5,2}, {1,0,0}, {8,5,2}, {13,0,0}, {6,0,0}, 531 {11,3,2}, {8,0,0}, {31,0,0}, {4,2,1}, {3,0,0}, {7,6,1}, 532 {81,0,0}, {56,0,0}, {9,8,7}, {24,0,0}, {11,0,0}, {7,6,5}, 533 {6,5,2}, {6,5,2}, {8,7,6}, {9,0,0}, {7,2,1}, {15,0,0}, 534 {87,0,0}, {8,3,2}, {3,0,0}, {9,4,2}, {9,0,0}, {34,0,0}, 535 {5,3,2}, {14,0,0}, {55,0,0}, {8,7,1}, {27,0,0}, {9,5,2}, 536 {10,9,5}, {43,0,0}, {9,3,1}, {6,0,0}, {7,0,0}, {11,10,8}, 537 {105,0,0}, {6,5,2}, {73,0,0}, {23,0,0}, {7,3,1}, {45,0,0}, 538 {11,0,0}, {8,4,1}, {7,0,0}, {8,6,2}, {5,4,2}, {33,0,0}, 539 {9,8,3}, {32,0,0}, {10,7,3}, {10,9,4}, {113,0,0}, {10,4,1}, 540 {8,7,6}, {26,0,0}, {9,4,2}, {74,0,0}, {31,0,0}, {9,6,1}, 541 {5,0,0}, {7,4,1}, {73,0,0}, {36,0,0}, {8,5,3}, {70,0,0}, 542 {95,0,0}, {8,5,1}, {111,0,0}, {6,4,1}, {11,2,1}, {82,0,0}, 543 {15,14,10}, {35,0,0}, {103,0,0}, {7,4,2}, {15,0,0}, {46,0,0}, 544 {7,2,1}, {52,0,0}, {10,5,2}, {12,0,0}, {71,0,0}, {10,6,2}, 545 {15,0,0}, {7,6,4}, {9,8,4}, {93,0,0}, {9,6,2}, {42,0,0}, 546 {47,0,0}, {8,6,3}, {25,0,0}, {7,6,1}, {53,0,0}, {58,0,0}, 547 {9,3,2}, {23,0,0}, {67,0,0}, {11,10,9}, {63,0,0}, {12,6,3}, 548 {5,0,0}, {5,0,0}, {9,5,2}, {93,0,0}, {35,0,0}, {12,7,5}, 549 {53,0,0}, {10,7,5}, {69,0,0}, {71,0,0}, {11,10,1}, {21,0,0}, 550 {5,3,2}, {12,11,5}, {37,0,0}, {11,6,1}, {33,0,0}, {48,0,0}, 551 {7,3,2}, {5,0,0}, {11,8,4}, {11,6,4}, {5,0,0}, {9,5,2}, 552 {41,0,0}, {1,0,0}, {11,2,1}, {102,0,0}, {7,3,1}, {8,4,2}, 553 {15,0,0}, {10,6,4}, {93,0,0}, {7,5,3}, {9,7,4}, {79,0,0}, 554 {15,0,0}, {10,9,1}, {63,0,0}, {7,4,2}, {45,0,0}, {36,0,0}, 555 {4,3,1}, {31,0,0}, {67,0,0}, {10,3,1}, {51,0,0}, {10,5,2}, 556 {10,3,1}, {34,0,0}, {8,3,1}, {50,0,0}, {99,0,0}, {10,6,2}, 557 {89,0,0}, {2,0,0}, {5,2,1}, {10,7,2}, {7,4,1}, {55,0,0}, 558 {4,3,1}, {16,10,7}, {45,0,0}, {10,8,6}, {125,0,0}, {75,0,0}, 559 {7,2,1}, {22,0,0}, {63,0,0}, {11,10,3}, {103,0,0}, {6,5,2}, 560 {53,0,0}, {34,0,0}, {13,11,6}, {69,0,0}, {99,0,0}, {6,5,1}, 561 {10,9,7}, {11,10,2}, {57,0,0}, {68,0,0}, {5,3,2}, {7,4,1}, 562 {63,0,0}, {8,5,3}, {9,0,0}, {9,6,5}, {29,0,0}, {21,0,0}, 563 {7,3,2}, {91,0,0}, {139,0,0}, {8,3,2}, {111,0,0}, {8,7,2}, 564 {8,6,5}, {16,0,0}, {8,7,5}, {41,0,0}, {43,0,0}, {10,8,5}, 565 {47,0,0}, {5,2,1}, {81,0,0}, {90,0,0}, {12,3,2}, {6,0,0}, 566 {83,0,0}, {8,7,1}, {159,0,0}, {10,9,5}, {9,0,0}, {28,0,0}, 567 {13,10,6}, {7,0,0}, {135,0,0}, {11,6,5}, {25,0,0}, {12,7,6}, 568 {7,6,2}, {26,0,0}, {5,3,2}, {152,0,0}, {171,0,0}, {9,8,5}, 569 {65,0,0}, {13,8,2}, {141,0,0}, {71,0,0}, {5,3,2}, {87,0,0}, 570 {10,4,3}, {12,10,3}, {147,0,0}, {10,7,6}, {13,0,0}, {102,0,0}, 571 {9,5,2}, {107,0,0}, {199,0,0}, {15,5,4}, {7,0,0}, {5,4,2}, 572 {149,0,0}, {25,0,0}, {9,7,2}, {12,0,0}, {63,0,0}, {11,6,5}, 573 {105,0,0}, {10,8,7}, {14,6,1}, {120,0,0}, {13,4,3}, {33,0,0}, 574 {12,11,5}, {12,9,5}, {165,0,0}, {6,2,1}, {65,0,0}, {49,0,0}, 575 {4,3,1}, {7,0,0}, {7,5,2}, {10,6,1}, {81,0,0}, {7,6,4}, 576 {105,0,0}, {73,0,0}, {11,6,4}, {134,0,0}, {47,0,0}, {16,10,1}, 577 {6,5,4}, {15,6,4}, {8,6,1}, {38,0,0}, {18,9,6}, {16,0,0}, 578 {203,0,0}, {12,5,2}, {19,0,0}, {7,6,1}, {73,0,0}, {93,0,0}, 579 {19,18,13}, {31,0,0}, {14,11,6}, {11,6,1}, {27,0,0}, {9,5,2}, 580 {9,0,0}, {1,0,0}, {11,3,2}, {200,0,0}, {191,0,0}, {9,8,4}, 581 {9,0,0}, {16,15,7}, {121,0,0}, {104,0,0}, {15,9,6}, {138,0,0}, 582 {9,6,5}, {9,6,4}, {105,0,0}, {17,16,6}, {81,0,0}, {94,0,0}, 583 {4,3,1}, {83,0,0}, {219,0,0}, {11,6,3}, {7,0,0}, {10,5,3}, 584 {17,0,0}, {76,0,0}, {16,5,2}, {78,0,0}, {155,0,0}, {11,6,5}, 585 {27,0,0}, {5,4,2}, {8,5,4}, {3,0,0}, {15,14,6}, {156,0,0}, 586 {23,0,0}, {13,6,3}, {9,0,0}, {8,7,3}, {69,0,0}, {10,0,0}, 587 {8,5,2}, {26,0,0}, {67,0,0}, {14,7,4}, {21,0,0}, {12,10,2}, 588 {33,0,0}, {79,0,0}, {15,11,2}, {32,0,0}, {39,0,0}, {13,6,2}, 589 {167,0,0}, {6,4,1}, {97,0,0}, {47,0,0}, {11,6,2}, {42,0,0}, 590 {10,7,3}, {10,5,4}, {1,0,0}, {4,3,2}, {161,0,0}, {8,6,2}, 591 {7,5,3}, {94,0,0}, {195,0,0}, {10,5,4}, {9,0,0}, {13,10,4}, 592 {8,6,1}, {16,0,0}, {8,3,1}, {122,0,0}, {8,2,1}, {13,7,4}, 593 {10,5,3}, {16,4,3}, {193,0,0}, {135,0,0}, {19,16,9}, {39,0,0}, 594 {10,8,7}, {10,9,4}, {153,0,0}, {7,6,5}, {73,0,0}, {34,0,0}, 595 {11,9,6}, {71,0,0}, {11,4,2}, {14,7,3}, {163,0,0}, {11,6,1}, 596 {153,0,0}, {28,0,0}, {15,7,6}, {77,0,0}, {67,0,0}, {10,5,2}, 597 {12,8,1}, {10,6,4}, {13,0,0}, {146,0,0}, {13,4,3}, {25,0,0}, 598 {23,22,16}, {12,9,7}, {237,0,0}, {13,7,6}, {85,0,0}, {130,0,0}, 599 {14,13,3}, {88,0,0}, {7,5,2}, {11,6,1}, {35,0,0}, {10,4,3}, 600 {93,0,0}, {9,6,4}, {13,6,3}, {86,0,0}, {19,0,0}, {9,2,1}, 601 {273,0,0}, {14,12,9}, {7,6,1}, {30,0,0}, {9,5,2}, {201,0,0}, 602 {215,0,0}, {6,4,3}, {105,0,0}, {10,7,5}, {165,0,0}, {105,0,0}, 603 {19,13,6}, {31,0,0}, {127,0,0}, {10,4,2}, {81,0,0}, {19,10,4}, 604 {45,0,0}, {211,0,0}, {19,10,3}, {200,0,0}, {295,0,0}, {9,8,5}, 605 {9,0,0}, {12,6,5}, {297,0,0}, {68,0,0}, {11,6,5}, {133,0,0}, 606 {251,0,0}, {13,8,4}, {223,0,0}, {6,5,2}, {7,4,2}, {307,0,0}, 607 {9,2,1}, {101,0,0}, {39,0,0}, {14,10,4}, {217,0,0}, {14,9,1}, 608 {6,5,1}, {16,0,0}, {14,3,2}, {11,0,0}, {119,0,0}, {11,3,2}, 609 {11,6,5}, {11,8,4}, {249,0,0}, {5,0,0}, {13,3,1}, {37,0,0}, 610 {3,0,0}, {14,0,0}, {93,0,0}, {10,8,7}, {33,0,0}, {88,0,0}, 611 {7,5,4}, {38,0,0}, {55,0,0}, {15,4,2}, {11,0,0}, {12,11,4}, 612 {21,0,0}, {107,0,0}, {11,9,8}, {33,0,0}, {10,7,2}, {18,7,3}, 613 {147,0,0}, {5,4,2}, {153,0,0}, {15,0,0}, {11,6,5}, {28,0,0}, 614 {11,7,4}, {6,3,1}, {31,0,0}, {8,4,3}, {15,5,3}, {66,0,0}, 615 {23,16,9}, {11,9,3}, {171,0,0}, {11,6,1}, {209,0,0}, {4,3,1}, 616 {197,0,0}, {13,0,0}, {19,14,6}, {14,0,0}, {79,0,0}, {13,6,2}, 617 {299,0,0}, {15,8,2}, {169,0,0}, {177,0,0}, {23,10,2}, {267,0,0}, 618 {215,0,0}, {15,10,1}, {75,0,0}, {16,4,2}, {37,0,0}, {12,7,1}, 619 {8,3,2}, {17,0,0}, {12,11,8}, {15,8,5}, {15,0,0}, {4,3,1}, 620 {13,12,4}, {92,0,0}, {5,4,3}, {41,0,0}, {23,0,0}, {7,4,1}, 621 {183,0,0}, {16,7,1}, {165,0,0}, {150,0,0}, {9,6,4}, {9,0,0}, 622 {231,0,0}, {16,10,4}, {207,0,0}, {9,6,5}, {5,0,0}, {180,0,0}, 623 {4,3,2}, {58,0,0}, {147,0,0}, {8,6,2}, {343,0,0}, {8,7,2}, 624 {11,6,1}, {44,0,0}, {13,8,6}, {5,0,0}, {347,0,0}, {18,16,8}, 625 {135,0,0}, {9,8,3}, {85,0,0}, {90,0,0}, {13,11,1}, {258,0,0}, 626 {351,0,0}, {10,6,4}, {19,0,0}, {7,6,1}, {309,0,0}, {18,0,0}, 627 {13,10,3}, {158,0,0}, {19,0,0}, {12,10,1}, {45,0,0}, {7,6,1}, 628 {233,0,0}, {98,0,0}, {11,6,5}, {3,0,0}, {83,0,0}, {16,14,9}, 629 {6,5,3}, {9,7,4}, {22,19,9}, {168,0,0}, {19,17,4}, {120,0,0}, 630 {14,5,2}, {17,15,6}, {7,0,0}, {10,8,6}, {185,0,0}, {93,0,0}, 631 {15,14,7}, {29,0,0}, {375,0,0}, {10,8,3}, {13,0,0}, {17,16,2}, 632 {329,0,0}, {68,0,0}, {13,9,6}, {92,0,0}, {12,10,3}, {7,6,3}, 633 {17,10,3}, {5,2,1}, {9,6,1}, {30,0,0}, {9,7,3}, {253,0,0}, 634 {143,0,0}, {7,4,1}, {9,4,1}, {12,10,4}, {53,0,0}, {25,0,0}, 635 {9,7,1}, {217,0,0}, {15,13,9}, {14,9,2}, {75,0,0}, {8,7,2}, 636 {21,0,0}, {7,0,0}, {14,3,2}, {15,0,0}, {159,0,0}, {12,10,8}, 637 {29,0,0}, {10,3,1}, {21,0,0}, {333,0,0}, {11,8,2}, {52,0,0}, 638 {119,0,0}, {16,9,7}, {123,0,0}, {15,11,2}, {17,0,0}, {9,0,0}, 639 {11,6,4}, {38,0,0}, {255,0,0}, {12,10,7}, {189,0,0}, {4,3,1}, 640 {17,10,7}, {49,0,0}, {13,5,2}, {149,0,0}, {15,0,0}, {14,7,5}, 641 {10,9,2}, {8,6,5}, {61,0,0}, {54,0,0}, {11,5,1}, {144,0,0}, 642 {47,0,0}, {11,10,7}, {105,0,0}, {2,0,0}, {105,0,0}, {136,0,0}, 643 {11,4,1}, {253,0,0}, {111,0,0}, {13,10,5}, {159,0,0}, {10,7,1}, 644 {7,5,3}, {29,0,0}, {19,10,3}, {119,0,0}, {207,0,0}, {17,15,4}, 645 {35,0,0}, {14,0,0}, {349,0,0}, {6,3,2}, {21,10,6}, {1,0,0}, 646 {75,0,0}, {9,5,2}, {145,0,0}, {11,7,6}, {301,0,0}, {378,0,0}, 647 {13,3,1}, {352,0,0}, {12,7,4}, {12,8,1}, {149,0,0}, {6,5,4}, 648 {12,9,8}, {11,0,0}, {15,7,5}, {78,0,0}, {99,0,0}, {17,16,12}, 649 {173,0,0}, {8,7,1}, {13,9,8}, {147,0,0}, {19,18,10}, {127,0,0}, 650 {183,0,0}, {12,4,1}, {31,0,0}, {11,8,6}, {173,0,0}, {12,0,0}, 651 {7,5,3}, {113,0,0}, {207,0,0}, {18,15,5}, {1,0,0}, {13,7,6}, 652 {21,0,0}, {35,0,0}, {12,7,2}, {117,0,0}, {123,0,0}, {12,10,2}, 653 {143,0,0}, {14,4,1}, {15,9,7}, {204,0,0}, {7,5,1}, {91,0,0}, 654 {4,2,1}, {8,6,3}, {183,0,0}, {12,10,7}, {77,0,0}, {36,0,0}, 655 {14,9,6}, {221,0,0}, {7,6,5}, {16,14,13}, {31,0,0}, {16,15,7}, 656 {365,0,0}, {403,0,0}, {10,3,2}, {11,4,3}, {31,0,0}, {10,9,4}, 657 {177,0,0}, {16,6,1}, {22,6,5}, {417,0,0}, {15,13,12}, {217,0,0}, 658 {207,0,0}, {7,5,4}, {10,7,1}, {11,6,1}, {45,0,0}, {24,0,0}, 659 {12,11,9}, {77,0,0}, {21,20,13}, {9,6,5}, {189,0,0}, {8,3,2}, 660 {13,12,10}, {260,0,0}, {16,9,7}, {168,0,0}, {131,0,0}, {7,6,3}, 661 {305,0,0}, {10,9,6}, {13,9,4}, {143,0,0}, {12,9,3}, {18,0,0}, 662 {15,8,5}, {20,9,6}, {103,0,0}, {15,4,2}, {201,0,0}, {36,0,0}, 663 {9,5,2}, {31,0,0}, {11,7,2}, {6,2,1}, {7,0,0}, {13,6,4}, 664 {9,8,7}, {19,0,0}, {17,10,6}, {15,0,0}, {9,3,1}, {178,0,0}, 665 {8,7,6}, {12,6,5}, {177,0,0}, {230,0,0}, {24,9,3}, {222,0,0}, 666 {3,0,0}, {16,13,12}, {121,0,0}, {10,4,2}, {161,0,0}, {39,0,0}, 667 {17,15,13}, {62,0,0}, {223,0,0}, {15,12,2}, {65,0,0}, {12,6,3}, 668 {101,0,0}, {59,0,0}, {5,4,3}, {17,0,0}, {5,3,2}, {13,8,3}, 669 {10,9,7}, {12,8,2}, {5,4,3}, {75,0,0}, {19,17,8}, {55,0,0}, 670 {99,0,0}, {10,7,4}, {115,0,0}, {9,8,6}, {385,0,0}, {186,0,0}, 671 {15,6,3}, {9,4,1}, {12,10,5}, {10,8,1}, {135,0,0}, {5,2,1}, 672 {317,0,0}, {7,0,0}, {19,6,1}, {294,0,0}, {35,0,0}, {13,12,6}, 673 {119,0,0}, {98,0,0}, {93,0,0}, {68,0,0}, {21,15,3}, {108,0,0}, 674 {75,0,0}, {12,6,5}, {411,0,0}, {12,7,2}, {13,7,2}, {21,0,0}, 675 {15,10,8}, {412,0,0}, {439,0,0}, {10,7,6}, {41,0,0}, {13,9,6}, 676 {8,5,2}, {10,0,0}, {15,7,2}, {141,0,0}, {159,0,0}, {13,12,10}, 677 {291,0,0}, {10,9,1}, {105,0,0}, {24,0,0}, {11,2,1}, {198,0,0}, 678 {27,0,0}, {6,3,1}, {439,0,0}, {10,3,1}, {49,0,0}, {168,0,0}, 679 {13,11,9}, {463,0,0}, {10,9,3}, {13,9,8}, {15,8,3}, {18,16,8}, 680 {15,14,11}, {7,0,0}, {19,9,8}, {12,6,3}, {7,4,3}, {15,14,5}, 681 {8,6,3}, {10,9,7}, {361,0,0}, {230,0,0}, {15,9,6}, {24,0,0}, 682 {407,0,0}, {16,7,2}, {189,0,0}, {62,0,0}, {189,0,0}, {112,0,0}, 683 {22,21,10}, {91,0,0}, {79,0,0}, {12,10,5}, {23,0,0}, {7,6,1}, 684 {57,0,0}, {139,0,0}, {24,15,6}, {14,0,0}, {83,0,0}, {16,9,1}, 685 {35,0,0}, {9,7,4}, {117,0,0}, {65,0,0}, {21,9,6}, {21,0,0}, 686 {195,0,0}, {23,11,10}, {327,0,0}, {17,14,3}, {417,0,0}, {13,0,0}, 687 {15,8,6}, {107,0,0}, {19,10,6}, {18,15,3}, {59,0,0}, {12,10,4}, 688 {9,7,5}, {283,0,0}, {13,9,6}, {62,0,0}, {427,0,0}, {14,7,3}, 689 {8,7,4}, {15,8,3}, {105,0,0}, {27,0,0}, {7,3,1}, {103,0,0}, 690 {551,0,0}, {10,6,1}, {6,4,1}, {11,6,4}, {129,0,0}, {9,0,0}, 691 {9,4,2}, {277,0,0}, {31,0,0}, {13,12,5}, {141,0,0}, {12,7,3}, 692 {357,0,0}, {7,2,1}, {11,9,7}, {227,0,0}, {131,0,0}, {7,6,3}, 693 {23,0,0}, {20,17,3}, {13,4,1}, {90,0,0}, {15,3,2}, {241,0,0}, 694 {75,0,0}, {13,6,1}, {307,0,0}, {8,7,3}, {245,0,0}, {66,0,0}, 695 {15,11,2}, {365,0,0}, {18,16,11}, {11,10,1}, {19,0,0}, {8,6,1}, 696 {189,0,0}, {133,0,0}, {12,7,2}, {114,0,0}, {27,0,0}, {6,5,1}, 697 {15,5,2}, {17,14,5}, {133,0,0}, {476,0,0}, {11,9,3}, {16,0,0}, 698 {375,0,0}, {15,8,6}, {25,0,0}, {17,11,6}, {77,0,0}, {87,0,0}, 699 {5,3,2}, {134,0,0}, {171,0,0}, {13,8,4}, {75,0,0}, {8,3,1}, 700 {233,0,0}, {196,0,0}, {9,8,7}, {173,0,0}, {15,14,12}, {13,6,5}, 701 {281,0,0}, {9,8,2}, {405,0,0}, {114,0,0}, {15,9,6}, {171,0,0}, 702 {287,0,0}, {8,4,2}, {43,0,0}, {4,2,1}, {513,0,0}, {273,0,0}, 703 {11,10,6}, {118,0,0}, {243,0,0}, {14,7,1}, {203,0,0}, {9,5,2}, 704 {257,0,0}, {302,0,0}, {27,25,9}, {393,0,0}, {91,0,0}, {12,10,6}, 705 {413,0,0}, {15,14,9}, {18,16,1}, {255,0,0}, {12,9,7}, {234,0,0}, 706 {167,0,0}, {16,13,10}, {27,0,0}, {15,6,2}, {433,0,0}, {105,0,0}, 707 {25,10,2}, {151,0,0}, {427,0,0}, {13,9,8}, {49,0,0}, {10,6,4}, 708 {153,0,0}, {4,0,0}, {17,7,5}, {54,0,0}, {203,0,0}, {16,15,1}, 709 {16,14,7}, {13,6,1}, {25,0,0}, {14,0,0}, {15,5,3}, {187,0,0}, 710 {15,13,10}, {13,10,5}, {97,0,0}, {11,10,9}, {19,10,4}, {589,0,0}, 711 {31,30,2}, {289,0,0}, {9,6,4}, {11,8,6}, {21,0,0}, {7,4,1}, 712 {7,4,2}, {77,0,0}, {5,3,2}, {119,0,0}, {7,0,0}, {9,5,2}, 713 {345,0,0}, {17,10,8}, {333,0,0}, {17,0,0}, {16,9,7}, {168,0,0}, 714 {15,13,4}, {11,10,1}, {217,0,0}, {18,11,10}, {189,0,0}, {216,0,0}, 715 {12,7,5}, {229,0,0}, {231,0,0}, {12,9,3}, {223,0,0}, {10,9,1}, 716 {153,0,0}, {470,0,0}, {23,16,6}, {99,0,0}, {10,4,3}, {9,8,4}, 717 {12,10,1}, {14,9,6}, {201,0,0}, {38,0,0}, {15,14,2}, {198,0,0}, 718 {399,0,0}, {14,11,5}, {75,0,0}, {11,10,1}, {77,0,0}, {16,12,8}, 719 {20,17,15}, {326,0,0}, {39,0,0}, {14,12,9}, {495,0,0}, {8,3,2}, 720 {333,0,0}, {476,0,0}, {15,14,2}, {164,0,0}, {19,0,0}, {12,4,2}, 721 {8,6,3}, {13,12,3}, {12,11,5}, {129,0,0}, {12,9,3}, {52,0,0}, 722 {10,8,3}, {17,16,2}, {337,0,0}, {12,9,3}, {397,0,0}, {277,0,0}, 723 {21,11,3}, {73,0,0}, {11,6,1}, {7,5,4}, {95,0,0}, {11,3,2}, 724 {617,0,0}, {392,0,0}, {8,3,2}, {75,0,0}, {315,0,0}, {15,6,4}, 725 {125,0,0}, {6,5,2}, {15,9,7}, {348,0,0}, {15,6,1}, {553,0,0}, 726 {6,3,2}, {10,9,7}, {553,0,0}, {14,10,4}, {237,0,0}, {39,0,0}, 727 {17,14,6}, {371,0,0}, {255,0,0}, {8,4,1}, {131,0,0}, {14,6,1}, 728 {117,0,0}, {98,0,0}, {5,3,2}, {56,0,0}, {655,0,0}, {9,5,2}, 729 {239,0,0}, {11,8,4}, {1,0,0}, {134,0,0}, {15,9,5}, {88,0,0}, 730 {10,5,3}, {10,9,4}, {181,0,0}, {15,11,2}, {609,0,0}, {52,0,0}, 731 {19,18,10}, {100,0,0}, {7,6,3}, {15,8,2}, {183,0,0}, {18,7,6}, 732 {10,9,2}, {130,0,0}, {11,5,1}, {12,0,0}, {219,0,0}, {13,10,7}, 733 {11,0,0}, {19,9,4}, {129,0,0}, {3,0,0}, {17,15,5}, {300,0,0}, 734 {17,13,9}, {14,6,5}, {97,0,0}, {13,8,3}, {601,0,0}, {55,0,0}, 735 {8,3,1}, {92,0,0}, {127,0,0}, {12,11,2}, {81,0,0}, {15,10,8}, 736 {13,2,1}, {47,0,0}, {14,13,6}, {194,0,0}, {383,0,0}, {25,14,11}, 737 {125,0,0}, {20,19,16}, {429,0,0}, {282,0,0}, {10,9,6}, {342,0,0}, 738 {5,3,2}, {15,9,4}, {33,0,0}, {9,4,2}, {49,0,0}, {15,0,0}, 739 {11,6,2}, {28,0,0}, {103,0,0}, {18,17,8}, {27,0,0}, {11,6,5}, 740 {33,0,0}, {17,0,0}, {11,10,6}, {387,0,0}, {363,0,0}, {15,10,9}, 741 {83,0,0}, {7,6,4}, {357,0,0}, {13,12,4}, {14,13,7}, {322,0,0}, 742 {395,0,0}, {16,5,1}, {595,0,0}, {13,10,3}, {421,0,0}, {195,0,0}, 743 {11,3,2}, {13,0,0}, {16,12,3}, {14,3,1}, {315,0,0}, {26,10,5}, 744 {297,0,0}, {52,0,0}, {9,4,2}, {314,0,0}, {243,0,0}, {16,14,9}, 745 {185,0,0}, {12,5,3}, {13,5,2}, {575,0,0}, {12,9,3}, {39,0,0}, 746 {311,0,0}, {13,5,2}, {181,0,0}, {20,18,14}, {49,0,0}, {25,0,0}, 747 {11,4,1}, {77,0,0}, {17,11,10}, {15,14,8}, {21,0,0}, {17,10,5}, 748 {69,0,0}, {49,0,0}, {11,10,2}, {32,0,0}, {411,0,0}, {21,16,3}, 749 {11,7,4}, {22,10,3}, {85,0,0}, {140,0,0}, {9,8,6}, {252,0,0}, 750 {279,0,0}, {9,5,2}, {307,0,0}, {17,10,4}, {13,12,9}, {94,0,0}, 751 {13,11,4}, {49,0,0}, {17,11,10}, {16,12,5}, {25,0,0}, {6,5,2}, 752 {12,5,1}, {80,0,0}, {8,3,2}, {246,0,0}, {11,5,2}, {11,10,2}, 753 {599,0,0}, {18,12,10}, {189,0,0}, {278,0,0}, {10,9,3}, {399,0,0}, 754 {299,0,0}, {13,10,6}, {277,0,0}, {13,10,6}, {69,0,0}, {220,0,0}, 755 {13,10,3}, {229,0,0}, {18,11,10}, {16,15,1}, {27,0,0}, {18,9,3}, 756 {473,0,0}, {373,0,0}, {18,17,7}, {60,0,0}, {207,0,0}, {13,9,8}, 757 {22,20,13}, {25,18,7}, {225,0,0}, {404,0,0}, {21,6,2}, {46,0,0}, 758 {6,2,1}, {17,12,6}, {75,0,0}, {4,2,1}, {365,0,0}, {445,0,0}, 759 {11,7,1}, {44,0,0}, {10,8,5}, {12,5,2}, {63,0,0}, {17,4,2}, 760 {189,0,0}, {557,0,0}, {19,12,2}, {252,0,0}, {99,0,0}, {10,8,5}, 761 {65,0,0}, {14,9,3}, {9,0,0}, {119,0,0}, {8,5,2}, {339,0,0}, 762 {95,0,0}, {12,9,7}, {7,0,0}, {13,10,2}, {77,0,0}, {127,0,0}, 763 {21,10,7}, {319,0,0}, {667,0,0}, {17,10,3}, {501,0,0}, {18,12,9}, 764 {9,8,5}, {17,0,0}, {20,9,2}, {341,0,0}, {731,0,0}, {7,6,5}, 765 {647,0,0}, {10,4,2}, {121,0,0}, {20,0,0}, {21,19,13}, {574,0,0}, 766 {399,0,0}, {15,10,7}, {85,0,0}, {16,8,3}, {169,0,0}, {15,0,0}, 767 {12,7,5}, {568,0,0}, {10,7,1}, {18,2,1}, {3,0,0}, {14,3,2}, 768 {13,7,3}, {643,0,0}, {14,11,1}, {548,0,0}, {783,0,0}, {14,11,1}, 769 {317,0,0}, {7,6,4}, {153,0,0}, {87,0,0}, {15,13,1}, {231,0,0}, 770 {11,5,3}, {18,13,7}, {771,0,0}, {30,20,11}, {15,6,3}, {103,0,0}, 771 {13,4,3}, {182,0,0}, {211,0,0}, {17,6,1}, {27,0,0}, {13,12,10}, 772 {15,14,10}, {17,0,0}, {13,11,5}, {69,0,0}, {11,5,1}, {18,6,1}, 773 {603,0,0}, {10,4,2}, {741,0,0}, {668,0,0}, {17,15,3}, {147,0,0}, 774 {227,0,0}, {15,10,9}, {37,0,0}, {16,6,1}, {173,0,0}, {427,0,0}, 775 {7,5,1}, {287,0,0}, {231,0,0}, {20,15,10}, {18,9,1}, {14,12,5}, 776 {16,5,1}, {310,0,0}, {18,13,1}, {434,0,0}, {579,0,0}, {18,13,8}, 777 {45,0,0}, {12,8,3}, {16,9,5}, {53,0,0}, {19,15,10}, {16,0,0}, 778 {17,6,5}, {17,10,1}, {37,0,0}, {17,10,9}, {21,13,7}, {99,0,0}, 779 {17,9,6}, {176,0,0}, {271,0,0}, {18,17,13}, {459,0,0}, {21,17,10}, 780 {6,5,2}, {202,0,0}, {5,4,3}, {90,0,0}, {755,0,0}, {15,7,2}, 781 {363,0,0}, {8,4,2}, {129,0,0}, {20,0,0}, {11,6,2}, {135,0,0}, 782 {15,8,7}, {14,13,2}, {10,4,3}, {24,13,10}, {19,14,11}, {31,0,0}, 783 {15,8,6}, {758,0,0}, {16,11,5}, {16,5,1}, {359,0,0}, {23,18,17}, 784 {501,0,0}, {29,0,0}, {15,6,3}, {201,0,0}, {459,0,0}, {12,10,7}, 785 {225,0,0}, {22,17,13}, {24,22,5}, {161,0,0}, {14,11,3}, {52,0,0}, 786 {19,17,6}, {21,14,12}, {93,0,0}, {13,10,3}, {201,0,0}, {178,0,0}, 787 {15,12,5}, {250,0,0}, {7,6,4}, {17,13,6}, {221,0,0}, {13,11,8}, 788 {17,14,9}, {113,0,0}, {17,14,10}, {300,0,0}, {39,0,0}, {18,13,3}, 789 {261,0,0}, {15,14,8}, {753,0,0}, {8,4,3}, {11,10,5}, {94,0,0}, 790 {15,13,1}, {10,4,2}, {14,11,10}, {8,6,2}, {461,0,0}, {418,0,0}, 791 {19,14,6}, {403,0,0}, {267,0,0}, {10,9,2}, {259,0,0}, {20,4,3}, 792 {869,0,0}, {173,0,0}, {19,18,2}, {369,0,0}, {255,0,0}, {22,12,9}, 793 {567,0,0}, {20,11,7}, {457,0,0}, {482,0,0}, {6,3,2}, {775,0,0}, 794 {19,17,6}, {6,4,3}, {99,0,0}, {15,14,8}, {6,5,2}, {165,0,0}, 795 {8,3,2}, {13,12,10}, {25,21,17}, {17,14,9}, {105,0,0}, {17,15,14}, 796 {10,3,2}, {250,0,0}, {25,6,5}, {327,0,0}, {279,0,0}, {13,6,5}, 797 {371,0,0}, {15,9,4}, {117,0,0}, {486,0,0}, {10,9,3}, {217,0,0}, 798 {635,0,0}, {30,27,17}, {457,0,0}, {16,6,2}, {57,0,0}, {439,0,0}, 799 {23,21,6}, {214,0,0}, {20,13,6}, {20,16,1}, {819,0,0}, {15,11,8}, 800 {593,0,0}, {190,0,0}, {17,14,3}, {114,0,0}, {21,18,3}, {10,5,2}, 801 {12,9,5}, {8,6,3}, {69,0,0}, {312,0,0}, {22,5,2}, {502,0,0}, 802 {843,0,0}, {15,10,3}, {747,0,0}, {6,5,2}, {101,0,0}, {123,0,0}, 803 {19,16,9}, {521,0,0}, {171,0,0}, {16,7,2}, {12,6,5}, {22,21,20}, 804 {545,0,0}, {163,0,0}, {23,18,1}, {479,0,0}, {495,0,0}, {13,6,5}, 805 {11,0,0}, {17,5,2}, {18,8,1}, {684,0,0}, {7,5,1}, {9,0,0}, 806 {18,11,3}, {22,20,13}, {273,0,0}, {4,3,2}, {381,0,0}, {51,0,0}, 807 {18,13,7}, {518,0,0}, {9,5,1}, {14,12,3}, {243,0,0}, {21,17,2}, 808 {53,0,0}, {836,0,0}, {21,10,2}, {66,0,0}, {12,10,7}, {13,9,8}, 809 {339,0,0}, {16,11,5}, {901,0,0}, {180,0,0}, {16,13,3}, {49,0,0}, 810 {6,3,2}, {15,4,1}, {16,13,6}, {18,15,12}, {885,0,0}, {39,0,0}, 811 {11,9,4}, {688,0,0}, {16,15,7}, {13,10,6}, {13,0,0}, {25,23,12}, 812 {149,0,0}, {260,0,0}, {11,9,1}, {53,0,0}, {11,0,0}, {12,4,2}, 813 {9,7,5}, {11,8,1}, {121,0,0}, {261,0,0}, {10,5,2}, {199,0,0}, 814 {20,4,3}, {17,9,2}, {13,9,4}, {12,8,7}, {253,0,0}, {174,0,0}, 815 {15,4,2}, {370,0,0}, {9,6,1}, {16,10,9}, {669,0,0}, {20,10,9}, 816 {833,0,0}, {353,0,0}, {17,13,2}, {29,0,0}, {371,0,0}, {9,8,5}, 817 {8,7,1}, {19,8,7}, {12,11,10}, {873,0,0}, {26,11,2}, {12,9,1}, 818 {10,7,2}, {13,6,1}, {235,0,0}, {26,24,19}, {733,0,0}, {778,0,0}, 819 {12,11,1}, {344,0,0}, {931,0,0}, {16,6,4}, {945,0,0}, {21,19,14}, 820 {18,13,11}, {67,0,0}, {20,15,10}, {462,0,0}, {14,5,1}, {10,9,6}, 821 {18,11,10}, {16,9,7}, {477,0,0}, {105,0,0}, {11,3,2}, {468,0,0}, 822 {23,16,15}, {16,15,6}, {327,0,0}, {23,10,4}, {357,0,0}, {25,0,0}, 823 {17,16,7}, {31,0,0}, {7,5,2}, {16,7,6}, {277,0,0}, {14,13,6}, 824 {413,0,0}, {103,0,0}, {15,10,1}, {231,0,0}, {747,0,0}, {5,2,1}, 825 {113,0,0}, {20,10,7}, {15,9,6}, {11,0,0}, {27,22,18}, {91,0,0}, 826 {51,0,0}, {18,13,12}, {603,0,0}, {10,7,3}, {9,0,0}, {121,0,0}, 827 {15,14,6}, {17,0,0}, {16,11,2}, {23,15,6}, {279,0,0}, {16,12,6}, 828 {89,0,0}, {371,0,0}, {17,15,2}, {771,0,0}, {99,0,0}, {7,6,3}, 829 {21,0,0}, {10,7,5}, {801,0,0}, {26,0,0}, {25,19,14}, {175,0,0}, 830 {10,7,2}, {20,5,4}, {12,11,1}, {22,5,1}, {165,0,0}, {841,0,0}, 831 {25,19,17}, {238,0,0}, {11,8,6}, {22,21,4}, {33,0,0}, {8,7,6}, 832 {14,9,2}, {113,0,0}, {13,11,5}, {311,0,0}, {891,0,0}, {20,16,14}, 833 {555,0,0}, {23,14,8}, {133,0,0}, {546,0,0}, {6,3,2}, {103,0,0}, 834 {15,0,0}, {10,7,3}, {307,0,0}, {14,10,1}, {15,12,2}, {367,0,0}, 835 {13,10,6}, {169,0,0}, {22,21,11}, {12,10,8}, {441,0,0}, {17,12,7}, 836 {917,0,0}, {205,0,0}, {26,23,13}, {54,0,0}, {459,0,0}, {17,15,4}, 837 {19,15,4}, {5,4,2}, {9,7,6}, {42,0,0}, {21,15,7}, {330,0,0}, 838 {20,7,3}, {20,7,2}, {81,0,0}, {19,14,1}, {349,0,0}, {165,0,0}, 839 {40,35,9}, {274,0,0}, {475,0,0}, {11,10,3}, {93,0,0}, {12,7,4}, 840 {13,12,2}, {386,0,0}, {7,6,2}, {881,0,0}, {143,0,0}, {9,8,4}, 841 {71,0,0}, {19,18,3}, {16,11,6}, {155,0,0}, {7,2,1}, {735,0,0}, 842 {16,8,7}, {9,7,4}, {45,0,0}, {7,6,4}, {12,11,3}, {3,0,0}, 843 843 {19,14,13} 844 844 }; … … 870 870 871 871 for (k3 = 3; k3 < n; k3++) 872 for (k2 = 2; k2 < k3; k2++) 872 for (k2 = 2; k2 < k3; k2++) 873 873 for (k1 = 1; k1 < k2; k1++) 874 874 if (IterIrredTest(1+GF2X(k1,1)+GF2X(k2,1)+GF2X(k3,1)+GF2X(n,1))) { … … 885 885 if (n <= 0) Error("SparseIrred: n <= 0"); 886 886 887 if (NTL_OVERFLOW(n, 1, 0)) 887 if (NTL_OVERFLOW(n, 1, 0)) 888 888 Error("overflow in BuildSparseIrred"); 889 889 -
ntl/src/GF2XTest.c
r1d43d18 r287cc8 7 7 int amt; 8 8 9 wd(int x) { amt = x; } 9 wd(int x) { amt = x; } 10 10 }; 11 11 … … 44 44 } 45 45 46 cout << WD(12,n); 46 cout << WD(12,n); 47 47 48 48 iter = 0; -
ntl/src/GF2XTimeTest.c
r1d43d18 r287cc8 31 31 } 32 32 33 z = z/n; 33 z = z/n; 34 34 35 35 return z; … … 79 79 } 80 80 } 81 81 82 82 83 83 n = 16; … … 140 140 return 0; 141 141 } 142 143 142 143 -
ntl/src/GF2XVec.c
r1d43d18 r287cc8 52 52 53 53 free(v); 54 v = 0; 54 v = 0; 55 55 } 56 56 57 57 58 GF2XVec& GF2XVec::operator=(const GF2XVec& a) 58 GF2XVec& GF2XVec::operator=(const GF2XVec& a) 59 59 { 60 60 if (this == &a) … … 70 70 return *this; 71 71 } 72 72 73 73 GF2XVec::GF2XVec(const GF2XVec& a) 74 74 { -
ntl/src/G_LLL_FP.c
r1d43d18 r287cc8 17 17 18 18 19 19 20 static void RowTransform(vec_ZZ& A, vec_ZZ& B, const ZZ& MU1) 20 21 // x = x - y*MU … … 44 45 if (MU == 0) return; 45 46 46 if (NumTwos(MU) >= NTL_ZZ_NBITS) 47 if (NumTwos(MU) >= NTL_ZZ_NBITS) 47 48 k = MakeOdd(MU); 48 49 else … … 54 55 conv(mu1, MU); 55 56 56 for (i = 1; i <= n; i++) { 57 mul(T, B(i), mu1); 58 if (k > 0) LeftShift(T, T, k); 59 sub(A(i), A(i), T); 57 if (k > 0) { 58 59 for (i = 1; i <= n; i++) { 60 mul(T, B(i), mu1); 61 LeftShift(T, T, k); 62 sub(A(i), A(i), T); 63 } 64 65 } 66 else { 67 68 for (i = 1; i <= n; i++) { 69 MulSubFrom(A(i), B(i), mu1); 70 } 71 60 72 } 61 73 } … … 70 82 71 83 84 72 85 #define TR_BND (NTL_FDOUBLE_PRECISION/2.0) 73 86 // Just to be safe!! … … 120 133 121 134 122 static void RowTransform(vec_ZZ& A, vec_ZZ& B, const ZZ& MU1, 135 static void RowTransform(vec_ZZ& A, vec_ZZ& B, const ZZ& MU1, 123 136 double *a, double *b, long *in_a, 124 137 double& max_a, double max_b, long& in_float) … … 186 199 in_a[i] = 0; 187 200 } 188 201 189 202 sub(A(i), A(i), B(i)); 190 203 } … … 205 218 in_a[i] = 0; 206 219 } 207 220 208 221 add(A(i), A(i), B(i)); 209 222 } … … 215 228 216 229 double b_bnd = fabs(TR_BND/mu) - 1; 217 if (b_bnd < 0) b_bnd = 0; 218 219 if (NumTwos(MU) >= NTL_ZZ_NBITS) 230 if (b_bnd < 0) b_bnd = 0; 231 232 if (NumTwos(MU) >= NTL_ZZ_NBITS) 220 233 k = MakeOdd(MU); 221 234 else … … 243 256 if (in_a[i] && a[i] < TR_BND && a[i] > -TR_BND && 244 257 b[i] < b_bnd && b[i] > -b_bnd) { 245 258 246 259 a[i] -= b[i]*mu; 247 260 } … … 251 264 in_a[i] = 0; 252 265 } 253 mul(T, B(i), mu1); 254 sub(A(i), A(i), T); 266 MulSubFrom(A(i), B(i), mu1); 255 267 } 256 268 } … … 298 310 if (MU == 0) return; 299 311 300 if (NumTwos(MU) >= NTL_ZZ_NBITS) 312 if (NumTwos(MU) >= NTL_ZZ_NBITS) 301 313 k = MakeOdd(MU); 302 314 else … … 348 360 { 349 361 sz = min(m, n)/10; 350 if (sz < 2) 362 if (sz < 2) 351 363 sz = 2; 352 364 else if (sz > 20) … … 356 368 357 369 long i; 358 buf = NTL_NEW_OP doubleptr[sz]; 370 buf = NTL_NEW_OP doubleptr[sz]; 359 371 if (!buf) Error("out of memory"); 360 372 for (i = 0; i < sz; i++) … … 443 455 } 444 456 445 i = 0; 457 i = 0; 446 458 while (i < sz && bl[i] != 0) 447 459 i++; … … 488 500 backoff = 2; 489 501 else if (backoff > cache.sz + 2) 490 backoff = cache.sz + 2; 502 backoff = cache.sz + 2; 491 503 492 504 long ub = k-(backoff-1); … … 495 507 double *cptr = mu[i]; 496 508 double *sptr = aux[i]; 497 509 498 510 for (j = n; j > i; j--) { 499 511 c = cptr[j]; 500 512 s = sptr[j]; 501 513 502 514 a = c*pp[j-1] - s*pp[j]; 503 515 b = s*pp[j-1] + c*pp[j]; 504 516 505 517 pp[j-1] = a; 506 518 pp[j] = b; 507 519 } 508 509 pp[i] = pp[i]/mu[i][i]; 520 521 pp[i] = pp[i]/mu[i][i]; 510 522 } 511 523 … … 520 532 double *cptr = mu[i]; 521 533 double *sptr = aux[i]; 522 534 523 535 for (j = n; j > i; j--) { 524 536 c = cptr[j]; 525 537 s = sptr[j]; 526 538 527 539 a = c*p[j-1] - s*p[j]; 528 540 b = s*p[j-1] + c*p[j]; 529 541 530 542 p[j-1] = a; 531 543 p[j] = b; 532 544 } 533 545 534 546 p[i] = p[i]/mu[i][i]; 535 547 } … … 553 565 s = c*t; 554 566 } 555 567 556 568 p[j-1] = c*a - s*b; 557 569 p[j] = c; … … 594 606 log_red--; 595 607 596 608 597 609 //cerr << "G_LLL_FP: warning--relaxing reduction (" << log_red << ")\n"; 598 610 … … 618 630 619 631 static 620 long ll_G_LLL_FP(mat_ZZ& B, mat_ZZ* U, double delta, long deep, 621 LLLCheckFct check, double **B1, double **mu, 632 long ll_G_LLL_FP(mat_ZZ& B, mat_ZZ* U, double delta, long deep, 633 LLLCheckFct check, double **B1, double **mu, 622 634 double **aux, 623 635 long m, long init_k, long &quit, GivensCache_FP& cache) … … 701 713 } 702 714 else { 703 Error( 715 Error("G_LLL_FP: warning--infinite loop?\n"); 704 716 } 705 717 } 706 718 707 719 Fc1 = 0; 708 720 709 721 for (j = k-1; j >= 1; j--) { 710 722 t1 = fabs(mu[k][j]); 711 if (t1 > half_plus_fudge) { 723 if (t1 > half_plus_fudge) { 712 724 713 725 714 726 if (!Fc1) { 715 if (j > trigger_index || 727 if (j > trigger_index || 716 728 (j == trigger_index && small_trigger)) { 717 729 … … 731 743 RowTransformStart(B1[k], in_vec, in_float, n); 732 744 } 733 745 734 746 735 747 mu1 = mu[k][j]; … … 738 750 else 739 751 mu1 = floor(mu1+0.5); 740 752 741 753 double *mu_k = mu[k]; 742 754 double *mu_j = mu[j]; 743 755 744 756 if (mu1 == 1) { 745 757 for (i = 1; i <= j-1; i++) … … 754 766 mu_k[i] -= mu1*mu_j[i]; 755 767 } 756 768 757 769 mu_k[j] -= mu1; 758 770 759 771 conv(MU, mu1); 760 772 … … 774 786 } while (Fc1); 775 787 776 if (check && (*check)(B(k))) 788 if (check && (*check)(B(k))) 777 789 quit = 1; 778 790 … … 803 815 // test G_LLL reduction condition 804 816 805 if (k > 1 && 806 sqrt(delta - mu[k][k-1]*mu[k][k-1])*fabs(mu[k-1][k-1]) > 817 if (k > 1 && 818 sqrt(delta - mu[k][k-1]*mu[k][k-1])*fabs(mu[k-1][k-1]) > 807 819 fabs(mu[k][k])) { 808 820 // swap rows k, k-1 … … 840 852 841 853 static 842 long G_LLL_FP(mat_ZZ& B, mat_ZZ* U, double delta, long deep, 854 long G_LLL_FP(mat_ZZ& B, mat_ZZ* U, double delta, long deep, 843 855 LLLCheckFct check) 844 856 { … … 892 904 } 893 905 894 906 895 907 GivensCache_FP cache(m, n); 896 908 … … 932 944 } 933 945 934 935 936 long G_LLL_FP(mat_ZZ& B, double delta, long deep, LLLCheckFct check, 946 947 948 long G_LLL_FP(mat_ZZ& B, double delta, long deep, LLLCheckFct check, 937 949 long verb) 938 950 { … … 945 957 } 946 958 947 long G_LLL_FP(mat_ZZ& B, mat_ZZ& U, double delta, long deep, 959 long G_LLL_FP(mat_ZZ& B, mat_ZZ& U, double delta, long deep, 948 960 LLLCheckFct check, long verb) 949 961 { … … 987 999 for (j = 1; j <= k; j++) 988 1000 x = x + Log(j); 989 1001 990 1002 x = x * (1/double(k)); 991 1003 … … 1015 1027 static vec_double G_BKZThresh; 1016 1028 1017 static 1029 static 1018 1030 void ComputeG_BKZThresh(double *c, long beta) 1019 1031 { … … 1033 1045 1034 1046 static 1035 long G_BKZ_FP(mat_ZZ& BB, mat_ZZ* UU, double delta, 1047 long G_BKZ_FP(mat_ZZ& BB, mat_ZZ* UU, double delta, 1036 1048 long beta, long prune, LLLCheckFct check) 1037 1049 { 1038 1050 1039 1051 1040 1052 1041 1053 long m = BB.NumRows(); 1042 1054 long n = BB.NumCols(); 1043 1055 long m_orig = m; 1044 1056 1045 1057 long i, j; 1046 1058 ZZ MU; … … 1151 1163 } 1152 1164 1153 1165 1154 1166 GivensCache_FP cache(m, n); 1155 1167 … … 1182 1194 if (beta > m) beta = m; 1183 1195 1184 if (prune > 0) 1196 if (prune > 0) 1185 1197 ComputeG_BKZConstant(beta, prune); 1186 1198 1187 1199 z = 0; 1188 1200 jj = 0; 1189 1201 1190 1202 while (z < m-1) { 1191 1203 jj++; 1192 1204 kk = min(jj+beta-1, m); 1193 1205 1194 1206 if (jj == m) { 1195 1207 jj = 1; … … 1209 1221 if (prune > 0) 1210 1222 ComputeG_BKZThresh(&c[jj], kk-jj+1); 1211 1223 1212 1224 cbar = c[jj]; 1213 1225 utildavec[jj] = uvec[jj] = 1; 1214 1226 1215 1227 yvec[jj] = vvec[jj] = 0; 1216 1228 Deltavec[jj] = 0; 1217 1218 1229 1230 1219 1231 s = t = jj; 1220 1232 deltavec[jj] = 1; 1221 1233 1222 1234 for (i = jj+1; i <= kk+1; i++) { 1223 1235 ctilda[i] = uvec[i] = utildavec[i] = yvec[i] = 0; … … 1228 1240 1229 1241 long enum_cnt = 0; 1230 1242 1231 1243 while (t <= kk) { 1232 1233 ctilda[t] = ctilda[t+1] + 1244 ctilda[t] = ctilda[t+1] + 1234 1245 (yvec[t]+utildavec[t])*(yvec[t]+utildavec[t])*c[t]; 1235 1246 1236 1247 ForceToMem(&ctilda[t]); // prevents an infinite loop 1237 1248 1238 1249 if (prune > 0 && t > jj) { 1239 1250 eta = G_BKZThresh(t-jj); … … 1241 1252 else 1242 1253 eta = 0; 1243 1254 1244 1255 if (ctilda[t] < cbar - eta) { 1245 1256 if (t > jj) { … … 1256 1267 utildavec[t] = vvec[t] = t1; 1257 1268 Deltavec[t] = 0; 1258 if (utildavec[t] > -yvec[t]) 1269 if (utildavec[t] > -yvec[t]) 1259 1270 deltavec[t] = -1; 1260 1271 else … … 1278 1289 1279 1290 NumIterations++; 1280 1291 1281 1292 h = min(kk+1, m); 1282 1293 1283 1294 if ((delta - 8*red_fudge)*c[jj] > cbar) { 1284 1295 … … 1287 1298 // we treat the case that the new vector is b_s (jj < s <= kk) 1288 1299 // as a special case that appears to occur most of the time. 1289 1300 1290 1301 s = 0; 1291 1302 for (i = jj+1; i <= kk; i++) { … … 1297 1308 } 1298 1309 } 1299 1310 1300 1311 if (s == 0) Error("G_BKZ_FP: internal error"); 1301 1312 1302 1313 if (s > 0) { 1303 1314 // special case 1304 1315 1305 1316 NumTrivial++; 1306 1317 1307 1318 for (i = s; i > jj; i--) { 1308 1319 // swap i, i-1 … … 1311 1322 tp = B1[i-1]; B1[i-1] = B1[i]; B1[i] = tp; 1312 1323 } 1313 1324 1314 1325 // cerr << "special case\n"; 1315 new_m = ll_G_LLL_FP(B, U, delta, 0, check, 1326 new_m = ll_G_LLL_FP(B, U, delta, 0, check, 1316 1327 B1, mu, aux, h, jj, quit, cache); 1317 1328 if (new_m != h) Error("G_BKZ_FP: internal error"); … … 1322 1333 1323 1334 NumNonTrivial++; 1324 1335 1325 1336 for (i = 1; i <= n; i++) conv(B(m+1, i), 0); 1326 1337 … … 1336 1347 if (U) RowTransform2((*U)(m+1), (*U)(i), MU); 1337 1348 } 1338 1349 1339 1350 for (i = m+1; i >= jj+1; i--) { 1340 1351 // swap i, i-1 … … 1343 1354 tp = B1[i-1]; B1[i-1] = B1[i]; B1[i] = tp; 1344 1355 } 1345 1356 1346 1357 for (i = 1; i <= n; i++) { 1347 1358 conv(B1[jj][i], B(jj, i)); … … 1350 1361 1351 1362 if (IsZero(B(jj))) Error("G_BKZ_FP: internal error"); 1352 1363 1353 1364 // remove linear dependencies 1354 1365 1355 1366 // cerr << "general case\n"; 1356 new_m = ll_G_LLL_FP(B, U, delta, 0, 0, B1, mu, aux, 1367 new_m = ll_G_LLL_FP(B, U, delta, 0, 0, B1, mu, aux, 1357 1368 kk+1, jj, quit, cache); 1358 1359 if (new_m != kk) Error("G_BKZ_FP: internal error"); 1369 1370 if (new_m != kk) Error("G_BKZ_FP: internal error"); 1360 1371 1361 1372 // remove zero vector 1362 1373 1363 1374 for (i = kk+2; i <= m+1; i++) { 1364 1375 // swap i, i-1 … … 1367 1378 tp = B1[i-1]; B1[i-1] = B1[i]; B1[i] = tp; 1368 1379 } 1369 1380 1370 1381 quit = 0; 1371 1382 if (check) { … … 1378 1389 1379 1390 if (quit) break; 1380 1391 1381 1392 if (h > kk) { 1382 1393 // extend reduced basis 1383 1384 new_m = ll_G_LLL_FP(B, U, delta, 0, check, 1394 1395 new_m = ll_G_LLL_FP(B, U, delta, 0, check, 1385 1396 B1, mu, aux, h, h, quit, cache); 1386 1397 1387 1398 if (new_m != h) Error("G_BKZ_FP: internal error"); 1388 1399 if (quit) break; 1389 1400 } 1390 1401 } 1391 1402 1392 1403 z = 0; 1393 1404 } … … 1399 1410 1400 1411 if (!clean) { 1401 new_m = ll_G_LLL_FP(B, U, delta, 0, check, B1, mu, aux, 1412 new_m = ll_G_LLL_FP(B, U, delta, 0, check, B1, mu, aux, 1402 1413 h, h, quit, cache); 1403 1414 if (new_m != h) Error("G_BKZ_FP: internal error"); 1404 1415 if (quit) break; 1405 1416 } 1406 1417 1407 1418 z++; 1408 1419 } … … 1466 1477 } 1467 1478 1468 long G_BKZ_FP(mat_ZZ& BB, mat_ZZ& UU, double delta, 1479 long G_BKZ_FP(mat_ZZ& BB, mat_ZZ& UU, double delta, 1469 1480 long beta, long prune, LLLCheckFct check, long verb) 1470 1481 { … … 1478 1489 } 1479 1490 1480 long G_BKZ_FP(mat_ZZ& BB, double delta, 1491 long G_BKZ_FP(mat_ZZ& BB, double delta, 1481 1492 long beta, long prune, LLLCheckFct check, long verb) 1482 1493 { -
ntl/src/G_LLL_QP.c
r1d43d18 r287cc8 24 24 25 25 26 27 26 static void RowTransform(vec_ZZ& A, vec_ZZ& B, const ZZ& MU1) 28 27 // x = x - y*MU … … 52 51 if (MU == 0) return; 53 52 54 if (NumTwos(MU) >= NTL_ZZ_NBITS) 53 if (NumTwos(MU) >= NTL_ZZ_NBITS) 55 54 k = MakeOdd(MU); 56 55 else … … 62 61 conv(mu1, MU); 63 62 64 for (i = 1; i <= n; i++) { 65 mul(T, B(i), mu1); 66 if (k > 0) LeftShift(T, T, k); 67 sub(A(i), A(i), T); 63 if (k > 0) { 64 65 for (i = 1; i <= n; i++) { 66 mul(T, B(i), mu1); 67 LeftShift(T, T, k); 68 sub(A(i), A(i), T); 69 } 70 71 } 72 else { 73 74 for (i = 1; i <= n; i++) { 75 MulSubFrom(A(i), B(i), mu1); 76 } 77 68 78 } 69 79 } … … 77 87 } 78 88 89 90 91 79 92 #define TR_BND (NTL_FDOUBLE_PRECISION/2.0) 80 93 // Just to be safe!! … … 128 141 129 142 130 131 132 133 134 static void RowTransform(vec_ZZ& A, vec_ZZ& B, const ZZ& MU1, 135 quad_float *a, quad_float *b, long *in_a, 143 144 145 146 147 static void RowTransform(vec_ZZ& A, vec_ZZ& B, const ZZ& MU1, 148 quad_float *a, quad_float *b, long *in_a, 136 149 double& max_a, double max_b, long& in_float) 137 150 // x = x - y*MU … … 232 245 233 246 234 if (NumTwos(MU) >= NTL_ZZ_NBITS) 247 if (NumTwos(MU) >= NTL_ZZ_NBITS) 235 248 k = MakeOdd(MU); 236 249 else … … 258 271 if (in_a[i] && a[i].hi < TR_BND && a[i].hi > -TR_BND && 259 272 b[i].hi < b_bnd && b[i].hi > -b_bnd) { 260 273 261 274 a[i].hi -= b[i].hi*mu; 262 275 } … … 266 279 in_a[i] = 0; 267 280 } 268 mul(T, B(i), mu1); 269 sub(A(i), A(i), T); 281 MulSubFrom(A(i), B(i), mu1); 270 282 } 271 283 } … … 312 324 if (MU == 0) return; 313 325 314 if (NumTwos(MU) >= NTL_ZZ_NBITS) 326 if (NumTwos(MU) >= NTL_ZZ_NBITS) 315 327 k = MakeOdd(MU); 316 328 else … … 359 371 { 360 372 sz = min(m, n)/10; 361 if (sz < 2) 373 if (sz < 2) 362 374 sz = 2; 363 375 else if (sz > 20) … … 367 379 368 380 long i; 369 buf = NTL_NEW_OP quad_floatptr[sz]; 381 buf = NTL_NEW_OP quad_floatptr[sz]; 370 382 if (!buf) Error("out of memory"); 371 383 for (i = 0; i < sz; i++) … … 454 466 } 455 467 456 i = 0; 468 i = 0; 457 469 while (i < sz && bl[i] != 0) 458 470 i++; … … 499 511 backoff = 2; 500 512 else if (backoff > cache.sz + 2) 501 backoff = cache.sz + 2; 513 backoff = cache.sz + 2; 502 514 503 515 long ub = k-(backoff-1); … … 506 518 quad_float *cptr = mu[i]; 507 519 quad_float *sptr = aux[i]; 508 520 509 521 for (j = n; j > i; j--) { 510 522 c = cptr[j]; 511 523 s = sptr[j]; 512 524 513 525 a = c*pp[j-1] - s*pp[j]; 514 526 b = s*pp[j-1] + c*pp[j]; 515 527 516 528 pp[j-1] = a; 517 529 pp[j] = b; 518 530 } 519 520 pp[i] = pp[i]/mu[i][i]; 531 532 pp[i] = pp[i]/mu[i][i]; 521 533 } 522 534 … … 531 543 quad_float *cptr = mu[i]; 532 544 quad_float *sptr = aux[i]; 533 545 534 546 for (j = n; j > i; j--) { 535 547 c = cptr[j]; 536 548 s = sptr[j]; 537 549 538 550 a = c*p[j-1] - s*p[j]; 539 551 b = s*p[j-1] + c*p[j]; 540 552 541 553 p[j-1] = a; 542 554 p[j] = b; 543 555 } 544 556 545 557 p[i] = p[i]/mu[i][i]; 546 558 } … … 564 576 s = c*t; 565 577 } 566 578 567 579 p[j-1] = c*a - s*b; 568 580 p[j] = c; … … 595 607 // to help ensure stability in G_BKZ_QP1 596 608 597 log_red = NTL_DOUBLE_PRECISION-2; 609 log_red = NTL_DOUBLE_PRECISION-2; 598 610 599 611 red_fudge = 1; … … 617 629 618 630 static 619 long ll_G_LLL_QP(mat_ZZ& B, mat_ZZ* U, quad_float delta, long deep, 620 LLLCheckFct check, quad_float **B1, quad_float **mu, 631 long ll_G_LLL_QP(mat_ZZ& B, mat_ZZ* U, quad_float delta, long deep, 632 LLLCheckFct check, quad_float **B1, quad_float **mu, 621 633 quad_float **aux, 622 634 long m, long init_k, long &quit, GivensCache_QP& cache) … … 689 701 690 702 Fc1 = 0; 691 703 692 704 for (j = k-1; j >= 1; j--) { 693 705 t1 = fabs(mu[k][j]); … … 715 727 716 728 717 729 718 730 mu1 = mu[k][j]; 719 731 if (mu1 >= 0) … … 721 733 else 722 734 mu1 = floor(mu1+half); 723 724 735 736 725 737 quad_float *mu_k = mu[k]; 726 738 quad_float *mu_j = mu[j]; 727 739 728 740 if (mu1 == 1) { 729 741 for (i = 1; i <= j-1; i++) … … 740 752 741 753 // cout << j << " " << mu[k][j] << " " << mu1 << "\n"; 742 754 743 755 mu_k[j] -= mu1; 744 756 745 757 conv(MU, mu1); 746 758 747 759 748 760 RowTransform(B(k), B(j), MU, B1[k], B1[j], in_vec, 749 761 max_b[k], max_b[j], in_float); … … 761 773 } while (Fc1); 762 774 763 if (check && (*check)(B(k))) 775 if (check && (*check)(B(k))) 764 776 quit = 1; 765 777 … … 784 796 if (deep > 0) { 785 797 // deep insertions 786 798 787 799 Error("sorry...deep insertions not implemented"); 788 800 } // end deep insertions … … 819 831 820 832 static 821 long G_LLL_QP(mat_ZZ& B, mat_ZZ* U, quad_float delta, long deep, 833 long G_LLL_QP(mat_ZZ& B, mat_ZZ* U, quad_float delta, long deep, 822 834 LLLCheckFct check) 823 835 { … … 877 889 GivensCache_QP cache(m, n); 878 890 879 new_m = 891 new_m = 880 892 ll_G_LLL_QP(B, U, delta, deep, check, B1, mu, aux, m, 1, quit, cache); 881 893 … … 918 930 } 919 931 920 932 921 933 922 934 long G_LLL_QP(mat_ZZ& B, double delta, long deep, LLLCheckFct check, … … 931 943 } 932 944 933 long G_LLL_QP(mat_ZZ& B, mat_ZZ& U, double delta, long deep, 945 long G_LLL_QP(mat_ZZ& B, mat_ZZ& U, double delta, long deep, 934 946 LLLCheckFct check, long verb) 935 947 { … … 949 961 void ComputeG_BKZConstant(long beta, long p) 950 962 { 951 const quad_float c_PI = 963 const quad_float c_PI = 952 964 to_quad_float("3.141592653589793238462643383279502884197"); 953 const quad_float LogPI = 965 const quad_float LogPI = 954 966 to_quad_float("1.144729885849400174143427351353058711647"); 955 967 … … 975 987 for (j = 1; j <= k; j++) 976 988 x = x + Log(j); 977 989 978 990 x = x * (1/to_quad_float(k)); 979 991 … … 1003 1015 static vec_quad_float G_BKZThresh; 1004 1016 1005 static 1017 static 1006 1018 void ComputeG_BKZThresh(quad_float *c, long beta) 1007 1019 { … … 1022 1034 1023 1035 static 1024 long G_BKZ_QP(mat_ZZ& BB, mat_ZZ* UU, quad_float delta, 1036 long G_BKZ_QP(mat_ZZ& BB, mat_ZZ* UU, quad_float delta, 1025 1037 long beta, long prune, LLLCheckFct check) 1026 1038 { … … 1029 1041 long n = BB.NumCols(); 1030 1042 long m_orig = m; 1031 1043 1032 1044 long i, j; 1033 1045 ZZ MU; … … 1136 1148 CheckFinite(&B1[i][j]); 1137 1149 } 1138 1150 1139 1151 1140 1152 GivensCache_QP cache(m, n); … … 1174 1186 z = 0; 1175 1187 jj = 0; 1176 1188 1177 1189 while (z < m-1) { 1178 1190 jj++; 1179 1191 kk = min(jj+beta-1, m); 1180 1192 1181 1193 if (jj == m) { 1182 1194 jj = 1; … … 1197 1209 ComputeG_BKZThresh(&c[jj], kk-jj+1); 1198 1210 1199 1211 1200 1212 cbar = c[jj]; 1201 1213 utildavec[jj] = uvec[jj] = 1; 1202 1214 1203 1215 yvec[jj] = vvec[jj] = 0; 1204 1216 Deltavec[jj] = 0; 1205 1206 1217 1218 1207 1219 s = t = jj; 1208 1220 deltavec[jj] = 1; 1209 1221 1210 1222 for (i = jj+1; i <= kk+1; i++) { 1211 1223 ctilda[i] = uvec[i] = utildavec[i] = yvec[i] = 0; … … 1216 1228 1217 1229 long enum_cnt = 0; 1218 1230 1219 1231 while (t <= kk) { 1220 1232 1221 ctilda[t] = ctilda[t+1] + 1233 ctilda[t] = ctilda[t+1] + 1222 1234 (yvec[t]+utildavec[t])*(yvec[t]+utildavec[t])*c[t]; 1223 1235 1224 1236 if (prune > 0 && t > jj) { 1225 1237 eta = G_BKZThresh(t-jj); … … 1246 1258 utildavec[t] = vvec[t] = t1; 1247 1259 Deltavec[t] = 0; 1248 if (utildavec[t] > -yvec[t]) 1260 if (utildavec[t] > -yvec[t]) 1249 1261 deltavec[t] = -1; 1250 1262 else … … 1270 1282 1271 1283 h = min(kk+1, m); 1272 1284 1273 1285 if ((delta-8*red_fudge)*c[jj] > cbar) { 1274 1286 … … 1277 1289 // we treat the case that the new vector is b_s (jj < s <= kk) 1278 1290 // as a special case that appears to occur most of the time. 1279 1291 1280 1292 s = 0; 1281 1293 for (i = jj+1; i <= kk; i++) { … … 1287 1299 } 1288 1300 } 1289 1301 1290 1302 if (s == 0) Error("G_BKZ_QP: internal error"); 1291 1303 1292 1304 if (s > 0) { 1293 1305 // special case 1294 1306 1295 1307 NumTrivial++; 1296 1308 1297 1309 for (i = s; i > jj; i--) { 1298 1310 // swap i, i-1 … … 1301 1313 tp = B1[i-1]; B1[i-1] = B1[i]; B1[i] = tp; 1302 1314 } 1303 1315 1304 1316 // cerr << "special case\n"; 1305 1317 new_m = ll_G_LLL_QP(B, U, delta, 0, check, … … 1313 1325 NumNonTrivial++; 1314 1326 1315 1327 1316 1328 for (i = 1; i <= n; i++) conv(B(m+1, i), 0); 1317 1329 … … 1327 1339 if (U) RowTransform2((*U)(m+1), (*U)(i), MU); 1328 1340 } 1329 1341 1330 1342 for (i = m+1; i >= jj+1; i--) { 1331 1343 // swap i, i-1 … … 1334 1346 tp = B1[i-1]; B1[i-1] = B1[i]; B1[i] = tp; 1335 1347 } 1336 1348 1337 1349 for (i = 1; i <= n; i++) { 1338 1350 conv(B1[jj][i], B(jj, i)); 1339 1351 CheckFinite(&B1[jj][i]); 1340 1352 } 1341 1342 if (IsZero(B(jj))) Error("G_BKZ_QP: internal error"); 1343 1353 1354 if (IsZero(B(jj))) Error("G_BKZ_QP: internal error"); 1355 1344 1356 // remove linear dependencies 1345 1357 1346 1358 // cerr << "general case\n"; 1347 1359 new_m = ll_G_LLL_QP(B, U, delta, 0, 0, B1, mu, aux, 1348 1360 kk+1, jj, quit, cache); 1349 1350 if (new_m != kk) Error("G_BKZ_QP: internal error"); 1361 1362 if (new_m != kk) Error("G_BKZ_QP: internal error"); 1351 1363 1352 1364 // remove zero vector 1353 1365 1354 1366 for (i = kk+2; i <= m+1; i++) { 1355 1367 // swap i, i-1 … … 1358 1370 tp = B1[i-1]; B1[i-1] = B1[i]; B1[i] = tp; 1359 1371 } 1360 1372 1361 1373 quit = 0; 1362 1374 if (check) { … … 1369 1381 1370 1382 if (quit) break; 1371 1383 1372 1384 if (h > kk) { 1373 1385 // extend reduced basis 1374 1386 1375 1387 new_m = ll_G_LLL_QP(B, U, delta, 0, check, 1376 1388 B1, mu, aux, h, h, quit, cache); 1377 1389 1378 1390 if (new_m != h) Error("G_BKZ_QP: internal error"); 1379 1391 if (quit) break; 1380 1392 } 1381 1393 } 1382 1394 1383 1395 z = 0; 1384 1396 } … … 1392 1404 if (!clean) { 1393 1405 new_m = 1394 ll_G_LLL_QP(B, U, delta, 0, check, B1, mu, aux, 1406 ll_G_LLL_QP(B, U, delta, 0, check, B1, mu, aux, 1395 1407 h, h, quit, cache); 1396 1408 if (new_m != h) Error("G_BKZ_QP: internal error"); 1397 1409 if (quit) break; 1398 1410 } 1399 1411 1400 1412 z++; 1401 1413 } … … 1460 1472 } 1461 1473 1462 long G_BKZ_QP(mat_ZZ& BB, mat_ZZ& UU, double delta, 1474 long G_BKZ_QP(mat_ZZ& BB, mat_ZZ& UU, double delta, 1463 1475 long beta, long prune, LLLCheckFct check, long verb) 1464 1476 { … … 1466 1478 NumSwaps = 0; 1467 1479 1468 1469 1480 if (delta < 0.50 || delta >= 1) Error("G_BKZ_QP: bad delta"); 1470 1481 if (beta < 2) Error("G_BKZ_QP: bad block size"); … … 1473 1484 } 1474 1485 1475 long G_BKZ_QP(mat_ZZ& BB, double delta, 1486 long G_BKZ_QP(mat_ZZ& BB, double delta, 1476 1487 long beta, long prune, LLLCheckFct check, long verb) 1477 1488 { … … 1488 1499 1489 1500 static 1490 long G_BKZ_QP1(mat_ZZ& BB, mat_ZZ* UU, quad_float delta, 1501 long G_BKZ_QP1(mat_ZZ& BB, mat_ZZ* UU, quad_float delta, 1491 1502 long beta, long prune, LLLCheckFct check) 1492 1503 { … … 1495 1506 long n = BB.NumCols(); 1496 1507 long m_orig = m; 1497 1508 1498 1509 long i, j; 1499 1510 ZZ MU; … … 1641 1652 z = 0; 1642 1653 jj = 0; 1643 1654 1644 1655 while (z < m-1) { 1645 1656 jj++; 1646 1657 kk = min(jj+beta-1, m); 1647 1658 1648 1659 if (jj == m) { 1649 1660 jj = 1; … … 1664 1675 ComputeG_BKZThresh(&c[jj], kk-jj+1); 1665 1676 1666 1677 1667 1678 cbar = to_double(c[jj]); 1668 1679 utildavec[jj] = uvec[jj] = 1; 1669 1680 1670 1681 yvec[jj] = vvec[jj] = 0; 1671 1682 Deltavec[jj] = 0; 1672 1673 1683 1684 1674 1685 s = t = jj; 1675 1686 deltavec[jj] = 1; 1676 1687 1677 1688 for (i = jj+1; i <= kk+1; i++) { 1678 1689 ctilda[i] = uvec[i] = utildavec[i] = yvec[i] = 0; … … 1683 1694 1684 1695 long enum_cnt = 0; 1685 1696 1686 1697 while (t <= kk) { 1687 1688 ctilda[t] = ctilda[t+1] + 1698 ctilda[t] = ctilda[t+1] + 1689 1699 (yvec[t]+utildavec[t])*(yvec[t]+utildavec[t])*to_double(c[t]); 1690 1700 1691 1701 ForceToMem(&ctilda[t]); // prevents an infinite loop 1692 1702 1693 1703 if (prune > 0 && t > jj) { 1694 1704 eta = to_double(G_BKZThresh(t-jj)); … … 1717 1727 utildavec[t] = vvec[t] = t1; 1718 1728 Deltavec[t] = 0; 1719 if (utildavec[t] > -yvec[t]) 1729 if (utildavec[t] > -yvec[t]) 1720 1730 deltavec[t] = -1; 1721 1731 else … … 1743 1753 1744 1754 quad_float t1; 1745 1755 1746 1756 if ((delta-8*red_fudge)*c[jj] > cbar*(1+64/NTL_FDOUBLE_PRECISION)) { 1747 1757 … … 1750 1760 // we treat the case that the new vector is b_s (jj < s <= kk) 1751 1761 // as a special case that appears to occur most of the time. 1752 1762 1753 1763 s = 0; 1754 1764 for (i = jj+1; i <= kk; i++) { … … 1760 1770 } 1761 1771 } 1762 1772 1763 1773 if (s == 0) Error("G_BKZ_QP: internal error"); 1764 1774 1765 1775 if (s > 0) { 1766 1776 // special case 1767 1777 1768 1778 NumTrivial++; 1769 1779 1770 1780 for (i = s; i > jj; i--) { 1771 1781 // swap i, i-1 … … 1774 1784 tp = B1[i-1]; B1[i-1] = B1[i]; B1[i] = tp; 1775 1785 } 1776 1786 1777 1787 // cerr << "special case\n"; 1778 1788 new_m = ll_G_LLL_QP(B, U, delta, 0, check, … … 1786 1796 NumNonTrivial++; 1787 1797 1788 1798 1789 1799 for (i = 1; i <= n; i++) conv(B(m+1, i), 0); 1790 1800 … … 1800 1810 if (U) RowTransform2((*U)(m+1), (*U)(i), MU); 1801 1811 } 1802 1812 1803 1813 for (i = m+1; i >= jj+1; i--) { 1804 1814 // swap i, i-1 … … 1807 1817 tp = B1[i-1]; B1[i-1] = B1[i]; B1[i] = tp; 1808 1818 } 1809 1819 1810 1820 for (i = 1; i <= n; i++) { 1811 1821 conv(B1[jj][i], B(jj, i)); 1812 1822 CheckFinite(&B1[jj][i]); 1813 1823 } 1814 1815 if (IsZero(B(jj))) Error("G_BKZ_QP: internal error"); 1816 1824 1825 if (IsZero(B(jj))) Error("G_BKZ_QP: internal error"); 1826 1817 1827 // remove linear dependencies 1818 1828 1819 1829 // cerr << "general case\n"; 1820 1830 new_m = ll_G_LLL_QP(B, U, delta, 0, 0, B1, mu, aux, 1821 1831 kk+1, jj, quit, cache); 1822 1823 if (new_m != kk) Error("G_BKZ_QP: internal error"); 1832 1833 if (new_m != kk) Error("G_BKZ_QP: internal error"); 1824 1834 1825 1835 // remove zero vector 1826 1836 1827 1837 for (i = kk+2; i <= m+1; i++) { 1828 1838 // swap i, i-1 … … 1831 1841 tp = B1[i-1]; B1[i-1] = B1[i]; B1[i] = tp; 1832 1842 } 1833 1843 1834 1844 quit = 0; 1835 1845 if (check) { … … 1842 1852 1843 1853 if (quit) break; 1844 1854 1845 1855 if (h > kk) { 1846 1856 // extend reduced basis 1847 1857 1848 1858 new_m = ll_G_LLL_QP(B, U, delta, 0, check, 1849 1859 B1, mu, aux, h, h, quit, cache); 1850 1860 1851 1861 if (new_m != h) Error("G_BKZ_QP: internal error"); 1852 1862 if (quit) break; 1853 1863 } 1854 1864 } 1855 1865 1856 1866 z = 0; 1857 1867 } … … 1870 1880 if (quit) break; 1871 1881 } 1872 1882 1873 1883 z++; 1874 1884 } … … 1933 1943 } 1934 1944 1935 long G_BKZ_QP1(mat_ZZ& BB, mat_ZZ& UU, double delta, 1945 long G_BKZ_QP1(mat_ZZ& BB, mat_ZZ& UU, double delta, 1936 1946 long beta, long prune, LLLCheckFct check, long verb) 1937 1947 { … … 1945 1955 } 1946 1956 1947 long G_BKZ_QP1(mat_ZZ& BB, double delta, 1957 long G_BKZ_QP1(mat_ZZ& BB, double delta, 1948 1958 long beta, long prune, LLLCheckFct check, long verb) 1949 1959 { -
ntl/src/G_LLL_RR.c
r1d43d18 r287cc8 37 37 if (MU == 0) return; 38 38 39 if (NumTwos(MU) >= NTL_ZZ_NBITS) 39 if (NumTwos(MU) >= NTL_ZZ_NBITS) 40 40 k = MakeOdd(MU); 41 41 else … … 89 89 if (MU == 0) return; 90 90 91 if (NumTwos(MU) >= NTL_ZZ_NBITS) 91 if (NumTwos(MU) >= NTL_ZZ_NBITS) 92 92 k = MakeOdd(MU); 93 93 else … … 138 138 { 139 139 sz = min(m, n)/10; 140 if (sz < 2) 140 if (sz < 2) 141 141 sz = 2; 142 142 else if (sz > 20) … … 227 227 } 228 228 229 i = 0; 229 i = 0; 230 230 while (i < sz && bl[i] != 0) 231 231 i++; … … 273 273 backoff = 2; 274 274 else if (backoff > cache.sz + 2) 275 backoff = cache.sz + 2; 275 backoff = cache.sz + 2; 276 276 277 277 long ub = k-(backoff-1); … … 280 280 vec_RR& cptr = mu(i); 281 281 vec_RR& sptr = aux(i); 282 282 283 283 for (j = n; j > i; j--) { 284 284 c = cptr(j); 285 285 s = sptr(j); 286 286 287 287 // a = c*pp(j-1) - s*pp(j); 288 288 mul(T1, c, pp(j-1)); … … 294 294 mul(T2, c, pp(j)); 295 295 add(b, T1, T2); 296 296 297 297 pp(j-1) = a; 298 298 pp(j) = b; 299 299 } 300 300 301 301 div(pp(i), pp(i), mu(i,i)); 302 302 } … … 312 312 vec_RR& cptr = mu(i); 313 313 vec_RR& sptr = aux(i); 314 314 315 315 for (j = n; j > i; j--) { 316 316 c = cptr(j); 317 317 s = sptr(j); 318 318 319 319 // a = c*p(j-1) - s*p(j); 320 320 mul(T1, c, p(j-1)); … … 326 326 mul(T2, c, p(j)); 327 327 add(b, T1, T2); 328 328 329 329 p(j-1) = a; 330 330 p(j) = b; 331 331 } 332 332 333 333 div(p(i), p(i), mu(i,i)); 334 334 } … … 350 350 div(T1, a, b); 351 351 negate(t, T1); 352 352 353 353 // s = 1/sqrt(1 + t*t); 354 354 sqr(T1, t); … … 356 356 SqrRoot(T1, T1); 357 357 inv(s, T1); 358 358 359 359 // c = s*t; 360 360 mul(c, s, t); … … 364 364 div(T1, b, a); 365 365 negate(t, T1); 366 366 367 367 // c = 1/sqrt(1 + t*t); 368 368 sqr(T1, t);