The Ulam Spiral is a simple way to visualize the prime numbers which reveals unexpected, irregular structure. Starting at the centre of a rectangular grid of numbers and spiralling outwards, mark the primes as 1
and the composite numbers as 0
.
The following code generates an image of the Ulam Spiral. The hard part is generating a "spiralled"-version of a two-dimensional array, which is the job of the make_spiral
. This function takes a two-dimensional array of indices into the array, idx
, and successively appends the top row to a new list of indices, spiral_idx
. After each append, the appended row is removed from idx
and the remainder of the array rotated by $90^\circ$. The concatenated array of spiral_idx
is then used to index into the array to be "spiralled".
This code is also available on my github page.
import numpy as np
import matplotlib.pyplot as plt
import matplotlib.cm as cm
def make_spiral(arr):
nrows, ncols= arr.shape
idx = np.arange(nrows*ncols).reshape(nrows,ncols)[::-1]
spiral_idx = []
while idx.size:
spiral_idx.append(idx[0])
# Remove the first row (the one we've just appended to spiral).
idx = idx[1:]
# Rotate the rest of the array anticlockwise
idx = idx.T[::-1]
# Make a flat array of indices spiralling into the array.
spiral_idx = np.hstack(spiral_idx)
# Index into a flattened version of our target array with spiral indices.
spiral = np.empty_like(arr)
spiral.flat[spiral_idx] = arr.flat[::-1]
return spiral
# edge size of the square array.
w = 251
# Prime numbers up to and including w**2.
primes = np.array([n for n in range(2,w**2+1) if all(
(n % m) != 0 for m in range(2,int(np.sqrt(n))+1))])
# Create an array of boolean values: 1 for prime, 0 for composite
arr = np.zeros(w**2, dtype='u1')
arr[primes-1] = 1
# Spiral the values clockwise out from the centre
arr = make_spiral(arr.reshape((w,w)))
plt.matshow(arr, cmap=cm.binary)
plt.axis('off')
plt.show()
The prominent diagonal structures indicate that there are unexpectedly many primes of the form $f(n) = 4n^2 + bn + c$ for integer constants $b$ and $c$ and $n=1,2,3,\cdots$.
Share on Twitter Share on Facebook
Comments
Comments are pre-moderated. Please be patient and your comment will appear soon.
Derck van Schuylenburch 5 years, 2 months ago
All prime numbers -except 2 & 3- are adjacent to a multiple of 6. Many composite numbers are ALSO adjacent to a multiple of 6.
Link | ReplyWhen you populate an Ulam spiral with BOTH of these groups of numbers, the prime ones and the composite ones, you get
ENDLESS- UNINTERRUPTED- DIAGONAL rows of numbers in both diagonal directions.
All pairs of adjacent parallel rows of numbers are identically spaced. 2 subset-spirals can be derived from the foregoing:
one populated with ONLY the composite numbers adjacent to a multiple of 6 and one populated with ONLY the prime numbers adjacent to a multiple of 6.
This last subset-spiral is identical to the standard Ulam spiral except: 2 & 3 not shown, as they are not adjacent to a multiple of 6, while 1 is shown as it is adjacent to 0, which is amultiple of 6.
For more of this, please see:
https://www.ulamspiralmethod.com
New Comment