This week I was working on the Jacobi sum test optimizations described in the last post.
First I add some fixed optimal R values for n with different number of digits. I also rewrite s computation. This functions can be find here. It gave a good gain in speed, but I can add more intermediate R values. It must be done carefully, because with smaller R we can have worse s. This is shown in the graph, the PARI/GP implementation has many peaks.
![]() |
mean time in seconds |
Also I do a lot of profiling using valgrind callgrind tool. I find that the computation of Jacobi sums takes a little time, so I'm not going to tabulate them.
I implement the final step of algorithm on condition that s^3 > n using divisors in residue classes algorithm. After that all becomes slower. The divisors in residue classes algorithm have a good complexity O((\ln n)^3, but we need to call it thousands of times (R = 2520 for 100 digits n).
The next graph show timings for n from 50 to 100 digits:
![]() |
mean time in seconds |
To better understand how selection of R affects at the time I look at most slow part of algorithm (n-th powering in \mathbb{Z}[\zeta_r] / (n)) and count the number of operations. This can be seen in the following tables for 100 and 300 digits numbers:
![]() |
![]() |
Also attach link to valgrind outputs for 100 and 300 digits prime.
Next I want try to use directly fmpz_vec operations, without fmpz_mod_poly abstraction. After this I want to implement some formulas described in "Implementation of a New Primality Test" for fixed r = p^k.
No comments:
Post a Comment