如何讓很多很多的質數排列成一個順時針螺旋形的圖案?

以1為中心點,順時針螺旋狀延伸到一個很大的數,然後將其中的所有質數點都標上紅顏色,形成一個圖案。我很好奇這個圖案會是什麼樣子的?但前提是用什麼數學工具可以形成這個結果。


23333,three years ago...

HighlightGraph[PathGraph[Range[7*10^3],VertexSize-&>{"Scaled", 0.01},VertexShapeFunction-&>{_?PrimeQ-&>"Star"},EdgeStyle-&>White],Table[Prime@i,{i,1PrimePi[7*10^3]}]]

or

f[{xc_, yc_}, name_, {w_, h_}] := {Red, Rectangle[{xc - w, yc - h}, {xc + w, yc + h}]};
PathGraph[Range[10^4], VertexSize -&> {"Scaled", 0.008}, VertexShapeFunction -&> {_?PrimeQ -&> f}, EdgeStyle -&> White]


首先聲明,下面引用的Mathematica代碼不是我原創,是在這個地方(Generating an Ulam spiral)看到,也可以參考這裡(Give us your best (Mathematica) one-liner)。由於構造非常巧妙,所以忍不住貼出來分享,並稍微補充做一些說明。

注意到題主的圖中,從原點1開始,每個拐角的地方分別按照長度為:1,1,2,2,3,3...的順序增加,而且線段按照順時針旋轉。(下面的代碼是逆時針,不過這個不重要,把虛數I改成-I即可)

F[n_] := {Re[#], Im[#]} /@ Fold[Join[#1, Last[#1] + I^#2 Range[#2/2]] , {0}, Range[n]]

G[n_] := Table[#[[Prime[k]]], {k, 1, PrimePi[n^2/4 + 1]}] [F[n]]

F函數的作用在於按照順序生成整數對應的點,這個代碼巧妙地方在於:

1、用了Fold函數實現迭代過程(其他更瑣碎的技巧還有比如用了Range實現自動取整,用了Plus的Listable屬性縮短代碼)

2、用I的n次方實現了逆時針旋轉,最後分別取實部和虛部生成對應的點,代碼短,速度快。

G函數在於標記質數對應的點,沒什麼說的,最後畫圖

ListPlot[G[500], AspectRatio -&> Automatic]

至於樓上把合數按分解因子的多少畫成大小不同的圓形這一個圖形,我自己也用Mathematica實現了一下(思路比較直接,不過代碼有點丑,將就著看吧):

pntStyle[n_, ratio_] := If[Total@# == 1, {Red, PointSize[1/ratio]}, {Blue, PointSize[Total@#/ratio]}] /@ Map[Last, FactorInteger@Range@Length@F[n], {2}]

spiralPlot[n_, ratio_] := Graphics@(Flatten /@ Transpose@{pntStyle[n, ratio], Point /@ F[n]})

pntStyle按照每個點對應整數的因子的多少生成不同的繪畫方式,ratio控制每個點的大小(數值越大,點越小),然後用piralPlot負責畫圖。

比如:spiralPlot[50, 200.],生成這個


我的思路比較捉雞...

手推每個數的坐標...

SpiralMatrix[n_?OddQ]:=Permute[Range[n^2],Accumulate@Take[Join[{n^2+1}/2,Flatten@Table[(-1)^j i,{j,n},{i,{-1,n}},{j}]],n^2]]~Partition~n;
SpiralMatrix[n_]:=SpiralMatrix[n+1][[1;;-2,2;;-1]]

然後坐標出來了直接染色...

好像速度也沒快到哪裡去...


PathGraph[Range[100], GraphStyle -&> "DiagramBlue", EdgeStyle -&> White,

GraphHighlight -&> Select[Range[100], PrimeQ]]

樓上大神們的代碼都太高深,我弄個簡單的,一句話。

效果是這樣的:

貌似沒有想像中的整齊,湊合一下吧。

還有一個大問題,題主要的是順時針的,我這個成了逆時針的。沒辦法啊,PathGraph就是這樣,怎麼辦呢?


參見這個問題

極坐標表示 5000 到 50000 之間的素數為什麼會形成一條斐波那契螺旋線?

使用了更加優美的極坐標(而不是限制在方格里),並且有比較容易理解的成因說明。


推薦閱讀:

參加數學建模比賽是怎麼樣一種體驗?
數學建模網路挑戰賽怎麼樣,研究生有沒有必要參加?
數學建模編程方向的只會MATLAB可以嗎?
怎樣看待2017數學建模國賽AB題都需要大量數據處理。?
全國數學建模大賽的國家一等獎名額是如何分配的?

TAG:數學 | WolframMathematica | 數學建模 | 素數 |