| line | true | false | branch | 
 
| 59 | 33855 | 149 | if (n > 1) { | 
 
| 60 | 14882 | 33855 | while ( (n & 1) == 0 ) { factors[nfactors++] = 2; n /= 2; } | 
 
| 61 | 10524 | 33855 | while ( (n % 3) == 0 ) { factors[nfactors++] = 3; n /= 3; } | 
 
| 62 | 5930 | 33855 | while ( (n % 5) == 0 ) { factors[nfactors++] = 5; n /= 5; } | 
 
| 65 | 26728 | 7276 | if (f*f <= n) { | 
 
| 69 | 26561 | 167 | if (n <= 4294967295U) { | 
 
| 71 | 238730 | 219 | while (sp < lastsp) { | 
 
| 72 | 12438 | 238730 | while ( (un%f) == 0 ) { | 
 
| 77 | 26342 | 212388 | if (f*f > un) break; | 
 
| 81 | 12477 | 155 | while (sp < lastsp) { | 
 
| 82 | 220 | 12477 | while ( (n%f) == 0 ) { | 
 
| 87 | 12 | 12465 | if (f*f > n) break; | 
 
| 91 | 26419 | 309 | if (n < 2011*2011 && f*f <= n) {  /* Trial division from 431 to 2003 */ | 
 
|  | 65 | 26354 | if (n < 2011*2011 && f*f <= n) {  /* Trial division from 431 to 2003 */ | 
 
| 93 | 5934 | 0 | while (sp < NPRIMES_SMALL) { | 
 
| 94 | 21 | 5934 | while ( (un%f) == 0 ) { | 
 
| 99 | 65 | 5869 | if (f*f > un) break; | 
 
| 104 | 33695 | 309 | if (f*f > n && n != 1) { | 
 
|  | 30179 | 3516 | if (f*f > n && n != 1) { | 
 
| 108 | 34004 | 0 | if (newn) *newn = n; | 
 
| 109 | 34004 | 0 | if (lastf) *lastf = f; | 
 
| 116 | 5 | 200 | if (k > 1) { | 
 
| 119 | 12 | 5 | for (i = nfactors; i >= 0; i--) | 
 
| 120 | 26 | 12 | for (j = 0; j < k; j++) | 
 
| 132 | 0 | 190 | if (n < 4) { | 
 
| 137 | 0 | 190 | if (trial) { | 
 
| 139 | 0 | 0 | if (!(n&1)) { factors[0] = 2; factors[1] = n >> 1; return 2; } | 
 
| 140 | 0 | 0 | if (!(n%3)) { factors[0] = 3; factors[1] = n / 3; return 2; } | 
 
| 141 | 0 | 0 | if (!(n%5)) { factors[0] = 5; factors[1] = n / 5; return 2; } | 
 
| 142 | 0 | 0 | for (sp = 4; (f = primes_small[sp]) < 2011; sp++) { | 
 
| 143 | 0 | 0 | if ( (n % f) == 0 ) | 
 
| 146 | 0 | 0 | if (n < f*f) { factors[0] = n; return 1; } | 
 
| 148 | 0 | 190 | if (primality && is_prime(n)) { | 
 
|  | 0 | 0 | if (primality && is_prime(n)) { | 
 
| 159 | 190 | 0 | UV const nbits = BITS_PER_WORD - clz(n); | 
 
| 161 | 68 | 122 | UV const br_rounds = 8000 + (9000 * ((nbits <= 45) ? 0 : (nbits-45))); | 
 
| 175 | 35 | 155 | if (nbits <= 30) { /* This should always succeed */ | 
 
| 177 | 35 | 0 | if (nfactors > 1) return nfactors; | 
 
| 181 | 155 | 0 | if (br_rounds > 0) { | 
 
| 183 | 155 | 0 | if (nfactors > 1) return nfactors; | 
 
| 187 | 0 | 0 | if (nfactors > 1) return nfactors; | 
 
| 196 | 0 | 0 | if (nbits <= 62) { | 
 
| 198 | 0 | 0 | if (nfactors > 1) return nfactors; | 
 
| 202 | 0 | 0 | if (nfactors > 1) return nfactors; | 
 
| 205 | 0 | 0 | if (nfactors > 1) return nfactors; | 
 
| 207 | 0 | 0 | if (nfactors > 1) return nfactors; | 
 
| 209 | 0 | 0 | if (nfactors > 1) return nfactors; | 
 
| 227 | 33695 | 309 | if (n == 1) return nfactors; | 
 
| 231 | 107 | 202 | if (n < 100000000 && n < f*f*f) { | 
 
|  | 104 | 3 | if (n < 100000000 && n < f*f*f) { | 
 
| 232 | 52 | 52 | if (MR32(n)) factors[nfactors++] = n; | 
 
| 242 | 5 | 200 | if (npowerfactors > 1) return nsmallfactors + npowerfactors; | 
 
| 246 | 353 | 177 | while ( (n >= f*f) && (!is_def_prime(n)) ) { | 
 
|  | 124 | 229 | while ( (n >= f*f) && (!is_def_prime(n)) ) { | 
 
|  | 37 | 87 | while ( (n >= f*f) && (!is_def_prime(n)) ) { | 
 
|  | 128 | 101 | while ( (n >= f*f) && (!is_def_prime(n)) ) { | 
 
| 248 | 165 | 0 | if (split_success != 1 || tofac_stack[ntofac] == 1 || tofac_stack[ntofac] == n) | 
 
|  | 165 | 0 | if (split_success != 1 || tofac_stack[ntofac] == 1 || tofac_stack[ntofac] == n) | 
 
|  | 0 | 165 | if (split_success != 1 || tofac_stack[ntofac] == 1 || tofac_stack[ntofac] == n) | 
 
| 254 | 365 | 0 | if (n != 1)  factors[nfactors++] = n; | 
 
| 256 | 165 | 200 | if (ntofac > 0)  n = tofac_stack[ntofac-1]; | 
 
| 257 | 165 | 200 | } while (ntofac-- > 0); | 
 
| 260 | 165 | 200 | for (i = nsmallfactors+1; i < nfactors; i++) { | 
 
| 262 | 316 | 42 | for (j = i; j > 0 && factors[j-1] > fi; j--) | 
 
|  | 193 | 123 | for (j = i; j > 0 && factors[j-1] > fi; j--) | 
 
| 274 | 11 | 12664 | if (n == 1) return 0; | 
 
| 277 | 53 | 12611 | if (exponents == 0) { | 
 
| 278 | 165 | 53 | for (; i < nfactors; i++) | 
 
| 279 | 111 | 54 | if (factors[i] != factors[i-1]) | 
 
| 283 | 16463 | 12611 | for (; i < nfactors; i++) { | 
 
| 284 | 12924 | 3539 | if (factors[i] != factors[i-1]) { | 
 
| 299 | 0 | 1619 | if (f < 2) f = 2; | 
 
| 300 | 1616 | 3 | if (last == 0 || last*last > n) last = UV_MAX; | 
 
|  | 1010 | 606 | if (last == 0 || last*last > n) last = UV_MAX; | 
 
| 302 | 1611 | 8 | if (n < 4 || last < f) { | 
 
|  | 0 | 1611 | if (n < 4 || last < f) { | 
 
| 309 | 1611 | 0 | if (f < primes_small[NPRIMES_SMALL-1]) { | 
 
| 310 | 1621 | 1611 | while ( (n & 1) == 0 ) { factors[nfactors++] = 2; n >>= 1; } | 
 
| 311 | 1608 | 3 | if (3<=last) while ( (n % 3) == 0 ) { factors[nfactors++] = 3; n /= 3; } | 
 
|  | 804 | 1608 | if (3<=last) while ( (n % 3) == 0 ) { factors[nfactors++] = 3; n /= 3; } | 
 
| 312 | 1508 | 103 | if (5<=last) while ( (n % 5) == 0 ) { factors[nfactors++] = 5; n /= 5; } | 
 
|  | 372 | 1508 | if (5<=last) while ( (n % 5) == 0 ) { factors[nfactors++] = 5; n /= 5; } | 
 
| 313 | 5598 | 3 | for (sp = 4; sp < (int)NPRIMES_SMALL; sp++) { | 
 
| 315 | 4560 | 1038 | if (f*f > n || f > last) break; | 
 
|  | 3990 | 570 | if (f*f > n || f > last) break; | 
 
| 316 | 384 | 3990 | while ( (n%f) == 0 ) { | 
 
| 323 | 573 | 1038 | if (f*f <= n && f <= last) { | 
 
|  | 3 | 570 | if (f*f <= n && f <= last) { | 
 
| 325 | 2 | 1 | if (limit > last) limit = last; | 
 
| 327 | 7903 | 3 | while (f <= limit) { | 
 
| 328 | 2 | 7901 | if ( (n%f) == 0 ) { | 
 
| 332 | 0 | 2 | } while ( (n%f) == 0 ); | 
 
| 334 | 2 | 0 | if (newlimit < limit)  limit = newlimit; | 
 
| 341 | 1485 | 126 | if (n != 1) | 
 
| 351 | 8945 | 3834 | for (s = 0; s < nfactors; s++) { | 
 
| 353 | 12120 | 8945 | for (j = 0; j < e; j++) { | 
 
| 355 | 28417 | 12120 | for (i = 0; i < scount; i++) | 
 
| 368 | 4 | 3834 | if (n <= 1) { | 
 
| 370 | 1 | 3 | if (n == 0) {  divs[0] = 0;  divs[1] = 1;  *num_divisors = 2;  } | 
 
| 371 | 3 | 1 | if (n == 1) {  divs[0] = 1;                *num_divisors = 1;  } | 
 
| 378 | 5111 | 3834 | for (i = 1; i < nfactors; i++) | 
 
| 380 | 0 | 3834 | New(0, divs, ndivisors, UV); | 
 
| 409 | 1505 | 0 | if (k > 11 || (k > 0 && n >= sigma_overflow[k-1])) return 0; | 
 
|  | 250 | 1255 | if (k > 11 || (k > 0 && n >= sigma_overflow[k-1])) return 0; | 
 
|  | 0 | 250 | if (k > 11 || (k > 0 && n >= sigma_overflow[k-1])) return 0; | 
 
| 410 | 287 | 1218 | if (n <= 1)                               /* n=0  divisors are [0,1] */ | 
 
| 411 | 3 | 284 | return (n == 1) ? 1 : (k == 0) ? 2 : 1; /* n=1  divisors are [1]   */ | 
 
|  | 2 | 1 | return (n == 1) ? 1 : (k == 0) ? 2 : 1; /* n=1  divisors are [1]   */ | 
 
| 413 | 974 | 244 | if (k == 0) { | 
 
| 414 | 1365 | 974 | for (i = 0; i < nfac; i++) { | 
 
| 416 | 832 | 974 | while (i+1 < nfac && f == factors[i+1]) { e++; i++; } | 
 
|  | 441 | 391 | while (i+1 < nfac && f == factors[i+1]) { e++; i++; } | 
 
| 419 | 157 | 87 | } else if (k == 1) { | 
 
| 420 | 270 | 157 | for (i = 0; i < nfac; i++) { | 
 
| 423 | 215 | 157 | while (i+1 < nfac && f == factors[i+1]) { | 
 
|  | 102 | 113 | while (i+1 < nfac && f == factors[i+1]) { | 
 
| 431 | 135 | 87 | for (i = 0; i < nfac; i++) { | 
 
| 434 | 193 | 135 | for (j = 1; j < (int)k; j++)  pk *= f; | 
 
| 437 | 101 | 87 | while (i+1 < nfac && f == factors[i+1]) { | 
 
|  | 53 | 48 | while (i+1 < nfac && f == factors[i+1]) { | 
 
| 455 | 255 | 0 | if (f == 1 || f2 == 1) { | 
 
|  | 0 | 255 | if (f == 1 || f2 == 1) { | 
 
| 461 | 0 | 255 | MPUassert( factors[0] * factors[1] == n , "incorrect factoring"); | 
 
| 471 | 2 | 0 | MPUassert( (n >= 3) && ((n%2) != 0) , "bad n in fermat_factor"); | 
 
|  | 0 | 2 | MPUassert( (n >= 3) && ((n%2) != 0) , "bad n in fermat_factor"); | 
 
| 477 | 8 | 2 | while (r != 0) { | 
 
| 478 | 0 | 8 | if (rounds-- == 0) { factors[0] = n; return 1; } | 
 
| 484 | 18 | 8 | } while (r > 0); | 
 
| 495 | 2 | 0 | MPUassert( (n >= 3) && ((n%2) != 0) , "bad n in holf_factor"); | 
 
|  | 0 | 2 | MPUassert( (n >= 3) && ((n%2) != 0) , "bad n in holf_factor"); | 
 
| 499 | 0 | 2 | if (is_perfect_square(n)) | 
 
| 502 | 2 | 0 | if (n <= (UV_MAX >> 6)) {    /* Try with premultiplier first */ | 
 
| 503 | 0 | 2 | UV npre = n * ( (n <= (UV_MAX >> 13)) ? 720 : | 
 
|  | 0 | 0 | UV npre = n * ( (n <= (UV_MAX >> 13)) ? 720 : | 
 
|  | 0 | 0 | UV npre = n * ( (n <= (UV_MAX >> 13)) ? 720 : | 
 
|  | 0 | 0 | UV npre = n * ( (n <= (UV_MAX >> 13)) ? 720 : | 
 
| 521 | 3 | 0 | while (rounds--) { | 
 
| 525 | 2 | 1 | if (!((f*0x8bc40d7d) & (f*0xa1e2f5d1) & 0x14020a)) { | 
 
| 527 | 2 | 0 | if (m == f*f) { | 
 
| 529 | 2 | 0 | if (f > 1 && f < n) | 
 
|  | 2 | 0 | if (f > 1 && f < n) | 
 
| 533 | 0 | 1 | if (ni >= (ni+npre)) break; | 
 
| 539 | 0 | 0 | for (i = 1; i <= rounds; i++) { | 
 
| 545 | 0 | 0 | if (is_perfect_square(m)) { | 
 
| 547 | 0 | 0 | f = gcd_ui( (s>f) ? s-f : f-s, n); | 
 
| 559 | 0 | 87 | if (n < 3) { factors[0] = n; return 1; } | 
 
| 560 | 0 | 87 | if (!(n&1)) { factors[0] = 2; factors[1] = n/2; return 2; } | 
 
| 561 | 1 | 86 | if (is_perfect_square(n)) { factors[0] = factors[1] = isqrt(n); return 2; } | 
 
| 564 | 2649 | 0 | while (rounds--) { | 
 
| 568 | 2059 | 590 | if (!((f*0x8bc40d7d) & (f*0xa1e2f5d1) & 0x14020a)) { | 
 
| 570 | 86 | 1973 | if (m == f*f) { | 
 
| 572 | 86 | 0 | if (f > 1 && f < n) | 
 
|  | 86 | 0 | if (f > 1 && f < n) | 
 
| 576 | 0 | 2563 | if (ni >= (ni+npre)) break; /* We've overflowed */ | 
 
| 589 | 157 | 0 | UV const nbits = BITS_PER_WORD - clz(n); | 
 
| 590 | 152 | 5 | const UV inner = (nbits <= 31) ? 32 : (nbits <= 35) ? 64 : (nbits <= 40) ? 160 : (nbits <= 52) ? 256 : 320; | 
 
|  | 144 | 8 | const UV inner = (nbits <= 31) ? 32 : (nbits <= 35) ? 64 : (nbits <= 40) ? 160 : (nbits <= 52) ? 256 : 320; | 
 
|  | 104 | 40 | const UV inner = (nbits <= 31) ? 32 : (nbits <= 35) ? 64 : (nbits <= 40) ? 160 : (nbits <= 52) ? 256 : 320; | 
 
|  | 62 | 42 | const UV inner = (nbits <= 31) ? 32 : (nbits <= 35) ? 64 : (nbits <= 40) ? 160 : (nbits <= 52) ? 256 : 320; | 
 
| 595 | 157 | 0 | MPUassert( (n >= 3) && ((n%2) != 0) , "bad n in pbrent_factor"); | 
 
|  | 0 | 157 | MPUassert( (n >= 3) && ((n%2) != 0) , "bad n in pbrent_factor"); | 
 
| 600 | 1219 | 0 | while (rounds > 0) { | 
 
| 604 | 2095 | 1062 | while (rleft > 0) { | 
 
| 609 | 1741 | 354 | if (n < (1ULL << 63)) { | 
 
| 611 | 858 | 883 | m = ABSDIFF(Xi,Xm); | 
 
| 612 | 221249 | 1741 | while (--irounds > 0) { | 
 
| 614 | 96995 | 124254 | f = ABSDIFF(Xi,Xm); | 
 
| 617 | 354 | 0 | } else if (a == mont1) { | 
 
| 619 | 201 | 153 | m = ABSDIFF(Xi,Xm); | 
 
| 620 | 103835 | 354 | while (--irounds > 0) { | 
 
| 622 | 59454 | 44381 | f = ABSDIFF(Xi,Xm); | 
 
| 627 | 0 | 0 | m = ABSDIFF(Xi,Xm); | 
 
| 628 | 0 | 0 | while (--irounds > 0) { | 
 
| 630 | 0 | 0 | f = ABSDIFF(Xi,Xm); | 
 
| 635 | 157 | 1938 | if (f != 1) | 
 
| 639 | 1062 | 157 | if (f == 1) { | 
 
| 643 | 0 | 157 | if (f == n) {  /* back up, with safety */ | 
 
| 646 | 0 | 0 | if (n < (1ULL << 63) || a == mont1) | 
 
|  | 0 | 0 | if (n < (1ULL << 63) || a == mont1) | 
 
| 647 | 0 | 0 | Xi = mont_mulmod(Xi,Xi+a,n); | 
 
| 649 | 0 | 0 | Xi = addmod(mont_mulmod(Xi,Xi,n),a,n); | 
 
| 650 | 0 | 0 | m = ABSDIFF(Xi,Xm); | 
 
| 652 | 0 | 0 | } while (f == 1 && r-- != 0); | 
 
|  | 0 | 0 | } while (f == 1 && r-- != 0); | 
 
| 654 | 157 | 0 | if (f == 0 || f == n) { | 
 
|  | 0 | 157 | if (f == 0 || f == n) { | 
 
| 655 | 0 | 0 | if (fails-- <= 0) break; | 
 
| 732 | 2 | 0 | MPUassert( (n >= 3) && ((n%2) != 0) , "bad n in prho_factor"); | 
 
|  | 0 | 2 | MPUassert( (n >= 3) && ((n%2) != 0) , "bad n in prho_factor"); | 
 
| 745 | 2 | 0 | while (rounds-- > 0) { | 
 
| 747 | 128 | 2 | for (i = 0; i < inner; i++) { | 
 
| 751 | 59 | 69 | f = (U > V) ? U-V : V-U; | 
 
| 755 | 0 | 2 | if (f == 1) | 
 
| 757 | 2 | 0 | if (f == n) {  /* back up to find a factor*/ | 
 
| 764 | 3 | 3 | f = gcd_ui( (U > V) ? U-V : V-U, n); | 
 
| 765 | 4 | 2 | } while (f == 1 && i-- != 0); | 
 
|  | 4 | 0 | } while (f == 1 && i-- != 0); | 
 
| 767 | 2 | 0 | if (f == 0 || f == n) { | 
 
|  | 0 | 2 | if (f == 0 || f == n) { | 
 
| 768 | 0 | 0 | if (fails-- <= 0) break; | 
 
| 797 | 2 | 0 | MPUassert( (n >= 3) && ((n%2) != 0) , "bad n in pminus1_factor"); | 
 
|  | 0 | 2 | MPUassert( (n >= 3) && ((n%2) != 0) , "bad n in pminus1_factor"); | 
 
| 799 | 0 | 2 | if (B1 <= primes_small[NPRIMES_SMALL-2]) { | 
 
| 801 | 0 | 0 | for (i = 1; primes_small[i] <= B1; i++) { | 
 
| 803 | 0 | 0 | if (q <= sqrtB1) { | 
 
| 805 | 0 | 0 | while (k <= kmin)  k *= q; | 
 
| 808 | 0 | 0 | if ( (j++ % 32) == 0) { | 
 
| 809 | 0 | 0 | PMINUS1_RECOVER_A; | 
 
| 810 | 0 | 0 | if (a == 0 || gcd_ui(a-1, n) != 1) | 
 
|  | 0 | 0 | if (a == 0 || gcd_ui(a-1, n) != 1) | 
 
| 815 | 0 | 0 | PMINUS1_RECOVER_A; | 
 
| 817 | 2 | 0 | START_DO_FOR_EACH_PRIME(2, B1) { | 
 
|  | 6 | 58 | START_DO_FOR_EACH_PRIME(2, B1) { | 
 
|  | 4 | 2 | START_DO_FOR_EACH_PRIME(2, B1) { | 
 
|  | 2 | 2 | START_DO_FOR_EACH_PRIME(2, B1) { | 
 
|  | 8 | 50 | START_DO_FOR_EACH_PRIME(2, B1) { | 
 
|  | 0 | 8 | START_DO_FOR_EACH_PRIME(2, B1) { | 
 
|  | 0 | 8 | START_DO_FOR_EACH_PRIME(2, B1) { | 
 
|  | 0 | 8 | START_DO_FOR_EACH_PRIME(2, B1) { | 
 
|  | 0 | 58 | START_DO_FOR_EACH_PRIME(2, B1) { | 
 
|  | 0 | 64 | START_DO_FOR_EACH_PRIME(2, B1) { | 
 
| 819 | 64 | 0 | if (q <= sqrtB1) { | 
 
| 821 | 136 | 64 | while (k <= kmin)  k *= q; | 
 
| 824 | 2 | 62 | if ( (j++ % 32) == 0) { | 
 
| 825 | 0 | 2 | PMINUS1_RECOVER_A; | 
 
| 826 | 2 | 0 | if (a == 0 || gcd_ui(a-1, n) != 1) | 
 
|  | 0 | 2 | if (a == 0 || gcd_ui(a-1, n) != 1) | 
 
| 831 | 0 | 2 | PMINUS1_RECOVER_A; | 
 
| 833 | 0 | 2 | if (a == 0) { factors[0] = n; return 1; } | 
 
| 837 | 2 | 0 | if (f == n) { | 
 
| 839 | 2 | 0 | START_DO_FOR_EACH_PRIME(saveq, B1) { | 
 
|  | 4 | 0 | START_DO_FOR_EACH_PRIME(saveq, B1) { | 
 
|  | 2 | 2 | START_DO_FOR_EACH_PRIME(saveq, B1) { | 
 
|  | 2 | 0 | START_DO_FOR_EACH_PRIME(saveq, B1) { | 
 
|  | 0 | 0 | START_DO_FOR_EACH_PRIME(saveq, B1) { | 
 
|  | 0 | 0 | START_DO_FOR_EACH_PRIME(saveq, B1) { | 
 
|  | 0 | 0 | START_DO_FOR_EACH_PRIME(saveq, B1) { | 
 
|  | 0 | 0 | START_DO_FOR_EACH_PRIME(saveq, B1) { | 
 
|  | 0 | 0 | START_DO_FOR_EACH_PRIME(saveq, B1) { | 
 
|  | 0 | 4 | START_DO_FOR_EACH_PRIME(saveq, B1) { | 
 
| 841 | 58 | 4 | while (k <= kmin)  k *= p; | 
 
| 845 | 2 | 2 | if (f != 1) | 
 
| 860 | 0 | 2 | if (f == 1 && B2 > B1) { | 
 
|  | 0 | 0 | if (f == 1 && B2 > B1) { | 
 
| 869 | 0 | 0 | for (j = 1; j < 20; j++) { | 
 
| 877 | 0 | 0 | START_DO_FOR_EACH_PRIME( q+1, B2 ) { | 
 
|  | 0 | 0 | START_DO_FOR_EACH_PRIME( q+1, B2 ) { | 
 
|  | 0 | 0 | START_DO_FOR_EACH_PRIME( q+1, B2 ) { | 
 
|  | 0 | 0 | START_DO_FOR_EACH_PRIME( q+1, B2 ) { | 
 
|  | 0 | 0 | START_DO_FOR_EACH_PRIME( q+1, B2 ) { | 
 
|  | 0 | 0 | START_DO_FOR_EACH_PRIME( q+1, B2 ) { | 
 
|  | 0 | 0 | START_DO_FOR_EACH_PRIME( q+1, B2 ) { | 
 
|  | 0 | 0 | START_DO_FOR_EACH_PRIME( q+1, B2 ) { | 
 
|  | 0 | 0 | START_DO_FOR_EACH_PRIME( q+1, B2 ) { | 
 
|  | 0 | 0 | START_DO_FOR_EACH_PRIME( q+1, B2 ) { | 
 
| 883 | 0 | 0 | if (qdiff >= 111) { | 
 
| 887 | 0 | 0 | if (bmdiff == 0) { | 
 
| 888 | 0 | 0 | if (precomp_bm[qdiff-1] != 0) | 
 
| 896 | 0 | 0 | if (a == 0) break; | 
 
| 898 | 0 | 0 | if ( (j++ % 64) == 0 ) { | 
 
| 900 | 0 | 0 | if (f != 1) | 
 
| 915 | 6 | 0 | UV bit = UVCONST(1) << (clz(exp)-1); | 
 
| 916 | 339 | 6 | while (bit) { | 
 
| 918 | 15 | 324 | if ( exp & bit ) { | 
 
| 933 | 2 | 0 | MPUassert( (n >= 3) && ((n%2) != 0) , "bad n in pplus1_factor"); | 
 
|  | 0 | 2 | MPUassert( (n >= 3) && ((n%2) != 0) , "bad n in pplus1_factor"); | 
 
| 938 | 2 | 0 | START_DO_FOR_EACH_PRIME(2, B1) { | 
 
|  | 4 | 0 | START_DO_FOR_EACH_PRIME(2, B1) { | 
 
|  | 2 | 2 | START_DO_FOR_EACH_PRIME(2, B1) { | 
 
|  | 1 | 1 | START_DO_FOR_EACH_PRIME(2, B1) { | 
 
|  | 0 | 0 | START_DO_FOR_EACH_PRIME(2, B1) { | 
 
|  | 0 | 0 | START_DO_FOR_EACH_PRIME(2, B1) { | 
 
|  | 0 | 0 | START_DO_FOR_EACH_PRIME(2, B1) { | 
 
|  | 0 | 0 | START_DO_FOR_EACH_PRIME(2, B1) { | 
 
|  | 0 | 0 | START_DO_FOR_EACH_PRIME(2, B1) { | 
 
|  | 0 | 4 | START_DO_FOR_EACH_PRIME(2, B1) { | 
 
| 940 | 4 | 0 | if (p < sqrtB1) { | 
 
| 942 | 17 | 4 | while (k <= kmin) | 
 
| 946 | 4 | 0 | if (X1 != 2) { | 
 
| 948 | 2 | 2 | if (f != 1 && f != n) break; | 
 
|  | 2 | 0 | if (f != 1 && f != n) break; | 
 
| 951 | 0 | 2 | if (X2 != 2) { | 
 
| 953 | 0 | 0 | if (f != 1 && f != n) break; | 
 
|  | 0 | 0 | if (f != 1 && f != n) break; | 
 
| 1008 | 0 | 3 | if (i & 0x1) { | 
 
| 1014 | 0 | 4 | if (i >= imax) { | 
 
| 1028 | 3 | 1 | if (!((t2*0x8bc40d7d) & (t2*0xa1e2f5d1) & 0x14020a)) { | 
 
| 1030 | 3 | 0 | if (Qn == t1*t1) | 
 
| 1057 | 2 | 1 | SYMMETRY_POINT_ITERATION; | 
 
| 1058 | 1 | 0 | SYMMETRY_POINT_ITERATION; | 
 
| 1059 | 0 | 0 | SYMMETRY_POINT_ITERATION; | 
 
| 1060 | 0 | 0 | SYMMETRY_POINT_ITERATION; | 
 
| 1061 | 0 | 0 | if (j++ > 2000000) { | 
 
| 1068 | 3 | 0 | if (t1 > 1) | 
 
| 1095 | 2 | 0 | MPUassert( (n >= 3) && ((n%2) != 0) , "bad n in squfof_factor"); | 
 
|  | 0 | 2 | MPUassert( (n >= 3) && ((n%2) != 0) , "bad n in squfof_factor"); | 
 
| 1098 | 0 | 2 | if (n > SQUFOF_MAX) { | 
 
| 1102 | 76 | 2 | for (i = 0; i < NSQUFOF_MULT; i++) { | 
 
| 1108 | 2 | 0 | while (mults_racing > 0 && rounds_done < rounds) { | 
 
|  | 2 | 0 | while (mults_racing > 0 && rounds_done < rounds) { | 
 
| 1109 | 3 | 0 | for (i = 0; i < NSQUFOF_MULT && rounds_done < rounds; i++) { | 
 
|  | 3 | 0 | for (i = 0; i < NSQUFOF_MULT && rounds_done < rounds; i++) { | 
 
| 1110 | 0 | 3 | if (mult_save[i].valid == 0)  continue; | 
 
| 1113 | 3 | 0 | if (mult_save[i].valid == -1) { | 
 
| 1114 | 0 | 3 | if ((SQUFOF_MAX / mult) < n) { | 
 
| 1125 | 0 | 3 | if (mult_save[i].Qn == 0) | 
 
| 1131 | 3 | 0 | if (mult_save[i].imax < 20)     mult_save[i].imax = 20; | 
 
| 1132 | 0 | 3 | if (mult_save[i].imax > rounds) mult_save[i].imax = rounds; | 
 
| 1134 | 0 | 3 | if (mults_racing == 1)  /* Do all rounds if only one multiplier left */ | 
 
| 1137 | 3 | 0 | if (f64 > 1) { | 
 
| 1139 | 2 | 1 | if (f64red > 1) { | 
 
| 1148 | 1 | 0 | if (mult_save[i].valid == 0) | 
 
| 1164 | 0 | 0 | for (i = 0; i < SQR_TAB_SIZE; i++) | 
 
| 1172 | 0 | 0 | const double Tune = ((n >> 31) >> 5) ? 3.5 : 5.0; | 
 
| 1177 | 0 | 0 | if (!(n&1)) return found_factor(n, 2, factors); | 
 
| 1181 | 0 | 0 | if (do_trial) { | 
 
| 1183 | 0 | 0 | if (FirstCut < 84) FirstCut = 84; | 
 
| 1184 | 0 | 0 | if (FirstCut > 65535) FirstCut = 65535; | 
 
| 1185 | 0 | 0 | for (ip = 2;  ip < NPRIMES_SMALL; ip++) { | 
 
| 1187 | 0 | 0 | if (p >= FirstCut) | 
 
| 1189 | 0 | 0 | if (n % p == 0) | 
 
| 1194 | 0 | 0 | if (n >= UVCONST(8796393022207)) { factors[0] = n; return 1; } | 
 
| 1199 | 0 | 0 | if (!sqr_tab_init) make_sqr_tab(); | 
 
| 1202 | 0 | 0 | for (k = 1; k <= Bred; k++) { | 
 
| 1203 | 0 | 0 | if (k&1) { inc = 4; r = (k+n) % 4; } | 
 
| 1206 | 0 | 0 | if (kN >= UVCONST(1152921504606846976)) { factors[0] = n; return 1; } | 
 
| 1209 | 0 | 0 | x = (k < SQR_TAB_SIZE) ? sqrtn * sqr_tab[k] : sqrt((double)kN); | 
 
| 1211 | 0 | 0 | if ((UV)a * (UV)a == kN) | 
 
| 1219 | 0 | 0 | for (a = b;  a <= U;  c += inc*(a+a+inc), a += inc) { | 
 
| 1222 | 0 | 0 | if (!((b*0x8bc40d7d) & (b*0xa1e2f5d1) & 0x14020a)) { | 
 
| 1224 | 0 | 0 | if (c == b*b) { | 
 
| 1231 | 0 | 0 | if (do_trial) { | 
 
| 1232 | 0 | 0 | if (B > 65535) B = 65535; | 
 
| 1238 | 0 | 0 | if (ip >= NPRIMES_SMALL)  ip = NPRIMES_SMALL-1; | 
 
| 1253 | 0 | 1 | New(0, N, hi-lo+1, UV); | 
 
| 1254 | 998 | 1 | for (j = 0; j < n; j++) { | 
 
| 1258 | 0 | 1 | sievelim = (sqrthi < _fr_sieve_crossover) ? sqrthi : icbrt(hi); | 
 
| 1259 | 1 | 0 | START_DO_FOR_EACH_PRIME(2, sievelim) { | 
 
|  | 3 | 9 | START_DO_FOR_EACH_PRIME(2, sievelim) { | 
 
|  | 2 | 1 | START_DO_FOR_EACH_PRIME(2, sievelim) { | 
 
|  | 1 | 1 | START_DO_FOR_EACH_PRIME(2, sievelim) { | 
 
|  | 1 | 8 | START_DO_FOR_EACH_PRIME(2, sievelim) { | 
 
|  | 0 | 1 | START_DO_FOR_EACH_PRIME(2, sievelim) { | 
 
|  | 0 | 1 | START_DO_FOR_EACH_PRIME(2, sievelim) { | 
 
|  | 0 | 1 | START_DO_FOR_EACH_PRIME(2, sievelim) { | 
 
|  | 0 | 9 | START_DO_FOR_EACH_PRIME(2, sievelim) { | 
 
|  | 1 | 11 | START_DO_FOR_EACH_PRIME(2, sievelim) { | 
 
| 1261 | 0 | 11 | if (square_free == 0) { | 
 
| 1263 | 0 | 0 | for (q = p; q <= kmin; q *= p) { | 
 
| 1265 | 0 | 0 | if (A < lo) A += q; | 
 
| 1266 | 0 | 0 | for (j = A-lo; j < n; j += q) { | 
 
| 1273 | 11 | 0 | if (A < lo) A += q; | 
 
| 1274 | 440 | 11 | for (j = A-lo; j < n; j += q) { | 
 
| 1279 | 10 | 1 | if (A < lo) A += q; | 
 
| 1280 | 1558 | 11 | for (j = A-lo; j < n; j += q) { | 
 
| 1281 | 824 | 734 | if (N[j] > 0) { | 
 
| 1289 | 1 | 0 | if (sievelim == sqrthi) { | 
 
| 1291 | 998 | 1 | for (j = 0; j < n; j++) { | 
 
| 1292 | 157 | 841 | if (N[j] == 1) | 
 
| 1294 | 450 | 391 | else if (N[j] > 0 && N[j] != j+lo) | 
 
|  | 298 | 152 | else if (N[j] > 0 && N[j] != j+lo) | 
 
| 1299 | 0 | 0 | for (j = 0; j < n; j++) { | 
 
| 1301 | 0 | 0 | if (N[j] > 0 && N[j] != rem) { | 
 
|  | 0 | 0 | if (N[j] > 0 && N[j] != rem) { | 
 
| 1302 | 0 | 0 | if (N[j] != 1) | 
 
| 1304 | 0 | 0 | if (square_free && is_perfect_square(rem)) { | 
 
|  | 0 | 0 | if (square_free && is_perfect_square(rem)) { | 
 
| 1322 | 1 | 4 | if (hi-lo+1 > 100) {        /* Sieve in chunks */ | 
 
| 1323 | 1 | 0 | if (square_free) ctx._noffset = (hi <= 42949672965UL) ? 10 : 15; | 
 
|  | 1 | 0 | if (square_free) ctx._noffset = (hi <= 42949672965UL) ? 10 : 15; | 
 
| 1324 | 0 | 0 | else             ctx._noffset = BITS_PER_WORD - clz(hi); | 
 
| 1326 | 0 | 1 | New(0, ctx._nfactors, _fr_chunk, UV); | 
 
| 1327 | 0 | 1 | New(0, ctx._farray, _fr_chunk * ctx._noffset, UV); | 
 
| 1330 | 0 | 1 | if (t >= _fr_sieve_crossover) t = icbrt(hi); | 
 
| 1334 | 1 | 3 | New(0, ctx.factors, square_free ? 15 : 63, UV); | 
 
| 1345 | 0 | 1207 | if (ctx->n >= ctx->hi) | 
 
| 1348 | 998 | 209 | if (ctx->_nfactors) { | 
 
| 1349 | 1 | 997 | if (ctx->_coffset >= _fr_chunk) { | 
 
| 1352 | 1 | 0 | if (chi > ctx->hi) chi = ctx->hi; | 
 
| 1360 | 99 | 110 | if (ctx->is_square_free && n >= 49 && (!(n% 4) || !(n% 9) || !(n%25) || !(n%49))) | 
 
|  | 52 | 47 | if (ctx->is_square_free && n >= 49 && (!(n% 4) || !(n% 9) || !(n%25) || !(n%49))) | 
 
|  | 39 | 13 | if (ctx->is_square_free && n >= 49 && (!(n% 4) || !(n% 9) || !(n%25) || !(n%49))) | 
 
|  | 34 | 5 | if (ctx->is_square_free && n >= 49 && (!(n% 4) || !(n% 9) || !(n%25) || !(n%49))) | 
 
|  | 32 | 2 | if (ctx->is_square_free && n >= 49 && (!(n% 4) || !(n% 9) || !(n%25) || !(n%49))) | 
 
|  | 2 | 30 | if (ctx->is_square_free && n >= 49 && (!(n% 4) || !(n% 9) || !(n%25) || !(n%49))) | 
 
| 1363 | 77 | 110 | if (ctx->is_square_free) { | 
 
| 1364 | 58 | 60 | for (j = 1; j < nfactors; j++) | 
 
| 1365 | 17 | 41 | if (ctx->factors[j] == ctx->factors[j-1]) | 
 
| 1367 | 17 | 60 | if (j < nfactors) return 0; | 
 
| 1374 | 0 | 0 | if (ctx->_farray != 0) Safefree(ctx->_farray); | 
 
| 1375 | 0 | 0 | if (ctx->_nfactors != 0) Safefree(ctx->_nfactors); | 
 
| 1386 | 0 | 23 | if (maxrounds > p) maxrounds = p; | 
 
| 1389 | 18 | 5 | if (p&1) { | 
 
| 1393 | 13930 | 0 | for (t = g, k = 1; k < maxrounds; k++) { | 
 
| 1394 | 18 | 13912 | if (t == a) | 
 
| 1396 | 0 | 13912 | t = mont_mulmod(t, g, p); | 
 
| 1397 | 0 | 13912 | if (t == g) break;   /* Stop at cycle */ | 
 
| 1402 | 9 | 0 | for (t = g, k = 1; k < maxrounds; k++) { | 
 
| 1403 | 4 | 5 | if (t == a) | 
 
| 1406 | 1 | 4 | if (t == g) break;   /* Stop at cycle */ | 
 
| 1449 | 0 | 4 | if (s->failed)  return 0; | 
 
| 1450 | 0 | 4 | if (s->round + rounds > n)  rounds = n - s->round; | 
 
| 1452 | 26785 | 2 | for (i = 1; i <= rounds; i++) { | 
 
| 1456 | 0 | 26785 | if (verbose > 3) printf( "%3"UVuf"  %4"UVuf" %3"UVuf" %3"UVuf"  %4"UVuf" %3"UVuf" %3"UVuf"\n", i, u, v, w, U, V, W ); | 
 
| 1457 | 2 | 26783 | if (u == U) { | 
 
| 1460 | 0 | 2 | if (r1 == 0) { | 
 
| 1461 | 0 | 0 | if (verbose) printf("DLP Rho failure, r=0\n"); | 
 
| 1471 | 0 | 2 | if (G > 1) { | 
 
| 1472 | 0 | 0 | if (powmod(g,k,p) == a) { | 
 
| 1473 | 0 | 0 | if (verbose > 2) printf("  common GCD %"UVuf"\n", G2); | 
 
| 1476 | 0 | 0 | for (m = 0; m < G; m++) { | 
 
| 1478 | 0 | 0 | if (powmod(g,k,p) == a) break; | 
 
| 1480 | 0 | 0 | if (m 2) printf("  GCD %"UVuf", found with m=%"UVuf"\n", G, m); | 
 
|  | 0 | 0 | if (m 2) printf("  GCD %"UVuf", found with m=%"UVuf"\n", G, m); | 
 
| 1484 | 0 | 2 | if (powmod(g,k,p) != a) { | 
 
| 1485 | 0 | 0 | if (verbose > 2) printf("r1 = %"UVuf"  r2 = %"UVuf" k = %"UVuf"\n", r1, r2, k); | 
 
| 1486 | 0 | 0 | if (verbose) printf("Incorrect DLP Rho solution: %"UVuf"\n", k); | 
 
| 1494 | 0 | 4 | if (verbose && k) printf("DLP Rho solution found after %"UVuf" steps\n", s->round + 1); | 
 
|  | 0 | 0 | if (verbose && k) printf("DLP Rho solution found after %"UVuf" steps\n", s->round + 1); | 
 
| 1539 | 4137 | 2 | if (top->nused == 0 || top->nused >= BSGS_ENTRIES_PER_PAGE) { | 
 
|  | 0 | 4137 | if (top->nused == 0 || top->nused >= BSGS_ENTRIES_PER_PAGE) { | 
 
| 1551 | 2 | 2 | while (head != 0) { | 
 
| 1565 | 0 | 2 | while (entry && entry->V != v) | 
 
|  | 0 | 0 | while (entry && entry->V != v) | 
 
| 1568 | 2 | 0 | if (!entry) { | 
 
| 1579 | 0 | 0 | while (entry && entry->V != v) | 
 
|  | 0 | 0 | while (entry && entry->V != v) | 
 
| 1581 | 0 | 0 | return (entry) ? entry->M : 0; | 
 
| 1589 | 123 | 4137 | while (entry && entry->V != v) | 
 
|  | 123 | 0 | while (entry && entry->V != v) | 
 
| 1592 | 0 | 4137 | if (entry) | 
 
| 1615 | 0 | 3 | if (n <= 2) return 0;   /* Shouldn't be here with gorder this low */ | 
 
| 1617 | 3 | 0 | if (race_rho) { | 
 
| 1619 | 1 | 2 | if (result) { | 
 
| 1620 | 0 | 1 | if (verbose) printf("rho found solution in BSGS step 0\n"); | 
 
| 1625 | 0 | 2 | if (a == 0) return 0;  /* We don't handle this case */ | 
 
| 1630 | 0 | 2 | hashmap_count = (m < 65537) ? 65537 : | 
 
| 1631 | 0 | 0 | (m > 40000000) ? 40000003 : | 
 
| 1639 | 0 | 2 | Newz(0, PAGES.table, hashmap_count, bsgs_hash_t*); | 
 
| 1651 | 2069 | 0 | for (i = 1; i <= m; i++) { | 
 
| 1653 | 0 | 2069 | if (gs_i) { bs_i = i; break; } | 
 
| 1655 | 1 | 2068 | if (S == aa) {  /* We discovered the solution! */ | 
 
| 1656 | 0 | 1 | if (verbose) printf("  dlp bsgs: solution at BS step %"UVuf"\n", i+1); | 
 
| 1661 | 0 | 2068 | if (bs_i) { gs_i = i; break; } | 
 
| 1663 | 2068 | 0 | if (race_rho && (i % 2048) == 0) { | 
 
|  | 1 | 2067 | if (race_rho && (i % 2048) == 0) { | 
 
| 1665 | 1 | 0 | if (result) { | 
 
| 1666 | 0 | 1 | if (verbose) printf("rho found solution in BSGS step %"UVuf"\n", i); | 
 
| 1672 | 0 | 2 | if (!result) { | 
 
| 1674 | 0 | 0 | if (!(gs_i || bs_i)) { | 
 
|  | 0 | 0 | if (!(gs_i || bs_i)) { | 
 
| 1676 | 0 | 0 | if (m < maxm && b > 8*m) b = 8*m; | 
 
|  | 0 | 0 | if (m < maxm && b > 8*m) b = 8*m; | 
 
| 1677 | 0 | 0 | for (i = m+1; i < b; i++) { | 
 
| 1679 | 0 | 0 | if (bs_i) { gs_i = i; break; } | 
 
| 1681 | 0 | 0 | if (race_rho && (i % 2048) == 0) { | 
 
|  | 0 | 0 | if (race_rho && (i % 2048) == 0) { | 
 
| 1683 | 0 | 0 | if (result) { | 
 
| 1684 | 0 | 0 | if (verbose) printf("rho found solution in BSGS step %"UVuf"\n", i); | 
 
| 1691 | 0 | 0 | if (gs_i || bs_i) { | 
 
|  | 0 | 0 | if (gs_i || bs_i) { | 
 
| 1695 | 0 | 2 | if (verbose) printf("  dlp bsgs using %d pages (%.1fMB+%.1fMB) for hash\n", PAGES.npages, ((double)PAGES.npages * sizeof(bsgs_page_t)) / (1024*1024), ((double)hashmap_count * sizeof(bsgs_hash_t*)) / (1024*1024)); | 
 
| 1699 | 2 | 0 | if (result != 0 && powmod(g,result,p) != a) { | 
 
|  | 0 | 2 | if (result != 0 && powmod(g,result,p) != a) { | 
 
| 1700 | 0 | 0 | if (verbose) printf("Incorrect DLP BSGS solution: %"UVuf"\n", result); | 
 
| 1703 | 2 | 0 | if (race_rho && result == 0) { | 
 
|  | 0 | 2 | if (race_rho && result == 0) { | 
 
| 1715 | 0 | 16 | if (a >= p) a %= p; | 
 
| 1716 | 0 | 16 | if (g >= p) g %= p; | 
 
| 1718 | 15 | 1 | if (a == 1 || g == 0 || p <= 2) | 
 
|  | 15 | 0 | if (a == 1 || g == 0 || p <= 2) | 
 
|  | 0 | 15 | if (a == 1 || g == 0 || p <= 2) | 
 
| 1721 | 0 | 15 | if (verbose > 1 && n != p-1) printf("  g=%"UVuf" p=%"UVuf", order %"UVuf"\n", g, p, n); | 
 
|  | 0 | 0 | if (verbose > 1 && n != p-1) printf("  g=%"UVuf" p=%"UVuf", order %"UVuf"\n", g, p, n); | 
 
| 1725 | 15 | 0 | if (n == 0 || n <= DLP_TRIAL_NUM) { | 
 
|  | 12 | 3 | if (n == 0 || n <= DLP_TRIAL_NUM) { | 
 
| 1727 | 0 | 12 | if (verbose) printf("  dlp trial 10k %s\n", (k!=0 || p <= DLP_TRIAL_NUM) ? "success" : "failure"); | 
 
|  | 0 | 0 | if (verbose) printf("  dlp trial 10k %s\n", (k!=0 || p <= DLP_TRIAL_NUM) ? "success" : "failure"); | 
 
|  | 0 | 0 | if (verbose) printf("  dlp trial 10k %s\n", (k!=0 || p <= DLP_TRIAL_NUM) ? "success" : "failure"); | 
 
| 1728 | 0 | 12 | if (k != 0 || (n > 0 && n <= DLP_TRIAL_NUM)) return k; | 
 
|  | 0 | 0 | if (k != 0 || (n > 0 && n <= DLP_TRIAL_NUM)) return k; | 
 
|  | 0 | 0 | if (k != 0 || (n > 0 && n <= DLP_TRIAL_NUM)) return k; | 
 
| 1733 | 3 | 0 | if (gorder != 0 && powmod(a, gorder, p) != 1) return 0; | 
 
|  | 0 | 3 | if (gorder != 0 && powmod(a, gorder, p) != 1) return 0; | 
 
| 1735 | 0 | 3 | if (aorder == 0 && gorder != 0) return 0; | 
 
|  | 0 | 0 | if (aorder == 0 && gorder != 0) return 0; | 
 
| 1736 | 3 | 0 | if (aorder != 0 && gorder % aorder != 0) return 0; | 
 
|  | 0 | 3 | if (aorder != 0 && gorder % aorder != 0) return 0; | 
 
| 1739 | 3 | 0 | sqrtn = (n == 0) ? 0 : isqrt(n); | 
 
| 1740 | 0 | 3 | if (n == 0) n = p-1; | 
 
| 1743 | 3 | 0 | UV maxent = (sqrtn > 0) ? sqrtn+1 : 100000; | 
 
| 1745 | 0 | 3 | if (verbose) printf("  dlp bsgs %"UVuf"k %s\n", maxent/1000, k!=0 ? "success" : "failure"); | 
 
|  | 0 | 0 | if (verbose) printf("  dlp bsgs %"UVuf"k %s\n", maxent/1000, k!=0 ? "success" : "failure"); | 
 
| 1746 | 3 | 0 | if (k != 0) return k; | 
 
| 1747 | 0 | 0 | if (sqrtn > 0 && sqrtn < maxent) return 0; | 
 
|  | 0 | 0 | if (sqrtn > 0 && sqrtn < maxent) return 0; | 
 
| 1750 | 0 | 0 | if (verbose) printf("  dlp doing exhaustive trial\n"); | 
 
| 1762 | 0 | 5 | if (p1 == 0) return 0;   /* TODO: Should we plow on with p1=p-1? */ | 
 
| 1764 | 0 | 5 | if (nfactors == 1) | 
 
| 1766 | 16 | 5 | for (i = 0; i < nfactors; i++) { | 
 
| 1768 | 1 | 16 | pi = fac[i];   for (j = 1; j < exp[i]; j++)  pi *= fac[i]; | 
 
| 1776 | 5 | 0 | if (i == 1 && powmod(g, x, p) == a) | 
 
|  | 5 | 0 | if (i == 1 && powmod(g, x, p) == a) | 
 
| 1786 | 0 | 20 | if (a >= p) a %= p; | 
 
| 1787 | 0 | 20 | if (g >= p) g %= p; | 
 
| 1789 | 18 | 2 | if (a == 1 || g == 0 || p <= 2) | 
 
|  | 18 | 0 | if (a == 1 || g == 0 || p <= 2) | 
 
|  | 0 | 18 | if (a == 1 || g == 0 || p <= 2) | 
 
| 1796 | 15 | 3 | if (gorder != 0 && powmod(a, gorder, p) != 1) return 0; | 
 
|  | 2 | 13 | if (gorder != 0 && powmod(a, gorder, p) != 1) return 0; | 
 
| 1798 | 3 | 13 | if (aorder == 0 && gorder != 0) return 0; | 
 
|  | 0 | 3 | if (aorder == 0 && gorder != 0) return 0; | 
 
| 1799 | 13 | 3 | if (aorder != 0 && gorder % aorder != 0) return 0; | 
 
|  | 0 | 13 | if (aorder != 0 && gorder % aorder != 0) return 0; | 
 
| 1802 | 15 | 1 | if (a == 0 || p < DLP_TRIAL_NUM || (gorder > 0 && gorder < DLP_TRIAL_NUM)) { | 
 
|  | 5 | 10 | if (a == 0 || p < DLP_TRIAL_NUM || (gorder > 0 && gorder < DLP_TRIAL_NUM)) { | 
 
|  | 5 | 0 | if (a == 0 || p < DLP_TRIAL_NUM || (gorder > 0 && gorder < DLP_TRIAL_NUM)) { | 
 
|  | 0 | 5 | if (a == 0 || p < DLP_TRIAL_NUM || (gorder > 0 && gorder < DLP_TRIAL_NUM)) { | 
 
| 1803 | 0 | 11 | if (verbose > 1) printf("  dlp trial znlog(%"UVuf",%"UVuf",%"UVuf")\n",a,g,p); | 
 
| 1808 | 5 | 0 | if (!is_prob_prime(gorder)) { | 
 
| 1810 | 0 | 5 | if (verbose) printf("  dlp PH %s\n", k!=0 ? "success" : "failure"); | 
 
|  | 0 | 0 | if (verbose) printf("  dlp PH %s\n", k!=0 ? "success" : "failure"); | 
 
| 1811 | 5 | 0 | if (k != 0) return k; |