@@ -294,6 +294,19 @@ static inline bool test_multi_append(mpz_t n, uint vi, uint t, uint e) {
294294 tm -> e = e ;
295295 return tau_multi_prep (i );
296296}
297+ /* Note: test_prime_append() steals the input mpz_t */
298+ static inline bool test_prime_append (mpz_t n , uint vi ) {
299+ uint i = tm_count ++ ;
300+ t_tm * tm = & taum [i ];
301+ mpz_swap (tm -> n , n );
302+ tm -> vi = vi ;
303+ tm -> t = 2 ;
304+ tm -> e = 1 ;
305+ return tau_prime_prep (i );
306+ }
307+ static inline uint test_prime_run (void ) {
308+ return tau_prime_run (tm_count );
309+ }
297310static inline uint test_multi_run (void ) {
298311 return tau_multi_run (tm_count );
299312}
@@ -1885,6 +1898,29 @@ bool test_zprime(mpz_t qq, mpz_t o, mpz_t ati) {
18851898 return _GMP_is_prob_prime (Z (wv_cand ));
18861899}
18871900
1901+ bool test_1primes (uint * need , uint nc ) {
1902+ uint good = 0 ;
1903+ test_multi_reset ();
1904+ for (uint i = 0 ; i < nc ; ++ i ) {
1905+ uint vi = need [i ];
1906+ mpz_set (Z (temp ), wv_o [vi ]);
1907+ if (!test_prime_append (Z (temp ), vi )) {
1908+ TRACK_BAD (good , vi );
1909+ return 0 ;
1910+ }
1911+ #ifdef TRACK_STATS
1912+ if (taum [tm_count - 1 ].state == 0 )
1913+ ++ good ;
1914+ #endif
1915+ }
1916+ uint remain = test_prime_run ();
1917+ if (remain ) {
1918+ TRACK_BAD (nc - remain , taum [0 ].vi );
1919+ return 0 ;
1920+ }
1921+ return 1 ;
1922+ }
1923+
18881924bool test_1multi (uint * need , uint nc , uint * t ) {
18891925 uint good = 0 ;
18901926 test_multi_reset ();
@@ -1905,6 +1941,54 @@ bool test_1multi(uint *need, uint nc, uint *t) {
19051941 return remain ? 0 : 1 ;
19061942}
19071943
1944+ bool test_primes (uint * need , uint nc , ulong ati ) {
1945+ uint good = 0 ;
1946+ test_multi_reset ();
1947+ for (uint i = 0 ; i < nc ; ++ i ) {
1948+ uint vi = need [i ];
1949+ mpz_mul_ui (Z (temp ), wv_qq [vi ], ati );
1950+ mpz_add (Z (temp ), Z (temp ), wv_o [vi ]);
1951+ if (!test_prime_append (Z (temp ), vi )) {
1952+ TRACK_BAD (good , vi );
1953+ return 0 ;
1954+ }
1955+ #ifdef TRACK_STATS
1956+ if (taum [tm_count - 1 ].state == 0 )
1957+ ++ good ;
1958+ #endif
1959+ }
1960+ uint remain = test_prime_run ();
1961+ if (remain ) {
1962+ TRACK_BAD (nc - remain , taum [0 ].vi );
1963+ return 0 ;
1964+ }
1965+ return 1 ;
1966+ }
1967+
1968+ bool test_zprimes (uint * need , uint nc , mpz_t ati ) {
1969+ uint good = 0 ;
1970+ test_multi_reset ();
1971+ for (uint i = 0 ; i < nc ; ++ i ) {
1972+ uint vi = need [i ];
1973+ mpz_mul (Z (temp ), wv_qq [vi ], ati );
1974+ mpz_add (Z (temp ), Z (temp ), wv_o [vi ]);
1975+ if (!test_prime_append (Z (temp ), vi )) {
1976+ TRACK_BAD (good , vi );
1977+ return 0 ;
1978+ }
1979+ #ifdef TRACK_STATS
1980+ if (taum [tm_count - 1 ].state == 0 )
1981+ ++ good ;
1982+ #endif
1983+ }
1984+ uint remain = test_prime_run ();
1985+ if (remain ) {
1986+ TRACK_BAD (nc - remain , taum [0 ].vi );
1987+ return 0 ;
1988+ }
1989+ return 1 ;
1990+ }
1991+
19081992bool test_multi (uint * need , uint nc , ulong ati , uint * t ) {
19091993 uint good = 0 ;
19101994 test_multi_reset ();
@@ -2171,15 +2255,8 @@ void walk_v(t_level *cur_level, mpz_t start) {
21712255 goto next_pell ;
21722256 }
21732257
2174- for (uint i = 0 ; i < npc ; ++ i ) {
2175- uint vi = need_prime [i ];
2176- if (!test_zprime (wv_qq [vi ], wv_o [vi ], Z (wv_ati ))) {
2177- TRACK_BAD (nqc + i , need_prime [i ]);
2178- goto next_pell ;
2179- } else {
2180- TRACK_GOOD (nqc + i , need_prime [i ]);
2181- }
2182- }
2258+ if (!test_zprimes (need_prime , npc , Z (wv_ati )))
2259+ goto next_pell ;
21832260 /* TODO: bail and print somewhere here if 'opt_print' */
21842261 if (!test_zmulti (need_other , noc , Z (wv_ati ), t ))
21852262 goto next_pell ;
@@ -2291,15 +2368,8 @@ void walk_v(t_level *cur_level, mpz_t start) {
22912368 goto next_sqati ;
22922369 }
22932370
2294- for (uint i = 0 ; i < npc ; ++ i ) {
2295- uint vi = need_prime [i ];
2296- if (!test_zprime (wv_qq [vi ], wv_o [vi ], Z (wv_ati ))) {
2297- TRACK_BAD (1 + i , need_prime [i ]);
2298- goto next_sqati ;
2299- } else {
2300- TRACK_GOOD (1 + i , need_prime [i ]);
2301- }
2302- }
2371+ if (!test_zprimes (need_prime , npc , Z (wv_ati )))
2372+ goto next_sqati ;
23032373 /* TODO: bail and print somewhere here if 'opt_print' */
23042374 if (!test_zmulti (need_other , noc , Z (wv_ati ), t ))
23052375 goto next_sqati ;
@@ -2353,15 +2423,8 @@ void walk_v(t_level *cur_level, mpz_t start) {
23532423 fflush (rfp );
23542424#endif
23552425 /* note: we have no squares */
2356- for (uint i = 0 ; i < npc ; ++ i ) {
2357- uint vi = need_prime [i ];
2358- if (!test_prime (wv_qq [vi ], wv_o [vi ], ati )) {
2359- TRACK_BAD (i , need_prime [i ]);
2360- goto next_ati ;
2361- } else {
2362- TRACK_GOOD (i , need_prime [i ]);
2363- }
2364- }
2426+ if (!test_primes (need_prime , npc , ati ))
2427+ goto next_ati ;
23652428 /* TODO: bail and print somewhere here if 'opt_print' */
23662429 if (!test_multi (need_other , noc , ati , t ))
23672430 goto next_ati ;
@@ -2436,13 +2499,8 @@ void walk_1(t_level *cur_level, uint vi) {
24362499 }
24372500 ++ countwi ;
24382501 TRACK_GOOD (0 , vi );
2439- for (uint i = 0 ; i < npc ; ++ i )
2440- if (!_GMP_is_prob_prime (wv_o [need_prime [i ]])) {
2441- TRACK_BAD (1 + i , need_prime [i ]);
2442- return ;
2443- } else {
2444- TRACK_GOOD (1 + i , need_prime [i ]);
2445- }
2502+ if (!test_1primes (need_prime , npc ))
2503+ return ;
24462504 oc_t = t ;
24472505 qsort (need_other , noc , sizeof (uint ), & other_comparator );
24482506 if (!test_1multi (need_other , noc , t ))
@@ -2530,9 +2588,8 @@ void walk_1_set(t_level *cur_level, uint vi, ulong plow, ulong phigh, uint x) {
25302588 mpz_set (wv_o [vj ], Z (w1_j ));
25312589 }
25322590 ++ countwi ;
2533- for (uint i = 0 ; i < npc ; ++ i )
2534- if (!_GMP_is_prob_prime (wv_o [need_prime [i ]]))
2535- goto reject_this_one ;
2591+ if (!test_1primes (need_prime , npc ))
2592+ goto reject_this_one ;
25362593 oc_t = t ;
25372594 qsort (need_other , noc , sizeof (uint ), & other_comparator );
25382595 if (!test_1multi (need_other , noc , t ))
0 commit comments