Branch Coverage

factor.c
Criterion Covered Total %
branch 483 930 51.9


line true false branch
61 34001 151 if (n > 1) {
62 14603 34001 while ( (n & 1) == 0 ) { factors[nfactors++] = 2; n /= 2; }
63 10405 34001 while ( (n % 3) == 0 ) { factors[nfactors++] = 3; n /= 3; }
64 5936 34001 while ( (n % 5) == 0 ) { factors[nfactors++] = 5; n /= 5; }
67 27135 7017 if (f*f <= n) {
71 26909 226 if (n <= 4294967295U) {
73 240583 222 while (sp < lastsp) {
74 13320 240583 while ( (un%f) == 0 ) {
79 26687 213896 if (f*f > un) break;
83 17138 214 while (sp < lastsp) {
84 250 17138 while ( (n%f) == 0 ) {
89 12 17126 if (f*f > n) break;
93 26761 374 if (n < 2011*2011 && f*f <= n) { /* Trial division from 431 to 2003 */
62 26699 if (n < 2011*2011 && f*f <= n) { /* Trial division from 431 to 2003 */
95 5698 0 while (sp < NPRIMES_SMALL) {
96 21 5698 while ( (un%f) == 0 ) {
101 62 5636 if (f*f > un) break;
106 33778 374 if (f*f > n) {
107 29851 3927 if (n != 1) factors[nfactors++] = n;
112 112 262 if (n < 100000000 && n < f*f*f) {
108 4 if (n < 100000000 && n < f*f*f) {
113 54 54 if (MR32(n)) factors[nfactors++] = n;
124 5 261 if (k > 1) {
127 12 5 for (i = nfactors; i >= 0; i--)
128 26 12 for (j = 0; j < k; j++)
141 480 249 while ( (n >= f*f) && (!is_def_prime(n)) ) {
130 350 while ( (n >= f*f) && (!is_def_prime(n)) ) {
40 90 while ( (n >= f*f) && (!is_def_prime(n)) ) {
194 156 while ( (n >= f*f) && (!is_def_prime(n)) ) {
144 234 0 UV const nbits = BITS_PER_WORD - clz(n);
146 99 135 UV const br_rounds = 8000 + (9000 * ((nbits <= 45) ? 0 : (nbits-45)));
160 234 0 if (!split_success && nbits <= 30) { /* This should always succeed */
37 197 if (!split_success && nbits <= 30) { /* This should always succeed */
162 0 37 if (verbose) printf("holf %d\n", split_success);
166 197 37 if (!split_success && br_rounds > 0) {
197 0 if (!split_success && br_rounds > 0) {
168 0 197 if (verbose) printf("pbrent %d\n", split_success);
171 0 234 if (!split_success) {
173 0 0 if (verbose) printf("second pbrent %d\n", split_success);
183 0 234 if (!split_success && nbits <= 62) {
0 0 if (!split_success && nbits <= 62) {
185 0 0 if (verbose) printf("squfof %d\n", split_success);
188 0 234 if (!split_success) {
190 0 0 if (verbose) printf("pminus1 %d\n", split_success);
192 0 0 if (!split_success) {
194 0 0 if (verbose) printf("long prho %d\n", split_success);
195 0 0 if (!split_success) {
197 0 0 if (verbose) printf("long pbrent %d\n", split_success);
202 234 0 if (split_success) {
203 0 234 MPUassert( split_success == 1, "split factor returned more than 2 factors");
205 234 0 if ((tofac_stack[ntofac] == n) || (tofac_stack[ntofac] == 1))
0 234 if ((tofac_stack[ntofac] == n) || (tofac_stack[ntofac] == 1))
212 0 0 if (verbose) printf("doing trial on %"UVuf"\n", n);
213 0 0 while (f <= limit) {
214 0 0 if ( (n%f) == 0 ) {
218 0 0 } while ( (n%f) == 0 );
228 495 0 if (n != 1) factors[nfactors++] = n;
230 234 261 if (ntofac > 0) n = tofac_stack[ntofac-1];
231 234 261 } while (ntofac-- > 0);
234 234 261 for (i = nsmallfactors+1; i < nfactors; i++) {
236 462 56 for (j = i; j > 0 && factors[j-1] > fi; j--)
284 178 for (j = i; j > 0 && factors[j-1] > fi; j--)
249 12 12695 if (n == 1) return 0;
252 39 12656 if (exponents == 0) {
253 92 39 for (; i < nfactors; i++)
254 62 30 if (factors[i] != factors[i-1])
258 16583 12656 for (; i < nfactors; i++) {
259 13080 3503 if (factors[i] != factors[i-1]) {
275 0 1619 if (f < 2) f = 2;
276 1616 3 if (last == 0 || last*last > n) last = UV_MAX;
1010 606 if (last == 0 || last*last > n) last = UV_MAX;
278 1611 8 if (n < 4 || last < f) {
0 1611 if (n < 4 || last < f) {
285 1611 0 if (f < primes_small[NPRIMES_SMALL-1]) {
286 1621 1611 while ( (n & 1) == 0 ) { factors[nfactors++] = 2; n >>= 1; }
287 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; }
288 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; }
289 5598 3 for (sp = 4; sp < (int)NPRIMES_SMALL; sp++) {
291 4560 1038 if (f*f > n || f > last) break;
3990 570 if (f*f > n || f > last) break;
292 384 3990 while ( (n%f) == 0 ) {
299 573 1038 if (f*f <= n && f <= last) {
3 570 if (f*f <= n && f <= last) {
301 2 1 if (limit > last) limit = last;
303 7903 3 while (f <= limit) {
304 2 7901 if ( (n%f) == 0 ) {
308 0 2 } while ( (n%f) == 0 );
310 2 0 if (newlimit < limit) limit = newlimit;
317 1485 126 if (n != 1)
327 9080 3862 for (s = 0; s < nfactors; s++) {
329 12195 9080 for (j = 0; j < e; j++) {
331 28960 12195 for (i = 0; i < scount; i++)
338 53930 5021 { const UV *x = a, *y = b; return (*x > *y) ? 1 : (*x < *y) ? -1 : 0; }
53930 0 { const UV *x = a, *y = b; return (*x > *y) ? 1 : (*x < *y) ? -1 : 0; }
347 4 3862 if (n <= 1) {
349 1 3 if (n == 0) { divs[0] = 0; divs[1] = 1; *num_divisors = 2; }
350 3 1 if (n == 1) { divs[0] = 1; *num_divisors = 1; }
357 5218 3862 for (i = 1; i < nfactors; i++)
359 0 3862 New(0, divs, ndivisors, UV);
388 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;
389 287 1218 if (n <= 1) /* n=0 divisors are [0,1] */
390 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] */
392 974 244 if (k == 0) {
393 1365 974 for (i = 0; i < nfac; i++) {
395 832 974 while (i+1 < nfac && f == factors[i+1]) { e++; i++; }
441 391 while (i+1 < nfac && f == factors[i+1]) { e++; i++; }
398 157 87 } else if (k == 1) {
399 270 157 for (i = 0; i < nfac; i++) {
402 215 157 while (i+1 < nfac && f == factors[i+1]) {
102 113 while (i+1 < nfac && f == factors[i+1]) {
410 135 87 for (i = 0; i < nfac; i++) {
413 193 135 for (j = 1; j < (int)k; j++) pk *= f;
416 101 87 while (i+1 < nfac && f == factors[i+1]) {
53 48 while (i+1 < nfac && f == factors[i+1]) {
434 303 0 if (f == 1 || f2 == 1) {
0 303 if (f == 1 || f2 == 1) {
440 0 303 MPUassert( factors[0] * factors[1] == n , "incorrect factoring");
450 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");
456 8 2 while (r != 0) {
457 0 8 if (rounds-- == 0) { factors[0] = n; return 1; }
463 18 8 } while (r > 0);
474 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");
478 0 2 if (is_perfect_square(n))
481 2 0 if (n <= (UV_MAX >> 6)) { /* Try with premultiplier first */
482 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 :
500 3 0 while (rounds--) {
504 2 1 if (!((f*0x8bc40d7d) & (f*0xa1e2f5d1) & 0x14020a)) {
506 2 0 if (m == f*f) {
508 2 0 if (f > 1 && f < n)
2 0 if (f > 1 && f < n)
512 0 1 if (ni >= (ni+npre)) break;
518 0 0 for (i = 1; i <= rounds; i++) {
524 0 0 if (is_perfect_square(m)) {
526 0 0 f = gcd_ui( (s>f) ? s-f : f-s, n);
538 0 91 if (n < 3) { factors[0] = n; return 1; }
539 0 91 if (!(n&1)) { factors[0] = 2; factors[1] = n/2; return 2; }
540 1 90 if (is_perfect_square(n)) { factors[0] = factors[1] = isqrt(n); return 2; }
543 2729 0 while (rounds--) {
547 2101 628 if (!((f*0x8bc40d7d) & (f*0xa1e2f5d1) & 0x14020a)) {
549 90 2011 if (m == f*f) {
551 90 0 if (f > 1 && f < n)
90 0 if (f > 1 && f < n)
555 0 2639 if (ni >= (ni+npre)) break; /* We've overflowed */
568 201 0 UV const nbits = BITS_PER_WORD - clz(n);
569 196 5 const UV inner = (nbits <= 31) ? 32 : (nbits <= 35) ? 64 : (nbits <= 40) ? 160 : (nbits <= 52) ? 256 : 320;
185 11 const UV inner = (nbits <= 31) ? 32 : (nbits <= 35) ? 64 : (nbits <= 40) ? 160 : (nbits <= 52) ? 256 : 320;
166 19 const UV inner = (nbits <= 31) ? 32 : (nbits <= 35) ? 64 : (nbits <= 40) ? 160 : (nbits <= 52) ? 256 : 320;
106 60 const UV inner = (nbits <= 31) ? 32 : (nbits <= 35) ? 64 : (nbits <= 40) ? 160 : (nbits <= 52) ? 256 : 320;
574 201 0 MPUassert( (n >= 3) && ((n%2) != 0) , "bad n in pbrent_factor");
0 201 MPUassert( (n >= 3) && ((n%2) != 0) , "bad n in pbrent_factor");
579 1516 0 while (rounds > 0) {
583 2385 1315 while (rleft > 0) {
588 2031 354 if (n < (1ULL << 63)) {
590 1021 1010 m = ABSDIFF(Xi,Xm);
591 227523 2031 while (--irounds > 0) {
593 100959 126564 f = ABSDIFF(Xi,Xm);
596 354 0 } else if (a == mont1) {
598 201 153 m = ABSDIFF(Xi,Xm);
599 103835 354 while (--irounds > 0) {
601 59454 44381 f = ABSDIFF(Xi,Xm);
606 0 0 m = ABSDIFF(Xi,Xm);
607 0 0 while (--irounds > 0) {
609 0 0 f = ABSDIFF(Xi,Xm);
614 201 2184 if (f != 1)
618 1315 201 if (f == 1) {
622 0 201 if (f == n) { /* back up, with safety */
625 0 0 if (n < (1ULL << 63) || a == mont1)
0 0 if (n < (1ULL << 63) || a == mont1)
626 0 0 Xi = mont_mulmod(Xi,Xi+a,n);
628 0 0 Xi = addmod(mont_mulmod(Xi,Xi,n),a,n);
629 0 0 m = ABSDIFF(Xi,Xm);
631 0 0 } while (f == 1 && r-- != 0);
0 0 } while (f == 1 && r-- != 0);
633 201 0 if (f == 0 || f == n) {
0 201 if (f == 0 || f == n) {
634 0 0 if (fails-- <= 0) break;
711 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");
724 2 0 while (rounds-- > 0) {
726 128 2 for (i = 0; i < inner; i++) {
730 59 69 f = (U > V) ? U-V : V-U;
734 0 2 if (f == 1)
736 2 0 if (f == n) { /* back up to find a factor*/
743 3 3 f = gcd_ui( (U > V) ? U-V : V-U, n);
744 4 2 } while (f == 1 && i-- != 0);
4 0 } while (f == 1 && i-- != 0);
746 2 0 if (f == 0 || f == n) {
0 2 if (f == 0 || f == n) {
747 0 0 if (fails-- <= 0) break;
776 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");
778 0 2 if (B1 <= primes_small[NPRIMES_SMALL-2]) {
780 0 0 for (i = 1; primes_small[i] <= B1; i++) {
782 0 0 if (q <= sqrtB1) {
784 0 0 while (k <= kmin) k *= q;
787 0 0 if ( (j++ % 32) == 0) {
788 0 0 PMINUS1_RECOVER_A;
789 0 0 if (a == 0 || gcd_ui(a-1, n) != 1)
0 0 if (a == 0 || gcd_ui(a-1, n) != 1)
794 0 0 PMINUS1_RECOVER_A;
796 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) {
798 64 0 if (q <= sqrtB1) {
800 136 64 while (k <= kmin) k *= q;
803 2 62 if ( (j++ % 32) == 0) {
804 0 2 PMINUS1_RECOVER_A;
805 2 0 if (a == 0 || gcd_ui(a-1, n) != 1)
0 2 if (a == 0 || gcd_ui(a-1, n) != 1)
810 0 2 PMINUS1_RECOVER_A;
812 0 2 if (a == 0) { factors[0] = n; return 1; }
816 2 0 if (f == n) {
818 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) {
820 58 4 while (k <= kmin) k *= p;
824 2 2 if (f != 1)
839 0 2 if (f == 1 && B2 > B1) {
0 0 if (f == 1 && B2 > B1) {
848 0 0 for (j = 1; j < 20; j++) {
856 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 ) {
862 0 0 if (qdiff >= 111) {
866 0 0 if (bmdiff == 0) {
867 0 0 if (precomp_bm[qdiff-1] != 0)
875 0 0 if (a == 0) break;
877 0 0 if ( (j++ % 64) == 0 ) {
879 0 0 if (f != 1)
894 6 0 UV bit = UVCONST(1) << (clz(exp)-1);
895 339 6 while (bit) {
897 15 324 if ( exp & bit ) {
912 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");
917 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) {
919 4 0 if (p < sqrtB1) {
921 17 4 while (k <= kmin)
925 4 0 if (X1 != 2) {
927 2 2 if (f != 1 && f != n) break;
2 0 if (f != 1 && f != n) break;
930 0 2 if (X2 != 2) {
932 0 0 if (f != 1 && f != n) break;
0 0 if (f != 1 && f != n) break;
987 0 3 if (i & 0x1) {
993 0 4 if (i >= imax) {
1007 3 1 if (!((t2*0x8bc40d7d) & (t2*0xa1e2f5d1) & 0x14020a)) {
1009 3 0 if (Qn == t1*t1)
1036 2 1 SYMMETRY_POINT_ITERATION;
1037 1 0 SYMMETRY_POINT_ITERATION;
1038 0 0 SYMMETRY_POINT_ITERATION;
1039 0 0 SYMMETRY_POINT_ITERATION;
1040 0 0 if (j++ > 2000000) {
1047 3 0 if (t1 > 1)
1074 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");
1077 0 2 if (n > SQUFOF_MAX) {
1081 76 2 for (i = 0; i < NSQUFOF_MULT; i++) {
1087 2 0 while (mults_racing > 0 && rounds_done < rounds) {
2 0 while (mults_racing > 0 && rounds_done < rounds) {
1088 3 0 for (i = 0; i < NSQUFOF_MULT && rounds_done < rounds; i++) {
3 0 for (i = 0; i < NSQUFOF_MULT && rounds_done < rounds; i++) {
1089 0 3 if (mult_save[i].valid == 0) continue;
1092 3 0 if (mult_save[i].valid == -1) {
1093 0 3 if ((SQUFOF_MAX / mult) < n) {
1104 0 3 if (mult_save[i].Qn == 0)
1110 3 0 if (mult_save[i].imax < 20) mult_save[i].imax = 20;
1111 0 3 if (mult_save[i].imax > rounds) mult_save[i].imax = rounds;
1113 0 3 if (mults_racing == 1) /* Do all rounds if only one multiplier left */
1116 3 0 if (f64 > 1) {
1118 2 1 if (f64red > 1) {
1127 1 0 if (mult_save[i].valid == 0)
1143 0 0 for (i = 0; i < SQR_TAB_SIZE; i++)
1151 0 0 const double Tune = ((n >> 31) >> 5) ? 3.5 : 5.0;
1156 0 0 if (!(n&1)) return found_factor(n, 2, factors);
1160 0 0 if (do_trial) {
1162 0 0 if (FirstCut < 84) FirstCut = 84;
1163 0 0 if (FirstCut > 65535) FirstCut = 65535;
1164 0 0 for (ip = 2; ip < NPRIMES_SMALL; ip++) {
1166 0 0 if (p >= FirstCut)
1168 0 0 if (n % p == 0)
1173 0 0 if (n >= UVCONST(8796393022207)) { factors[0] = n; return 1; }
1178 0 0 if (!sqr_tab_init) make_sqr_tab();
1181 0 0 for (k = 1; k <= Bred; k++) {
1182 0 0 if (k&1) { inc = 4; r = (k+n) % 4; }
1185 0 0 if (kN >= UVCONST(1152921504606846976)) { factors[0] = n; return 1; }
1188 0 0 x = (k < SQR_TAB_SIZE) ? sqrtn * sqr_tab[k] : sqrt((double)kN);
1190 0 0 if ((UV)a * (UV)a == kN)
1198 0 0 for (a = b; a <= U; c += inc*(a+a+inc), a += inc) {
1201 0 0 if (!((b*0x8bc40d7d) & (b*0xa1e2f5d1) & 0x14020a)) {
1203 0 0 if (c == b*b) {
1210 0 0 if (do_trial) {
1211 0 0 if (B > 65535) B = 65535;
1217 0 0 if (ip >= NPRIMES_SMALL) ip = NPRIMES_SMALL-1;
1226 0 23 if (maxrounds > p) maxrounds = p;
1229 18 5 if (p&1) {
1233 13930 0 for (t = g, k = 1; k < maxrounds; k++) {
1234 18 13912 if (t == a)
1236 0 13912 t = mont_mulmod(t, g, p);
1237 0 13912 if (t == g) break; /* Stop at cycle */
1242 9 0 for (t = g, k = 1; k < maxrounds; k++) {
1243 4 5 if (t == a)
1246 1 4 if (t == g) break; /* Stop at cycle */
1289 0 4 if (s->failed) return 0;
1290 0 4 if (s->round + rounds > n) rounds = n - s->round;
1292 26785 2 for (i = 1; i <= rounds; i++) {
1296 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 );
1297 2 26783 if (u == U) {
1300 0 2 if (r1 == 0) {
1301 0 0 if (verbose) printf("DLP Rho failure, r=0\n");
1311 0 2 if (G > 1) {
1312 0 0 if (powmod(g,k,p) == a) {
1313 0 0 if (verbose > 2) printf(" common GCD %"UVuf"\n", G2);
1316 0 0 for (m = 0; m < G; m++) {
1318 0 0 if (powmod(g,k,p) == a) break;
1320 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);
1324 0 2 if (powmod(g,k,p) != a) {
1325 0 0 if (verbose > 2) printf("r1 = %"UVuf" r2 = %"UVuf" k = %"UVuf"\n", r1, r2, k);
1326 0 0 if (verbose) printf("Incorrect DLP Rho solution: %"UVuf"\n", k);
1334 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);
1379 4137 2 if (top->nused == 0 || top->nused >= BSGS_ENTRIES_PER_PAGE) {
0 4137 if (top->nused == 0 || top->nused >= BSGS_ENTRIES_PER_PAGE) {
1391 2 2 while (head != 0) {
1405 0 2 while (entry && entry->V != v)
0 0 while (entry && entry->V != v)
1408 2 0 if (!entry) {
1419 0 0 while (entry && entry->V != v)
0 0 while (entry && entry->V != v)
1421 0 0 return (entry) ? entry->M : 0;
1429 123 4137 while (entry && entry->V != v)
123 0 while (entry && entry->V != v)
1432 0 4137 if (entry)
1455 0 3 if (n <= 2) return 0; /* Shouldn't be here with gorder this low */
1457 3 0 if (race_rho) {
1459 1 2 if (result) {
1460 0 1 if (verbose) printf("rho found solution in BSGS step 0\n");
1465 0 2 if (a == 0) return 0; /* We don't handle this case */
1470 0 2 hashmap_count = (m < 65537) ? 65537 :
1471 0 0 (m > 40000000) ? 40000003 :
1479 0 2 Newz(0, PAGES.table, hashmap_count, bsgs_hash_t*);
1491 2069 0 for (i = 1; i <= m; i++) {
1493 0 2069 if (gs_i) { bs_i = i; break; }
1495 1 2068 if (S == aa) { /* We discovered the solution! */
1496 0 1 if (verbose) printf(" dlp bsgs: solution at BS step %"UVuf"\n", i+1);
1501 0 2068 if (bs_i) { gs_i = i; break; }
1503 2068 0 if (race_rho && (i % 2048) == 0) {
1 2067 if (race_rho && (i % 2048) == 0) {
1505 1 0 if (result) {
1506 0 1 if (verbose) printf("rho found solution in BSGS step %"UVuf"\n", i);
1512 0 2 if (!result) {
1514 0 0 if (!(gs_i || bs_i)) {
0 0 if (!(gs_i || bs_i)) {
1516 0 0 if (m < maxm && b > 8*m) b = 8*m;
0 0 if (m < maxm && b > 8*m) b = 8*m;
1517 0 0 for (i = m+1; i < b; i++) {
1519 0 0 if (bs_i) { gs_i = i; break; }
1521 0 0 if (race_rho && (i % 2048) == 0) {
0 0 if (race_rho && (i % 2048) == 0) {
1523 0 0 if (result) {
1524 0 0 if (verbose) printf("rho found solution in BSGS step %"UVuf"\n", i);
1531 0 0 if (gs_i || bs_i) {
0 0 if (gs_i || bs_i) {
1535 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));
1539 2 0 if (result != 0 && powmod(g,result,p) != a) {
0 2 if (result != 0 && powmod(g,result,p) != a) {
1540 0 0 if (verbose) printf("Incorrect DLP BSGS solution: %"UVuf"\n", result);
1543 2 0 if (race_rho && result == 0) {
0 2 if (race_rho && result == 0) {
1555 0 16 if (a >= p) a %= p;
1556 0 16 if (g >= p) g %= p;
1558 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)
1561 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);
1565 15 0 if (n == 0 || n <= DLP_TRIAL_NUM) {
12 3 if (n == 0 || n <= DLP_TRIAL_NUM) {
1567 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");
1568 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;
1573 3 0 if (gorder != 0 && powmod(a, gorder, p) != 1) return 0;
0 3 if (gorder != 0 && powmod(a, gorder, p) != 1) return 0;
1575 0 3 if (aorder == 0 && gorder != 0) return 0;
0 0 if (aorder == 0 && gorder != 0) return 0;
1576 3 0 if (aorder != 0 && gorder % aorder != 0) return 0;
0 3 if (aorder != 0 && gorder % aorder != 0) return 0;
1579 3 0 sqrtn = (n == 0) ? 0 : isqrt(n);
1580 0 3 if (n == 0) n = p-1;
1583 3 0 UV maxent = (sqrtn > 0) ? sqrtn+1 : 100000;
1585 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");
1586 3 0 if (k != 0) return k;
1587 0 0 if (sqrtn > 0 && sqrtn < maxent) return 0;
0 0 if (sqrtn > 0 && sqrtn < maxent) return 0;
1590 0 0 if (verbose) printf(" dlp doing exhaustive trial\n");
1602 0 5 if (p1 == 0) return 0; /* TODO: Should we plow on with p1=p-1? */
1604 0 5 if (nfactors == 1)
1606 16 5 for (i = 0; i < nfactors; i++) {
1608 1 16 pi = fac[i]; for (j = 1; j < exp[i]; j++) pi *= fac[i];
1616 5 0 if (i == 1 && powmod(g, x, p) == a)
5 0 if (i == 1 && powmod(g, x, p) == a)
1626 0 20 if (a >= p) a %= p;
1627 0 20 if (g >= p) g %= p;
1629 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)
1636 15 3 if (gorder != 0 && powmod(a, gorder, p) != 1) return 0;
2 13 if (gorder != 0 && powmod(a, gorder, p) != 1) return 0;
1638 3 13 if (aorder == 0 && gorder != 0) return 0;
0 3 if (aorder == 0 && gorder != 0) return 0;
1639 13 3 if (aorder != 0 && gorder % aorder != 0) return 0;
0 13 if (aorder != 0 && gorder % aorder != 0) return 0;
1642 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)) {
1643 0 11 if (verbose > 1) printf(" dlp trial znlog(%"UVuf",%"UVuf",%"UVuf")\n",a,g,p);
1648 5 0 if (!is_prob_prime(gorder)) {
1650 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");
1651 5 0 if (k != 0) return k;