diff options
-rw-r--r-- | src/math/big/int_test.go | 20 | ||||
-rw-r--r-- | src/math/big/nat.go | 4 |
2 files changed, 22 insertions, 2 deletions
diff --git a/src/math/big/int_test.go b/src/math/big/int_test.go index b8e0778ca3..4a4e548576 100644 --- a/src/math/big/int_test.go +++ b/src/math/big/int_test.go @@ -1487,6 +1487,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 9b1a626c4c..607430064c 100644 --- a/src/math/big/nat.go +++ b/src/math/big/nat.go @@ -575,8 +575,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) |