7 def divisible_by(dividend, divisor):
8 return dividend % divisor == 0
11 return divisible_by(n, 2)
13 def take_while_less_than(n, xs):
16 return itertools.takewhile(less_than_n, xs)
18 def take_while_less_than_or_equal(n, xs):
19 def less_than_or_equal_to_n(x):
22 return itertools.takewhile(less_than_or_equal_to_n, xs)
30 temporary = previous + current
34 def fibonacci_less_than(n):
35 return take_while_less_than(n, fibonacci())
37 class FibonacciTestCase(unittest.TestCase):
38 def test_fibonacci_less_than_ten(self):
39 expected = [1, 2, 3, 5, 8]
40 actual = list(fibonacci_less_than(10))
41 self.assertEqual(expected, actual)
44 return itertools.ifilter(is_even, xs)
46 class EvensTestCase(unittest.TestCase):
48 expected = [0, 2, 4, 6, 8]
49 actual = list(evens(range(10)))
50 self.assertEqual(expected, actual)
52 def any(predicate, xs):
60 composites_to_witnesses = {}
62 for n in itertools.count(2):
63 if n in composites_to_witnesses:
64 for witness in composites_to_witnesses[n]:
65 composites_to_witnesses.setdefault(n + witness, []).append(witness)
68 composites_to_witnesses[n * n] = [n]
70 def primes_less_than(n):
71 return take_while_less_than(n, primes())
74 return itertools.islice(primes(), n)
79 for prime in primes():
80 while divisible_by(remaining, prime):
82 remaining = remaining / prime
95 class PrimesTestCase(unittest.TestCase):
96 def test_primes(self):
97 expected = [2, 3, 5, 7, 11, 13, 17, 19]
98 actual = list(primes_less_than(20))
99 self.assertEqual(expected, actual)
101 def test_factors(self):
102 expected = [2, 3, 7, 19, 31]
103 actual = list(factors(product(expected)))
104 self.assertEqual(expected, actual)
106 def first(xs, predicate = lambda x : True):
114 def is_palindromic(n):
116 return n[:] == n[::-1]
118 class PalindromicTestCase(unittest.TestCase):
119 def test_is_palindromic(self):
120 self.assertTrue(is_palindromic(505))
121 self.assertTrue(is_palindromic(2002))
122 self.assertFalse(is_palindromic(8675309))
124 def numbers_with_digits(digits, radix = 10):
125 start = pow(radix, digits - 1)
126 end = pow(radix, digits)
127 return range(start, end)
135 return a * b / gcd(a, b)
138 return range(1, n + 1)
143 def squares(start = 0):
144 return itertools.imap(square, itertools.count(start))
146 def is_perfect_square(n):
148 return root == int(root)
150 def pythagorean_triplets():
151 for square in squares(5):
152 for i in range(9, square / 2):
153 if is_perfect_square(i):
155 if is_perfect_square(j):
156 yield (int(math.sqrt(i)), int(math.sqrt(j)), int(math.sqrt(square)))
158 if __name__ == '__main__':