Processing math: 100%

Sunday, 28 June 2015

GSoC week 5; Some optimizations


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
Next I add 2^k-ary powering algorithm. It gave ~20% gain in speed.

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: 
DESCRIPTION DESCRIPTION
  
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