| Ilya Zakharevich on Sun, 07 Jan 2024 19:20:06 +0100 |
[Date Prev] [Date Next] [Thread Prev] [Thread Next] [Date Index] [Thread Index]
| primelimit and forprime() |
On Sun, Jan 07, 2024 at 09:14:25AM -0800, Ilya Zakharevich wrote:
> P.S. High primelimit speeds up sieving about 1.5 orders of magnitude
> (up to primelimit²).
I completely lost! With my old implementation of forprimes() the
semantic of the speed was quite simple. I THOUGHT that I understand
the semantic of the speed of the new implementation as this:
• up to primelimit² what is used is on-the-fly sieving.
• after this, nextprime() is used (which is way slower — but the
speed does not depend MUCH on the argument — up to 1 word overflow).
And this is what works with the default primelimit=500000:
(09:26) gp > my(s=24*10^10); forprime(p=s,s+10^8,)
time = 453 ms.
(09:26) gp > my(s=26*10^10); forprime(p=s,s+10^8,)
time = 16,521 ms.
(09:31) gp > my(s=15*10^16); forprime(p=s,s+10^8,)
time = 16,818 ms.
(09:26) gp > my(s=17*10^18); forprime(p=s,s+10^8,)
time = 18,189 ms.
(10:03) gp > my(s=19*10^18); forprime(p=s,s+10^8,)
time = 1min, 41,026 ms.
About 10 years ago, I tested this with primelimit about 10^7 as well.
However, with the limit of 4*10^9 (about 2^32 — the limit of the old
implementation on 32-bit¹⁾ machines) what I observe is very different,
and very non-monotonic:
(09:23) gp > my(s=15*10^10); forprime(p=s,s+10^8,)
time = 436 ms.
(09:23) gp > my(s=15*10^12); forprime(p=s,s+10^8,)
time = 1,030 ms.
(09:23) gp > my(s=15*10^14); forprime(p=s,s+10^8,)
time = 5,352 ms.
(09:30) gp > my(s=15*10^16); forprime(p=s,s+10^8,)
time = 43,415 ms.
(09:13) gp > my(s=15*10^18); forprime(p=s,s+10^8,)
time = 18,096 ms.
(09:22) gp > my(s=17*10^18); forprime(p=s,s+10^8,)
time = 18,238 ms.
(10:02) gp > my(s=19*10^18); forprime(p=s,s+10^8,)
time = 1min, 41,120 ms.
¹⁾ My computer is 64-bit.
Why the slow-down at about 10^16? Why the speed returning back to the
speed of default primelimit around 10^19? (And not after primelimit²?)
Thanks,
Ilya
P.S. This is somewhat similar to what would happen if
• the advantage of sieving-on-the-fly gradually disappears,
and it has no advantage over nextprime() at some moment;
• gp/PARI knows about this, and switches to the nextprime()
after a certain threshold;
• However, the threshold is hardwired into gp/PARI, and its
value is way off for my computer.
Is it so?