| Ilya Zakharevich on Fri, 30 Aug 2024 08:14:03 +0200 |
[Date Prev] [Date Next] [Thread Prev] [Thread Next] [Date Index] [Thread Index]
| [pre-announcement of a PATCH 2.16.1-alpha] 90x speedup of forprime() above 2^64 |
The people who paid attention to my earlier messages about PARI’s
forprime() may already know that (due to a combination of unfortunate
events?) PARI’s developers had (IMO unfathomable) ideas that sieving
is slower than running nextprime() for numbers as low as 10^12. (See
various files Changes*; the first wrong decision I know about is the
change 109 in v2.6.)
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 (of course, this is not feasible “on contemporary computers”
since this requires about 10^145 bytes memory for the prime table).
With this patch, I can test where is the REAL crossover (since,
INDEED, eventually nextprime() IS going to become quicker!).
ANSWER: on my computer, I can allocate about 12GB for a prime table,
and (with primediff) this supports prime table up to 320
billions, so one can sieve up to 10^23.
The current implementation is not fully optimized, but still
it performs about 18 times quicker than the stock forprime()
even at 10^23. (With 128-bit numbers closer to 2^64 it
performs up to >90 times quicker!)
Moreover, the dependence of speed on the size of numbers “follows a
simple law”. Extrapolating this law suggests that the crossover¹⁾
happens about 0.9·10^26.
CONCLUSION: it makes sense to support prime tables up to 10^13.
¹⁽ This is the crossover with the CURRENT IMPLEMENTATION of
forprime()-via-nextprime(). As I explained earlier
http://megrez.math.u-bordeaux.fr/archives/pari-dev-2401/msg00049.html
I expect that this may be sped up about 5 times (see the line
in the middle of the attached image).
If such an optimization is possible, the crossover happens at ∼2.5·10^24.
This may require up to 320 GB memory (with the footnote’s
optimization, 57 GB memory — so fully feasible!) to store diffptr for
the prime table.
Hope this helps,
Ilya
P.S. I attach the plot of the time (in seconds) of sieving an
interval with 2 billion numbers (depending on the size of the
number). Since it seems that the list does not support
images, here is the duplicate:
http://ilyaz.org/software/tmp/sieve_vs_nextprime_on_2words-optimized.png
Attachment:
sieve_vs_nextprime_on_2words-optimized.png
Description: PNG image