Skip to content

Instantly share code, notes, and snippets.

@wcharczuk
Created April 13, 2012 18:57
Show Gist options
  • Save wcharczuk/2379193 to your computer and use it in GitHub Desktop.
Save wcharczuk/2379193 to your computer and use it in GitHub Desktop.
Pi Spigot Algorithm + Primality Check + Palindrome Check
#naive implementation of a pi spigot algorithm
def gen_pi(n):
q, r, t, k, m, x = 1, 0, 1, 1, 3, 3
for j in range(n):
if 4 * q + r - t < m * t:
yield m
q, r, t, k, m, x = 10*q, 10*(r-m*t), t, k, (10*(3*q+r))/t - 10*m, x
else:
q, r, t, k, m, x = q*k, (2*q+r)*x, t*x, k+1, (q*(7*k+2)+r*x)/(t*x), x+2
def isPrime(number):
if number == 4:
return False
elif number in [1,2,3]:
return True
else:
return all(number % i for i in xrange(2, number/2))
def arePrime(list):
return all(isPrime(i) for i in list)
def isPalindrome(list):
j, k = 0, len(list) - 1
if len(list) in [0,1]:
return True
elif len(list) == 2:
return list[0] == list[1]
elif len(list) % 2 == 1:
while j != k:
if list[j] != list[k]:
return False
else:
j, k = j+1, k-1
else:
while j > k:
if list[j] != list[k]:
return False
else:
j,k = j+1, k-1
return True
def findDigits():
rolling = []
for i in gen_pi(1000000):
rolling.append(i)
if len(rolling) > 7:
rolling.pop(0)
if len(rolling) == 7 and isPalindrome(rolling) and isPrime(int(listAsString(rolling))):
return rolling
def listAsString(list):
return "".join([str(digit) for digit in list])
print listAsString(findDigits())
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment