#ulam_spiral.py #use ezgraphics create an image file of Ulam sprial of the primes from math import sqrt def is_prime(n): if n == 1: return False if n == 2: return True else: if n%2 == 0: #even no. return False t = 3 while t <= sqrt(n): #odd nos. up to sqrt N if n%t == 0: return False t += 2 #all odds. would be better if a list of primes, or generate them? return True import ezgraphics width = int(input("Enter square width of image file: ")) win = ezgraphics.GraphicsWindow(width,width) img = ezgraphics.GraphicsImage(width,width) cycles = width // 2 r = c = cycles #start at middle of square image img.setPixel(r,c, 255,0,0) #red marks the middle n = 1 #middle is 1 ? for sqr in range(3,2*cycles+3,2): r = r - 1 #go up n += 1 if is_prime(n): img.setPixel(r,c, 0,0,0) else: img.setPixel(r,c, 255,255,255) for left in range(1,sqr-1): #sqr-2 times c = c - 1 n += 1 if is_prime(n): img.setPixel(r,c, 0,0,0) else: img.setPixel(r,c, 255,255,255) #img.setPixel(r,c, 255,0,0) for down in range(1,sqr): #sqr-1 times r = r + 1 n += 1 if is_prime(n): #inefficient... img.setPixel(r,c, 0,0,0) else: img.setPixel(r,c, 255,255,255) for right in range(1,sqr): c = c + 1 n += 1 if is_prime(n): img.setPixel(r,c, 0,0,0) else: img.setPixel(r,c, 255,255,255) for up in range(1,sqr): r = r - 1 n += 1 if is_prime(n): img.setPixel(r,c, 0,0,0) else: img.setPixel(r,c, 255,255,255) print("n",n,"r",r,"c",c) img.save("ulam_spiral.gif","gif")