Ilya Zakharevich on Sat, 21 Sep 2024 20:24:51 +0200


[Date Prev] [Date Next] [Thread Prev] [Thread Next] [Date Index] [Thread Index]

Re: [pre-announcement of a PATCH 2.16.1-alpha] VERY WRONG: 90x speedup (MUCH MORE!) of forprime() above 2^64


On Thu, Aug 29, 2024 at 11:13:57PM -0700, Ilya Zakharevich wrote:
> Currently I’m integrating a patch to 2.16.1 (since 2.16.2 has another
> [unfathomable???] BACKWARDS change) supporting sieving up to about
> 10^290

In the initial message, I said that the speedup was up to ∼90x (for
numbers close to 2^64), and it goes down to ∼18x closer to 10^23.  In
another message, I noted that using a proper arena size, instead of
18x, the gain is improved to ∼60x (when “closer to 10^23”).

  THIS WAS VERY WRONG!  (I did not realize that forprime() is buggy…)

The docs do not say this, but above 2^64, one needs to use forprime()
in a very particular way, like:

  forprime(p=A, B, if(isprime(p), CODE ));

And since this is MUCH slower than “just using forprime()” (which
is — together with nextprime() and precprime() — just a misnomer for
forpseudoprime(), the advantages of using sieving are actually an
order of magnitude more than I thought before:

 SUMMARY: On the whole checked range 2^64…10^23, the advantage is¹⁾
 	  >1000 times. 

    ¹⁾ Cannot be more precise (and/or extrapolate), since (judging by
       the timings) isprime() seems to be also buggy.  At least it
       shows suspiciously irregular averaged timing (I’m going to
       post a separate message about this).

Hope this helps,
Ilya

  P.S.  The patch is almost ready now.  It only touches
  	forprime.c — the rest can keep primes in whatever format one
  	wants.