aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/math/big/int_test.go20
-rw-r--r--src/math/big/nat.go4
2 files changed, 22 insertions, 2 deletions
diff --git a/src/math/big/int_test.go b/src/math/big/int_test.go
index 42e810b3b8..46e2ff1203 100644
--- a/src/math/big/int_test.go
+++ b/src/math/big/int_test.go
@@ -1536,6 +1536,26 @@ func TestSqrt(t *testing.T) {
}
}
+// We can't test this together with the other Exp tests above because
+// it requires a different receiver setup.
+func TestIssue22830(t *testing.T) {
+ one := new(Int).SetInt64(1)
+ base, _ := new(Int).SetString("84555555300000000000", 10)
+ mod, _ := new(Int).SetString("66666670001111111111", 10)
+ want, _ := new(Int).SetString("17888885298888888889", 10)
+
+ var tests = []int64{
+ 0, 1, -1,
+ }
+
+ for _, n := range tests {
+ m := NewInt(n)
+ if got := m.Exp(base, one, mod); got.Cmp(want) != 0 {
+ t.Errorf("(%v).Exp(%s, 1, %s) = %s, want %s", n, base, mod, got, want)
+ }
+ }
+}
+
func BenchmarkSqrt(b *testing.B) {
n, _ := new(Int).SetString("1"+strings.Repeat("0", 1001), 10)
b.ResetTimer()
diff --git a/src/math/big/nat.go b/src/math/big/nat.go
index 889eacb90f..f2cdbdb909 100644
--- a/src/math/big/nat.go
+++ b/src/math/big/nat.go
@@ -566,8 +566,8 @@ func (z nat) divLarge(u, uIn, v nat) (q, r nat) {
// determine if z can be reused
// TODO(gri) should find a better solution - this if statement
// is very costly (see e.g. time pidigits -s -n 10000)
- if alias(z, uIn) || alias(z, v) {
- z = nil // z is an alias for uIn or v - cannot reuse
+ if alias(z, u) || alias(z, uIn) || alias(z, v) {
+ z = nil // z is an alias for u or uIn or v - cannot reuse
}
q = z.make(m + 1)