Không phải đi bộ ngẫu nhiên như vậy

Jan 18 2021

Tôi ra ngoài đi bộ rất dài và cảm thấy buồn chán, vì vậy tôi quyết định đi bộ theo phương pháp toán học.

Hình ảnh đầu tiên hiển thị 500 bước đầu tiên và hình ảnh thứ hai là con đường của tôi sau 50000 bước. Màu sắc chủ yếu dành cho mục đích hình dung.

Con đường của tôi không phải là ngẫu nhiên, vậy tôi đã chọn con đường của mình như thế nào? Vui lòng cho tôi biết nếu bạn cần gợi ý.

Trả lời

20 Glorfindel Jan 18 2021 at 01:55

Có vẻ như bạn bắt đầu

vẽ một dấu chấm cho $n=0$ tại (1, 0)

và sau đó

quy trình để đi bộ 'về phía đông' (theo hướng x dương) và vẽ một dấu chấm cho mỗi $n$

rẽ trái 90 ° khi $n$ là nguyên tố.

4 Stefan Jan 18 2021 at 22:50

Glorfindel đã giải quyết vấn đề này trong vài phút, nhưng để bạn giải trí, tôi muốn hiển thị "giải pháp" dưới dạng tập lệnh Python. Tải xuống tệp số nguyên tố từhttps://primes.utm.edu/lists/small/millions/

Lưu ý rằng mã có thể được tối ưu hóa. Nó cập nhật con số cho 1 triệu bước trong khoảng một phút trên máy tính của tôi.

(xin lỗi, không thể bọc mã trong các thẻ 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()
          

Và hình ảnh khoảng 1 triệu bước ...

Chỉnh sửa: Cho vui, cũng là một hình ảnh với các hướng: E, NE, N, NW, W, SW, S, SE thay vì chỉ E, N, W, S