hermann on Fri, 23 Jun 2023 13:11:59 +0200 |
[Date Prev] [Date Next] [Thread Prev] [Thread Next] [Date Index] [Thread Index]
Re: Why is "lift(Mod(qnr, n)^(n\4))" 16% slower than C libgmp "powm(r, qnr, n/4, n)" ? |
On 2023-06-23 12:25, Karim Belabas wrote:
Note that the current 'master' branch currently computes sqrt(Mod(-1,p))quickly in all cases. The branch origin/bill-Fp_sqrts implements a slightly more general solution: besides -1, 0% of quadratic residues allow a faster algorithm to compute their square root, it costs nothing to try to use it.
Thanks Karim. I added whut you proposed: https://github.com/Hermann-SW/RSA_numbers_factored/blob/main/pari/sqrtm1.gp $ git diff . diff --git a/pari/sqrtm1.gp b/pari/sqrtm1.gp index 46a65ae..bdf290f 100644 --- a/pari/sqrtm1.gp +++ b/pari/sqrtm1.gp @@ -21,3 +21,6 @@ p=lift(Mod(qnr, n)^(n\4)); ## write("/dev/stderr", p); assert(p^2 % n == n-1, "p^2 % n != n-1: ", p); +q=lift(sqrt(Mod(-1, n))); +## +assert(q^2 % n == n-1, "q^2 % n != n-1: ", q); $Then I did pull latest on master branch, did make clean, ./Configure, make and make install.
I chose a slightly bigger 36401-digit prime to get some more runtime, but not hours. The times reported are the same for 2.15 and 2.16 gp, and for "lift(Mod(qnr, n)^(n\4))" and "lift(sqrt(Mod(-1, n)))". So still on master branch determination of "sqrt(-1) (mod p)" is 16% slower than with libgmp "powm()".
Since gp uses GMP kernel, why is that runtime differennce?$ n='34*((10^36400-1)\9)-42000040044444004000024*10^2264*(10^36400-1)\9\((10^4550-1)\9)-1' gp-2.15 -q < sqrtm1.gp 2>err
2 *** last result computed in 1min, 12,922 ms. *** last result computed in 1min, 13,615 ms. $$ n='34*((10^36400-1)\9)-42000040044444004000024*10^2264*(10^36400-1)\9\((10^4550-1)\9)-1' gp-2.16 -q < sqrtm1.gp 2>err
2 *** last result computed in 1min, 13,003 ms. *** last result computed in 1min, 13,841 ms. $ Regards, Hermann.