Caminata no tan al azar
Salgo a dar una caminata muy larga y estoy aburrido, así que decido caminar de manera matemática.
La primera imagen muestra los primeros 500 pasos, y la segunda imagen es mi camino después de 50000 pasos. Los colores son principalmente para fines de visualización.
Mi ruta no es aleatoria, entonces, ¿cómo seleccioné mi ruta? Por favor, avíseme si necesita sugerencias.
Respuestas
Parece que empiezas
dibujar un punto para $n=0$ A las 10)
y entonces
proceso para caminar 'hacia el este' (en la dirección x positiva) y dibujar un punto para cada $n$
y
hacer un giro de 90 ° a la izquierda cuando $n$ es primordial.
Glorfindel resolvió esto en unos minutos, pero para su entretenimiento, me gustaría mostrar la "solución" como un script de Python. Descargue el archivo de números primos dehttps://primes.utm.edu/lists/small/millions/
Tenga en cuenta que el código podría optimizarse. Actualiza la cifra de 1 millón de pasos en aproximadamente un minuto en mi PC.
(lo siento, no puedo envolver el código en etiquetas de spoiler)
# -*- coding: utf-8 -*-
import os
#Use seperate window for plot (when run from Spyder)
if any('SPYDER' in name for name in os.environ):
from IPython import get_ipython
get_ipython().run_line_magic('matplotlib', 'qt')
import numpy as np
import matplotlib.pyplot as plt
def fib(n):
#iterator for Fibonacci sequence
a, b = 1, 1
for _ in range(n):
yield a
a, b = b, a + b
def annot(plist, index, ymax):
x=plist[index][1]
y=plist[index][2]
p=plist[index][0]
plt.annotate(str(p),xy=(x,y),xytext=(x+10,y+ymax//10),
arrowprops=dict(arrowstyle= '->', color='blue',lw=0.5) )
def readPrimes():
# read prime number sequence from file
#fileName = 'primes-to-100k.txt' ## from https://www.mathsisfun.com/numbers/prime-number-lists.html
fileName = 'primes1.txt' ## from https://primes.utm.edu/lists/small/millions/
with open(fileName) as f:
#skip header
for i in range(3):
_ =f.readline()
strPrimes=f.read().split()
return np.array([int(p) for p in strPrimes])
return None
def sequenceSnake(N=1000, D=4, sequence =None):
if sequence is None:
primes=np.array(readPrimes())
sequence=primes
def isInSequence(n):
index=np.searchsorted(sequence,n)
return n==sequence[index]
def getCoords4(pos, dir):
x=pos[0]
y=pos[1]
if dir==0:
return x+1,y
if dir==1:
return x,y+1
if dir==2:
return x-1,y
if dir==3:
return x,y-1
def getCoords8(pos, dir):
x=pos[0]
y=pos[1]
if dir==0:
return x+1,y
if dir==1:
return x+1,y+1
if dir==2:
return x,y+1
if dir==3:
return x-1,y+1
if dir==4:
return x-1,y
if dir==5:
return x-1,y-1
if dir==6:
return x,y-1
if dir==7:
return x+1,y-1
dir=0
x,y=(0,0)
p=1
ymax=0
xlist=[]
ylist=[]
clist=[]
plist=[]
for i in range(0,N):
if D==4:
x,y=getCoords4((x,y),dir)
else:
x,y=getCoords8((x,y),dir)
if i >= sequence[-1]:
print("warning: out of range, i="+str(i))
break
if isInSequence(i):
p=i
plist.append((p,x,y))
dir=(dir+1)%D
#print(i, dir)
if np.abs(y)>ymax:
ymax=np.abs(y)
clist.append(p)
xlist.append(x)
ylist.append(y)
return xlist, ylist, clist,plist,ymax
#
showAnnotate=False
showFirstAndLastPrime=True
drawLine=False
n=10000
seqType=0
seq=None # default is prime number sequence.
#different sequences to test
if seqType==1:
#fibonacci sequence
seq=np.array(list(fib(1000)))
elif seqType==2:
#square sequence
seq=np.arange(1000)**2
elif seqType==3:
#cumulative random sequence
seq=np.random.randint(10, size=10000)
seq=np.cumsum(seq)
xlist, ylist, clist,plist, ymax = sequenceSnake(N=n, D=4, sequence=seq)
if drawLine:
plt.plot(xlist,ylist, 'k-')
plt.scatter(xlist, ylist, marker='.', c=clist, cmap=plt.cm.prism)
#
if showAnnotate:
for i,item in enumerate(plist):
if i%100== 0:
annot(plist,i, ymax)
if showFirstAndLastPrime:
annot(plist,0, ymax)
annot(plist,-1, ymax)
plt.show()
Y una imagen de aproximadamente 1 millón de pasos ...
Editar: Para divertirse, también una imagen con direcciones: E, NE, N, NW, W, SW, S, SE en lugar de solo E, N, W, S