@@ -1448,24 +1448,40 @@ func TestNot(t *testing.T) {
1448
1448
1449
1449
var modInverseTests = []struct {
1450
1450
element string
1451
- prime string
1451
+ modulus string
1452
1452
}{
1453
- {"1" , "7" },
1454
- {"1" , "13" },
1453
+ {"1234567" , "458948883992" },
1455
1454
{"239487239847" , "2410312426921032588552076022197566074856950548502459942654116941958108831682612228890093858261341614673227141477904012196503648957050582631942730706805009223062734745341073406696246014589361659774041027169249453200378729434170325843778659198143763193776859869524088940195577346119843545301547043747207749969763750084308926339295559968882457872412993810129130294592999947926365264059284647209730384947211681434464714438488520940127459844288859336526896320919633919" },
1456
1455
}
1457
1456
1458
1457
func TestModInverse (t * testing.T ) {
1459
- var element , prime Int
1458
+ var element , modulus , gcd , inverse Int
1460
1459
one := NewInt (1 )
1461
1460
for i , test := range modInverseTests {
1462
1461
(& element ).SetString (test .element , 10 )
1463
- (& prime ).SetString (test .prime , 10 )
1464
- inverse := new (Int ).ModInverse (& element , & prime )
1465
- inverse .Mul (inverse , & element )
1466
- inverse .Mod (inverse , & prime )
1467
- if inverse .Cmp (one ) != 0 {
1468
- t .Errorf ("#%d: failed (e·e^(-1)=%s)" , i , inverse )
1462
+ (& modulus ).SetString (test .modulus , 10 )
1463
+ (& inverse ).ModInverse (& element , & modulus )
1464
+ (& inverse ).Mul (& inverse , & element )
1465
+ (& inverse ).Mod (& inverse , & modulus )
1466
+ if (& inverse ).Cmp (one ) != 0 {
1467
+ t .Errorf ("#%d: failed (e·e^(-1)=%s)" , i , & inverse )
1468
+ }
1469
+ }
1470
+ // exhaustive test for small values
1471
+ for n := 2 ; n < 100 ; n ++ {
1472
+ (& modulus ).SetInt64 (int64 (n ))
1473
+ for x := 1 ; x < n ; x ++ {
1474
+ (& element ).SetInt64 (int64 (x ))
1475
+ (& gcd ).GCD (nil , nil , & element , & modulus )
1476
+ if (& gcd ).Cmp (one ) != 0 {
1477
+ continue
1478
+ }
1479
+ (& inverse ).ModInverse (& element , & modulus )
1480
+ (& inverse ).Mul (& inverse , & element )
1481
+ (& inverse ).Mod (& inverse , & modulus )
1482
+ if (& inverse ).Cmp (one ) != 0 {
1483
+ t .Errorf ("ModInverse(%d,%d)*%d%%%d=%d, not 1" , & element , & modulus , & element , & modulus , & inverse )
1484
+ }
1469
1485
}
1470
1486
}
1471
1487
}
0 commit comments