28
28
#include "gmp_main.h"
29
29
#include "utility.h"
30
30
#include "primality.h"
31
+ #include "prime_iterator.h"
31
32
32
33
/* primary parameters - we are searching for D(n, k), the least d such
33
34
* that tau(d + i) = n for all 0 <= i < k.
@@ -127,6 +128,7 @@ typedef struct s_level {
127
128
uint level ; /* index of this entry */
128
129
bool is_forced ;
129
130
uint vi ; /* allocation of p^x into v_i */
131
+ prime_iterator piter ;
130
132
ulong p ;
131
133
uint x ;
132
134
uint have_square ; /* number of v_i residues forced square so far */
@@ -146,6 +148,11 @@ typedef struct s_level {
146
148
t_level * levels = NULL ;
147
149
uint level = 0 ;
148
150
151
+ static inline void level_setp (t_level * lp , ulong p ) {
152
+ lp -> p = p ;
153
+ prime_iterator_setprime (& lp -> piter , p );
154
+ }
155
+
149
156
/* Each value v_0 to v_{k-1} has had 'level' allocations of prime powers
150
157
* p_i^{x_i-1}; q tracks the product of those prime powers, and t tracks
151
158
* our target tau - starting at n, and divided by x_i on each allocation.
@@ -389,6 +396,7 @@ void free_levels(void) {
389
396
t_level * l = & levels [i ];
390
397
mpz_clear (l -> aq );
391
398
mpz_clear (l -> rq );
399
+ prime_iterator_destroy (& l -> piter );
392
400
}
393
401
free (levels );
394
402
}
@@ -401,6 +409,10 @@ void init_levels(void) {
401
409
l -> level = i ;
402
410
mpz_init (l -> aq );
403
411
mpz_init (l -> rq );
412
+ #if 0
413
+ /* not needed, prime_iterator_setprime() later will initialize */
414
+ prime_iterator_init (& l -> piter );
415
+ #endif
404
416
}
405
417
mpz_set_ui (levels [0 ].aq , 1 );
406
418
mpz_set_ui (levels [0 ].rq , 0 );
@@ -2387,13 +2399,13 @@ e_pux prep_unforced_x(t_level *prev, t_level *cur, ulong p) {
2387
2399
if (prev -> have_square )
2388
2400
walk_v (prev , Z (zero ));
2389
2401
else if (level > 1 && !prev -> is_forced )
2390
- prev -> p = prev -> limp ;
2402
+ level_setp ( prev , prev -> limp ) ;
2391
2403
#else
2392
2404
walk_v (prev , Z (zero ));
2393
2405
#endif
2394
2406
return PUX_ALL_DONE ;
2395
2407
}
2396
- cur -> p = p ;
2408
+ level_setp ( cur , p ) ;
2397
2409
cur -> x = x ;
2398
2410
cur -> limp = limp ;
2399
2411
cur -> max_at = seen_best ;
@@ -2521,6 +2533,7 @@ void insert_stack(void) {
2521
2533
goto insert_check ;
2522
2534
}
2523
2535
2536
+ level_setp (cur , p );
2524
2537
/* CHECKME: this returns 0 if t=1 */
2525
2538
if (!apply_single (prev , cur , vi , p , x ))
2526
2539
fail ("could not apply_single(%u, %lu, %u)" , vi , p , x );
@@ -2586,7 +2599,7 @@ void recurse(void) {
2586
2599
if (prev_level -> have_square )
2587
2600
walk_v (prev_level , Z (zero ));
2588
2601
else if (level > 1 && !prev_level -> is_forced )
2589
- prev_level -> p = prev_level -> limp ;
2602
+ level_setp ( prev_level , prev_level -> limp ) ;
2590
2603
#else
2591
2604
walk_v (prev_level , Z (zero ));
2592
2605
#endif
@@ -2684,7 +2697,7 @@ void recurse(void) {
2684
2697
}
2685
2698
/* note: only valid to use from just below here */
2686
2699
redo_unforced :
2687
- p = next_prime ( p );
2700
+ p = prime_iterator_next ( & cur_level -> piter );
2688
2701
if (p > cur_level -> limp )
2689
2702
goto continue_unforced_x ;
2690
2703
if (p <= prev_level -> maxp )
0 commit comments