src/math/big/int_test.go | 20 ++++++++++++++++++++ src/math/big/nat.go | 4 ++-- diff --git a/src/math/big/int_test.go b/src/math/big/int_test.go index b8e0778ca3201783a524a5c473754d74f94db946..4a4e548576777c3b7a6c5c148099172607394dab 100644 --- a/src/math/big/int_test.go +++ b/src/math/big/int_test.go @@ -1487,6 +1487,26 @@ t.Errorf("Sqrt(100) = %v, want 10 (aliased output)", r.Int64()) } } +// 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 9b1a626c4cf18acd5d2df494bdc2ca740f13272e..607430064ccf2e3253e7a9fe92041fd6231e6035 100644 --- a/src/math/big/nat.go +++ b/src/math/big/nat.go @@ -575,8 +575,8 @@ // 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)