import unittest
import pyfmi.testcase
import math
from itertools import *

points = 5

def sieve(numbers):
	while True:
		prime = numbers.next()
		numbers = removeMultiples(prime, numbers)
		yield prime

def removeMultiples(prime, numbers):
	for x in numbers:
		if x % prime != 0:
			yield x

def recSievePrimes():
	return sieve(count(2))

def quadriples(seq):
	it = iter(seq)
	quad = (None, it.next(), it.next(), it.next())
	for x in it:
		quad = quad[1:] + (x,)
		yield quad
		
def combinePrimes():
	usedFirst = False
	for (a,b,c,d) in quadriples(primes()):
		if not usedFirst:
			yield (a, b)
		usedFirst = False
		yield (a, c)
		if a+d > b+c:
			yield (b, c)
			usedFirst = True
		yield (a, d)

def iterSievePrimes():
	primes = [2]
	yield 2
	for x in count(3):
		for prime in primes:
			if x % prime == 0:
				break
		else:
			primes += [x]
			yield x
		

def iterMemlessPrimes():
	yield 2
	for x in count(3):
		for i in xrange(2, int(math.sqrt(x))+1):
			if x % i ==0:
				break
		else:
			yield x

primes = iterMemlessPrimes

class ProblemTests(pyfmi.testcase.SpeakingTestCase):
	def testSimple(self):
		self.assertEqual(map(sum, islice(self.user.combinePrimes(), 5)), map(sum, [(2, 3), (2, 5), (3, 5), (2, 7), (3, 7)]))
	def testMore(self):
		self.assertEqual(map(sum, islice(self.user.combinePrimes(), 10)), map(sum, [(2, 3), (2, 5), (3, 5), (2, 7), (3, 7), (5, 7), (3, 11), (5, 11), (5, 13), (7, 11)]))
	def testMoreMore(self):
		self.assertEqual(map(sum, islice(self.user.combinePrimes(), 100, 110))
, map(sum, [(139, 151), (139, 157), (149, 151), (149, 157), (151, 157), (149, 163), (151, 163), (151, 167), (157, 163), (157, 167)] ))

if __name__ == "__main__":
	ProblemTests.user_filename = "test.py";
	unittest.main()
