36 lines
1.2 KiB
Python
36 lines
1.2 KiB
Python
import unittest
|
|
from modpow import modpow, modinv
|
|
|
|
|
|
class TestModpow(unittest.TestCase):
|
|
def test_basic(self):
|
|
self.assertEqual(modpow(2, 10, 1000), 24)
|
|
self.assertEqual(modpow(5, 0, 7), 1)
|
|
self.assertEqual(modpow(0, 5, 7), 0)
|
|
def test_large(self):
|
|
self.assertEqual(modpow(2, 100, 10**9 + 7), pow(2, 100, 10**9 + 7))
|
|
def test_negative_exp(self):
|
|
self.assertEqual(modpow(3, -1, 11), 4)
|
|
self.assertEqual(modpow(2, -3, 7), pow(2, -3, 7))
|
|
def test_mod_one(self):
|
|
self.assertEqual(modpow(5, 3, 1), 0)
|
|
def test_invalid_mod(self):
|
|
with self.assertRaises(ValueError):
|
|
modpow(2, 3, 0)
|
|
with self.assertRaises(ValueError):
|
|
modpow(2, 3, -5)
|
|
def test_noninvertible_neg(self):
|
|
with self.assertRaises(ValueError):
|
|
modpow(2, -1, 4)
|
|
def test_modinv(self):
|
|
self.assertEqual(modinv(3, 11), 4)
|
|
self.assertEqual((3 * modinv(3, 11)) % 11, 1)
|
|
with self.assertRaises(ValueError):
|
|
modinv(2, 4)
|
|
def test_negative_base(self):
|
|
self.assertEqual(modpow(-2, 3, 5), pow(-2, 3, 5))
|
|
|
|
|
|
if __name__ == "__main__":
|
|
unittest.main()
|