Skip to content

Commit 49d57d4

Browse files
committed
coul: use iterator instead of next_prime()
This makes 'pcoul -f7 -g3 12 9' about 10% faster.
1 parent de7c0a6 commit 49d57d4

File tree

1 file changed

+17
-4
lines changed

1 file changed

+17
-4
lines changed

coul.c

Lines changed: 17 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,7 @@
2828
#include "gmp_main.h"
2929
#include "utility.h"
3030
#include "primality.h"
31+
#include "prime_iterator.h"
3132

3233
/* primary parameters - we are searching for D(n, k), the least d such
3334
* that tau(d + i) = n for all 0 <= i < k.
@@ -127,6 +128,7 @@ typedef struct s_level {
127128
uint level; /* index of this entry */
128129
bool is_forced;
129130
uint vi; /* allocation of p^x into v_i */
131+
prime_iterator piter;
130132
ulong p;
131133
uint x;
132134
uint have_square; /* number of v_i residues forced square so far */
@@ -146,6 +148,11 @@ typedef struct s_level {
146148
t_level *levels = NULL;
147149
uint level = 0;
148150

151+
static inline void level_setp(t_level *lp, ulong p) {
152+
lp->p = p;
153+
prime_iterator_setprime(&lp->piter, p);
154+
}
155+
149156
/* Each value v_0 to v_{k-1} has had 'level' allocations of prime powers
150157
* p_i^{x_i-1}; q tracks the product of those prime powers, and t tracks
151158
* our target tau - starting at n, and divided by x_i on each allocation.
@@ -389,6 +396,7 @@ void free_levels(void) {
389396
t_level *l = &levels[i];
390397
mpz_clear(l->aq);
391398
mpz_clear(l->rq);
399+
prime_iterator_destroy(&l->piter);
392400
}
393401
free(levels);
394402
}
@@ -401,6 +409,10 @@ void init_levels(void) {
401409
l->level = i;
402410
mpz_init(l->aq);
403411
mpz_init(l->rq);
412+
#if 0
413+
/* not needed, prime_iterator_setprime() later will initialize */
414+
prime_iterator_init(&l->piter);
415+
#endif
404416
}
405417
mpz_set_ui(levels[0].aq, 1);
406418
mpz_set_ui(levels[0].rq, 0);
@@ -2387,13 +2399,13 @@ e_pux prep_unforced_x(t_level *prev, t_level *cur, ulong p) {
23872399
if (prev->have_square)
23882400
walk_v(prev, Z(zero));
23892401
else if (level > 1 && !prev->is_forced)
2390-
prev->p = prev->limp;
2402+
level_setp(prev, prev->limp);
23912403
#else
23922404
walk_v(prev, Z(zero));
23932405
#endif
23942406
return PUX_ALL_DONE;
23952407
}
2396-
cur->p = p;
2408+
level_setp(cur, p);
23972409
cur->x = x;
23982410
cur->limp = limp;
23992411
cur->max_at = seen_best;
@@ -2521,6 +2533,7 @@ void insert_stack(void) {
25212533
goto insert_check;
25222534
}
25232535

2536+
level_setp(cur, p);
25242537
/* CHECKME: this returns 0 if t=1 */
25252538
if (!apply_single(prev, cur, vi, p, x))
25262539
fail("could not apply_single(%u, %lu, %u)", vi, p, x);
@@ -2586,7 +2599,7 @@ void recurse(void) {
25862599
if (prev_level->have_square)
25872600
walk_v(prev_level, Z(zero));
25882601
else if (level > 1 && !prev_level->is_forced)
2589-
prev_level->p = prev_level->limp;
2602+
level_setp(prev_level, prev_level->limp);
25902603
#else
25912604
walk_v(prev_level, Z(zero));
25922605
#endif
@@ -2684,7 +2697,7 @@ void recurse(void) {
26842697
}
26852698
/* note: only valid to use from just below here */
26862699
redo_unforced:
2687-
p = next_prime(p);
2700+
p = prime_iterator_next(&cur_level->piter);
26882701
if (p > cur_level->limp)
26892702
goto continue_unforced_x;
26902703
if (p <= prev_level->maxp)

0 commit comments

Comments
 (0)