roots
Jason Moxham
J.L.Moxham@maths.soton.ac.uk
Fri, 1 Nov 2002 20:47:31 +0000
--------------Boundary-00=_7F0XBLQMMMGCLP0R9M35
Content-Type: text/plain;
charset="us-ascii"
Content-Transfer-Encoding: quoted-printable
Attached is a mainly mpn-ified version , its still preliminary with a few=
=20
thing still to do.For cube roots and higher the cutoff point is about 200=
=20
bits now , I should be able to lower this some more , and perhaps increas=
e=20
the speed for large n and k.
If gmp is going to have a high half multiplication then I can take advant=
age=20
of that (really easy).
One thing should be considered , is that the algortihm does not calculate=
the=20
remainder , which can take much longer than the root , although still fas=
ter=20
than the current code.
The current mpz_root fn returns an integer indicating whether the root is=
=20
exact , perhaps a new mpz_roots fn which just does the root calculation=20
should be added to take advantage of this.The mpz_perfect_power_p fn is a=
lso=20
better to write in terms of p-adic or the underlying nroot fns rather tha=
n=20
the much slower mpn_rootrem and I have a go at this soon.
I was going to mention that the inversion can be faster than the existing=
=20
mpz_tdiv_qr , but that is probably wrong now .=20
Note: when I get the snapshot all I get is the current 4.1.1 , not the 4.=
2-pre=20
?
Aside from the quick division test above , I an concentrating on cube roo=
ts or=20
higher , for sqrts or inversion my code is slower (so far)
jason
--------------Boundary-00=_7F0XBLQMMMGCLP0R9M35
Content-Type: application/x-tbz;
name="root.tar.bz2"
Content-Transfer-Encoding: base64
Content-Disposition: attachment; filename="root.tar.bz2"
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
--------------Boundary-00=_7F0XBLQMMMGCLP0R9M35--