Skip to content

Instantly share code, notes, and snippets.

@knzm
Created February 22, 2012 20:01
Show Gist options
  • Save knzm/1886910 to your computer and use it in GitHub Desktop.
Save knzm/1886910 to your computer and use it in GitHub Desktop.
from math import sqrt, floor
__all__ = ['is_prime', 'Prime']
class Prime(object):
def __init__(self):
self._primes = [2, 3, 5]
def is_prime(self, n):
if n < 2:
return False
if n in self._primes:
return True
for p in self._primes:
if n % p == 0:
return False
if p * p > n:
break
limit = int(floor(sqrt(n))) + 1
for i in xrange(self._primes[-1] + 2, limit):
if not self.is_prime(i):
continue
if n % i == 0:
return False
for i in xrange(limit, n):
if 0 in (n % 2, n % 3, n % 5):
continue
self.is_prime(i)
self._primes.append(n)
return True
_prime = Prime()
def is_prime(n):
return _prime.is_prime(n)
import unittest
import random
from prime import Prime
class PrimeTestCase(unittest.TestCase):
def assertPrime(self, n):
self.assertTrue(Prime().is_prime(n))
def assertNotPrime(self, n):
self.assertFalse(Prime().is_prime(n))
def test_boundary_minus(self):
self.assertNotPrime(-1)
def test_boundary_zero(self):
self.assertNotPrime(0)
def test_boundary_one(self):
self.assertNotPrime(1)
def test_boundary_two(self):
self.assertPrime(2)
def test_square(self):
self.assertNotPrime(49)
def test_gap(self):
self.assertPrime(97)
self.assertNotPrime(77)
self.assertPrime(7)
self.assertPrime(23)
def test_big_prime(self):
self.assertPrime(997)
def test_big_non_prime(self):
self.assertNotPrime(10000)
def test_all_small_primes(self):
p = Prime()
r = range(100)
random.shuffle(r)
q = [i for i in r if p.is_prime(i)]
# print r, '=>', q
expected = [2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37, 41,
43, 47, 53, 59, 61, 67, 71, 73, 79, 83, 89, 97]
self.assertEquals(sorted(q), expected)
if __name__ == '__main__':
unittest.main()
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment