[Gmp-commit] /var/hg/gmp: 2 new changesets
mercurial at gmplib.org
mercurial at gmplib.org
Sat Oct 27 13:21:25 CEST 2012
details: /var/hg/gmp/rev/5d6dd71e0a0a
changeset: 15090:5d6dd71e0a0a
user: Torbjorn Granlund <tege at gmplib.org>
date: Sat Oct 27 11:43:28 2012 +0200
description:
Whitespace cleanup.
details: /var/hg/gmp/rev/0b25e4cfd719
changeset: 15091:0b25e4cfd719
user: Torbjorn Granlund <tege at gmplib.org>
date: Sat Oct 27 13:21:09 2012 +0200
description:
Further edit comments.
diffstat:
mpn/generic/perfpow.c | 56 +++++++++++++++++++++++++++-----------------------
1 files changed, 30 insertions(+), 26 deletions(-)
diffs (87 lines):
diff -r 755243e9118f -r 0b25e4cfd719 mpn/generic/perfpow.c
--- a/mpn/generic/perfpow.c Sat Oct 27 10:50:42 2012 +0200
+++ b/mpn/generic/perfpow.c Sat Oct 27 13:21:09 2012 +0200
@@ -106,33 +106,31 @@
return ans;
}
-/*
- Computes rp such that rp^k * yp = 1 (mod 2^b).
- Algorithm:
- Apply Hensel lifting repeatedly, each time
- doubling (approx.) the number of known bits in rp.
+/* Compute r such that r^k * y = 1 (mod 2^b).
- Uses the iteration
+ Iterates
+ r' <-- k^{-1} ((k+1) r - r^{k+1} y) (mod 2^b)
+ using Hensel lifting, each time doubling the number of known bits in r.
- r' <-- k^{-1} ((k+1) r - r^{k+1} y) (mod 2^b)
+ Works just for odd k. Else the Hensel lifting degenerates.
- FIXME: I think we get *exactly* doubled precision in each
- iteration. Could be simplified to do precision book-keeping in
- limbs rather than bits.
-
- FIXME: Rewrite iteration as
+ FIXME:
+ (1) Simplify to do precision book-keeping in limbs rather than bits.
- r' <-- r - k^{-1} r (r^k y - 1)
+ (2) Rewrite iteration as
+ r' <-- r - k^{-1} r (r^k y - 1)
+ and take advantage of the zero low part of r^k y - 1.
- and take advantage of the zero low part of r^k y - 1.
+ (3) Use wrap-around trick.
- If we prefer to get y^{1/k} rather than y^{-1/k}, we could also
- switch to the iteration
+ (4) Use a small table to get starting value.
+
+ If we prefer to get y^{1/k} rather than y^{-1/k}, we could also switch to
+ the iteration
r' <-- r - k^{-1} r (r^k y^{k-1} - 1)
- which converges to y^{1/n - 1}, and we then get y^{1/n} by a single
- mullo.
+ which converges to y^{1/n - 1}, and we then get y^{1/n} by a single mullo.
*/
static void
binv_root (mp_ptr rp, mp_srcptr yp,
@@ -171,19 +169,25 @@
return;
}
-/*
- Computes rp such that rp^2 * yp = 1 (mod 2^{b+1}).
- Returns non-zero if such an integer rp exists.
+/* Compute r such that r^2 * y = 1 (mod 2^{b+1}).
+ Return non-zero if such an integer r exists.
- Uses the iteration
+ Iterates
+ r' <-- (3r - r^3 y) / 2
+ using Hensel lifting. Since we divide by two, the Hensel lifting is
+ somewhat degenerates. Therefore, we lift from 2^b to 2^{b+1}-1.
- r' <-- (3r - r^3 y) / 2
+ FIXME:
+ (1) Simplify to do precision book-keeping in limbs rather than bits.
- FIXME: Rewrite as
+ (2) Rewrite iteration as
+ r' <-- r - r (r^2 y - 1) / 2
+ and take advantage of zero low part of r^2 y - 1.
- r' <-- r - r (r^2 y - 1) / 2
+ (3) Use wrap-around trick.
- and take advantage of zero low part of r^2 y - 1.
+ (4) Use a small table to get starting value.
+
*/
static int
binv_sqroot (mp_ptr rp, mp_srcptr yp,
More information about the gmp-commit
mailing list