def isPrimeFermat(N):
	if N % 2 == 0:
		return False
	s = 0
	d = N-1
	while d % 2 == 0:
		s += 1
		d = d // 2
	# Now we have N = 1 + 2**s * d
	for test in xrange(1,25):
		a = random.randint(1, N-1)
		# Using modPow is ESSENTIAL (otherwise we get MASSIVE numbers)
		if nf.modPow(a,d,N) != 1: # Did not pass first test
			passed = False
			for j in xrange(s):
				if nf.modPow(a,d * (2**j),N) == N - 1:
					passed = True
			if not passed:
				return False
	return True
	for i in xrange(2*3*5*7,10**9):
		nFactors = len(set(pf.factorTrialDivision(i,primeList)))
		if nFactors == runLength:
			distinctPrimeRun += 1
			if distinctPrimeRun == runLength:
				print (i-3,i-2,i-1,i)
				break
		else:
			distinctPrimeRun = 0

#####################################################################
# Problem 48
if problem == 48:
	s = 0
	for i in xrange(1,1000):
		s += nf.modPow(i,i,10**10)
	print s % (10**10)


#####################################################################
# Problem 49
if problem == 49:
	primeList = pf.sieveEratosthenes(10000)

	# Find the first 4 digit prime
	i = 0
	while i < len(primeList):
		if primeList[i] > 1000:
			startIndex = i
			break
		i = i+1