58.py 911 B

123456789101112131415161718192021222324252627282930313233343536373839404142434445
  1. from math import sqrt
  2. def prime(n):
  3. """Returns a boolean indicating whether an integer is a prime"""
  4. if n <= 1:
  5. return False
  6. for i in range(2, int(sqrt(n) + 1)):
  7. if n % i == 0:
  8. return False
  9. return True
  10. # Set of helper functions along each diagonal
  11. def upright(d):
  12. return 4*d**2-10*d+7
  13. def upleft(d):
  14. return 4*d**2-8*d+5
  15. def downleft(d):
  16. return 4*d**2-6*d+3
  17. def downright(d):
  18. return 4*d**2-4*d+1
  19. # Starting values for while loop
  20. primeRatio = 1.0
  21. sideLen = 3
  22. numPrimes = 0
  23. while primeRatio > 0.10:
  24. diagonalLen = (sideLen+1)/2
  25. totalDiagonals = (diagonalLen-1)*4 + 1
  26. if prime(upright(diagonalLen)):
  27. numPrimes += 1
  28. if prime(upleft(diagonalLen)):
  29. numPrimes += 1
  30. if prime(downright(diagonalLen)):
  31. numPrimes += 1
  32. if prime(downleft(diagonalLen)):
  33. numPrimes += 1
  34. primeRatio = numPrimes / float(totalDiagonals)
  35. sideLen += 2
  36. # Adjust sidelength by 2
  37. print sideLen - 2
  38. print primeRatio