Commit 1d992f2e authored by Juraj Sukop's avatar Juraj Sukop Committed by Brad Fitzpatrick

math/big: better initial guess for nat.sqrt

The proposed change introduces a better initial guess which is closer to the final value and therefore converges in fewer steps. Consider for example sqrt(8): previously the guess was 8, whereas now it is 4 (and the result is 2). All this change does is it computes the division by two more accurately while it keeps the guess ≥ √x.

Change-Id: I917248d734a7b0488d14a647a063f674e56c4e30
GitHub-Last-Rev: c06d9d4876c8e7d6739f0e4b687e370fe1e9aad7
GitHub-Pull-Request: golang/go#28981
Reviewed-on: https://go-review.googlesource.com/c/163866
Run-TryBot: Brad Fitzpatrick <bradfitz@golang.org>
TryBot-Result: Gobot Gobot <gobot@golang.org>
Reviewed-by: default avatarRobert Griesemer <gri@golang.org>
parent 9650726e
...@@ -1345,7 +1345,7 @@ func (z nat) sqrt(x nat) nat { ...@@ -1345,7 +1345,7 @@ func (z nat) sqrt(x nat) nat {
var z1, z2 nat var z1, z2 nat
z1 = z z1 = z
z1 = z1.setUint64(1) z1 = z1.setUint64(1)
z1 = z1.shl(z1, uint(x.bitLen()/2+1)) // must be ≥ √x z1 = z1.shl(z1, uint(x.bitLen()+1)/2) // must be ≥ √x
for n := 0; ; n++ { for n := 0; ; n++ {
z2, _ = z2.div(nil, x, z1) z2, _ = z2.div(nil, x, z1)
z2 = z2.add(z2, z1) z2 = z2.add(z2, z1)
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment