La espiral de Ulam

La espiral Ulam o espiral prima es una representación gráfica del conjunto de números primos. Enfatiza la apariencia llamativa en la espiral de líneas diagonales, horizontales y verticales prominentes que contienen una gran cantidad de números primos.

¿Cómo construir la Espiral de Ulam?
La espiral numérica se construye escribiendo los números enteros positivos en una disposición en espiral en un enrejado cuadrado, como se muestra.

La espiral de Ulam se produce marcando especialmente los números primos, por ejemplo, encerrando en un círculo los números primos o escribiendo solo los números primos o escribiendo los números primos y los números no primos en diferentes colores, para obtener una figura como la que se muestra a continuación.

Code to Generate Prime Number
#importing the required libraries
import math
import itertools

def primes():
    yield 2
    primesSoFar = [2]
    for candidate in itertools.count(3, 2):
        for prime in (i for i in primesSoFar if i  100:      
            break
        print(p)

if __name__ == "__main__":
    main()

Pero eso no es lo que queríamos. Queríamos generar la espiral de Ulam, ¿no?
Apenas está comenzando, por lo que el siguiente paso es generar la espiral principal; para generar un píxel por cada número natural, blanco o negro, dependiendo de si el número es primo o no. Para generar dicho gráfico, utilizaremos la biblioteca matplotlib de python y numpy con fines matemáticos.

Así que ahora la pregunta es ¿cómo debemos abordar? Es una idea bastante simple. Primero tenemos que generar una array de números primos de tamaño ‘n^2’. Luego, cree una array de valores booleanos: 1 para números primos, 0 para compuestos del mismo tamaño ‘n^2’. El siguiente paso debe ser convertir la segunda array de valores booleanos en espiral en el sentido de las agujas del reloj desde el centro y para hacerlo podemos proceder con los siguientes pasos:

1: Genere una array con elementos que contengan ‘n*n’ y luego cambie la forma de la array a la forma de array de orden ‘n X n’.

2: Cree otra lista vacía y luego agregue la primera fila de la array generada en el paso 1.

3: Retire la primera fila (la que acabamos de agregar a la espiral).

4: Gire el resto de la array en sentido contrario a las agujas del reloj.

5: Haga una array plana de índices en espiral dentro de la array.

6: Índice en una versión aplanada de nuestra array objetivo con índices en espiral.

Y después de seguir los pasos, está listo para comenzar y, por último, simplemente trazar la array que obtuvimos después de las siguientes operaciones usando matplotlib como se mencionó anteriormente. El código se proporciona a continuación, pero le recomiendo encarecidamente que pruebe esto primero usted mismo y luego profundice en el código.

# Python code to print Ulam's spiral
import numpy as np
import matplotlib.pyplot as plt
import matplotlib.cm as cm
  
# function to plot out the ulam spiral
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()

Para una mejor comprensión de este concepto matemático, consulte este video.

Este artículo es una contribución de Subhajit Saha . Si le gusta GeeksforGeeks y le gustaría contribuir, también puede escribir un artículo usando contribuya.geeksforgeeks.org o envíe su artículo por correo a contribuya@geeksforgeeks.org. Vea su artículo que aparece en la página principal de GeeksforGeeks y ayude a otros Geeks.

Escriba comentarios si encuentra algo incorrecto o si desea compartir más información sobre el tema tratado anteriormente.

Publicación traducida automáticamente

Artículo escrito por GeeksforGeeks-1 y traducido por Barcelona Geeks. The original can be accessed here. Licence: CCBY-SA

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *