mpz_prevprime

Marco Bodrato bodrato at mail.dm.unipi.it
Mon Mar 23 21:38:58 UTC 2020


Ciao,

Il 2020-03-22 10:00 Seth Troisi ha scritto:
> I measure the regression as ~5-15% for input < ~10,000

And no regression for larger input? Good.

> I have a proposed patch which uses int, and trial div up to some
> threshold this appears to be 5x faster.

A couple of question arises.
5x faster than what? Than the patch I proposed or than the old/current 
code?

Which one is the good idea? using int or avoiding the sieve?

Using unsigned long to compute the modulus is obviously faster than many 
calls to mpz_cdiv_ui. I tried a patch that surely is not as fast as 
yours, but should speed-up all numbers that fits in a single unsigned 
long. The speed-up seems small, I'm not sure it's worth.

> The cut off point as I measure it is ~80,000,000 but requires
> increasing the primegap_small list to ~1100 entries
> 
> I'm not sure what you think about a list of that length.

Well, the cut off point is surely different on different architectures. 
It should be tuned.
Moreover: a large list ... can't it be generated on the fly? If we want 
a larger table, in my opinion it should be an improvement for all the 
functions that need primes (_primorial, _bin, _fac...).

> It might also be useful to commit tune_nextprime_small which
> dynamically selects a higher reps count for
> mpz_nextprime input and helps increase precision.

Uhm...
j = 200000 / s->size;

This means that
for size=10 you compute 20000 primes: all primes between 2^10 and 2^18.
for size=11: all primes between 2^11 and 2^18.
for size=12... and so on up to 2^18.

This is not exactly representative of the speed of nextprime on operands 
around 2^10, 2^11... and so on.


PS: a comment in the current code says
  /* Larger threshold is faster but takes ~O(n/ln(n)) memory.
To be honest, the array sieve needs n/24 bytes, and the array 
primegap_tmp uses primepi(n) ~= n/ln(n) bytes. And asymptotically the 
sum of both is O(n).

Ĝis,
m


More information about the gmp-devel mailing list