Files
troupe-standup/wizard-work/beam/test_modpow.py
T

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()