]> Cypherpunks repositories - gostls13.git/commitdiff
math/big: support negative numbers in ModInverse
authorMichal Bohuslávek <mbohuslavek@gmail.com>
Tue, 20 Sep 2016 21:56:57 +0000 (22:56 +0100)
committerAdam Langley <agl@golang.org>
Tue, 27 Sep 2016 00:42:56 +0000 (00:42 +0000)
Fixes #16984

Change-Id: I3a330e82941a068ca6097985af4ab221275fd336
Reviewed-on: https://go-review.googlesource.com/29299
Run-TryBot: Adam Langley <agl@golang.org>
TryBot-Result: Gobot Gobot <gobot@golang.org>
Reviewed-by: Adam Langley <agl@golang.org>
src/math/big/int.go
src/math/big/int_test.go

index f2a75d1cd50076fa18f4d55f7606344e44a429d2..6c08843861309a9c06b96a88e164641d10608673 100644 (file)
@@ -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
index fcc2ebc9ba3dac429c80fb5138b372ea6d4f4599..0cae4a12c5200696dda608bbaf584bd339d27147 100644 (file)
@@ -1309,6 +1309,7 @@ var modInverseTests = []struct {
 }{
        {"1234567", "458948883992"},
        {"239487239847", "2410312426921032588552076022197566074856950548502459942654116941958108831682612228890093858261341614673227141477904012196503648957050582631942730706805009223062734745341073406696246014589361659774041027169249453200378729434170325843778659198143763193776859869524088940195577346119843545301547043747207749969763750084308926339295559968882457872412993810129130294592999947926365264059284647209730384947211681434464714438488520940127459844288859336526896320919633919"},
+       {"-10", "13"}, // issue #16984
 }
 
 func TestModInverse(t *testing.T) {