| hermann on Fri, 09 Jun 2023 01:21:52 +0200 |
[Date Prev] [Date Next] [Thread Prev] [Thread Next] [Date Index] [Thread Index]
| Re: Pari/GP "halfgcd()" implementation |
Well, if you want a slow halfgcd, it is not harder than extended GCD:
myhalfgcd(a,b)=
{
my(M=matid(2));
my(n = max(a,b));
while (b^2>=n,
my([q,r]=divrem(a,b));
[a,b] = [b,r];
M = [0,1;1,-q]*M;
);
[M,[a,b]~];
}
(the matrix product can be inlined.)
halfgcdii implements both the Lehmer-Jebelean acceleration and the
subquadratic algorithm (following Thull-Yap).
I tried it, and it is really slow!tail of "git diff 388342.halfgcd.gp", with your "myhalfgcd()" added at top:
...
##
-assert(V[2]^2 + M[2,1]^2 == p, "V[2],M[2,1]", " not sum of squares");
+[x,y] = [V[2], M[2,1]];
+assert(x^2 + y^2 == p, "x,y", " not sum of squares");
+
+[M,V]=myhalfgcd(sqrtm1,p);
+##
+[x,y] = [V[2], M[2,1]];
+assert(x^2 + y^2 == p, "x,y", " not sum of squares");
+
print("done");
Output on i7-11850H, that is a slowdown of more than 13000x ...
$ python -c "print((13*60000+1518)/60)"
13025.3
$
$ gp-2.16 < 388342.halfgcd.gp
...
parisizemax = 2000003072, primelimit = 1048576, nbthreads = 8
foobar
*** last result: cpu time 60 ms, real time 60 ms.
*** last result: cpu time 13min, 1,518 ms, real time 13min, 4,658
ms.
done Goodbye! $ Regards, Hermann Stamm-Wilbrandt.