From: Michal Bohuslávek Date: Tue, 20 Sep 2016 21:56:57 +0000 (+0100) Subject: math/big: support negative numbers in ModInverse X-Git-Tag: go1.8beta1~1149 X-Git-Url: http://www.git.cypherpunks.su/?a=commitdiff_plain;h=9ed0715bb66dbbd0f597f93d0bc70a3d769b1b10;p=gostls13.git math/big: support negative numbers in ModInverse Fixes #16984 Change-Id: I3a330e82941a068ca6097985af4ab221275fd336 Reviewed-on: https://go-review.googlesource.com/29299 Run-TryBot: Adam Langley TryBot-Result: Gobot Gobot Reviewed-by: Adam Langley --- diff --git a/src/math/big/int.go b/src/math/big/int.go index f2a75d1cd5..6c08843861 100644 --- a/src/math/big/int.go +++ b/src/math/big/int.go @@ -577,6 +577,11 @@ func (z *Int) Rand(rnd *rand.Rand, n *Int) *Int { // ModInverse sets z to the multiplicative inverse of g in the ring ℤ/nℤ // and returns z. If g and n are not relatively prime, the result is undefined. func (z *Int) ModInverse(g, n *Int) *Int { + if g.neg { + // GCD expects parameters a and b to be > 0. + var g2 Int + g = g2.Mod(g, n) + } var d Int d.GCD(z, nil, g, n) // x and y are such that g*x + n*y = d. Since g and n are diff --git a/src/math/big/int_test.go b/src/math/big/int_test.go index fcc2ebc9ba..0cae4a12c5 100644 --- a/src/math/big/int_test.go +++ b/src/math/big/int_test.go @@ -1309,6 +1309,7 @@ var modInverseTests = []struct { }{ {"1234567", "458948883992"}, {"239487239847", "2410312426921032588552076022197566074856950548502459942654116941958108831682612228890093858261341614673227141477904012196503648957050582631942730706805009223062734745341073406696246014589361659774041027169249453200378729434170325843778659198143763193776859869524088940195577346119843545301547043747207749969763750084308926339295559968882457872412993810129130294592999947926365264059284647209730384947211681434464714438488520940127459844288859336526896320919633919"}, + {"-10", "13"}, // issue #16984 } func TestModInverse(t *testing.T) {