素数のこさを予想する
このワークシートはMath by Codeの一部です。
<素数の減り方>
前回、双子素数の分布を調べてみて、
最初は急に減りますが、そのあとは相当なだらかな減り方になっていました。
素数自体はどうでしょう。
幅で切って調べるとどうしても変動がでるので、
平均的な値、こさを調べる。
だから、区間で切るのでなく、累積で素数個数をたして、全体の範囲で割ろう。
まずは、数値化する。
最後に1/ln(x)と比べてグラフ化してみよう。
[IN]julia
#=====================================================
function isPrime(n)
lim = Int(round(n^0.5))
if n<2
return false
end
for num in 2:lim
if n % num ==0
return false
end
end
return true
end
limit=5000
size=limit/50
println(limit,"までの素数のこさ")
clxs=[]
rates=[]
ps=0
for cluster in 0:50
starting=0+cluster*size
ending=size-1+cluster*size
clx=size*(cluster+1)
N= [x for x in starting:ending]
P= filter(n->(isPrime(n)==true),N)
ps +=length(P)
rate = ps/clx
push!(rates,rate)
push!(clxs,clx)
end
println(clxs)
println(rates)
#=====================================================
limit=5000のとき、
[OUT]
5000までの素数のこさ
Any[100.0, 200.0, 300.0, 400.0, 500.0, 600.0, 700.0, 800.0, 900.0, 1000.0, 1100.0, 1200.0, 1300.0, 1400.0, 1500.0, 1600.0, 1700.0, 1800.0, 1900.0, 2000.0, 2100.0, 2200.0, 2300.0, 2400.0, 2500.0, 2600.0, 2700.0, 2800.0, 2900.0, 3000.0, 3100.0, 3200.0, 3300.0, 3400.0, 3500.0, 3600.0, 3700.0, 3800.0, 3900.0, 4000.0, 4100.0, 4200.0, 4300.0, 4400.0, 4500.0, 4600.0, 4700.0, 4800.0, 4900.0, 5000.0, 5100.0]
Any[0.25, 0.23, 0.20666666666666667, 0.195, 0.19, 0.18166666666666667, 0.17857142857142858, 0.17375, 0.1711111111111111, 0.168, 0.16727272727272727, 0.16333333333333333, 0.16230769230769232, 0.15857142857142856, 0.15933333333333333, 0.156875, 0.1564705882352941, 0.15444444444444444, 0.15263157894736842, 0.1515, 0.15095238095238095, 0.14863636363636365, 0.14869565217391303, 0.14875, 0.1468, 0.1453846153846154, 0.14555555555555555, 0.14535714285714285, 0.14448275862068966, 0.14333333333333334, 0.14258064516129032, 0.14125, 0.1403030303030303, 0.14058823529411765, 0.1397142857142857, 0.13972222222222222, 0.13945945945945945, 0.13894736842105262, 0.1382051282051282, 0.1375, 0.1378048780487805, 0.13666666666666666, 0.1372093023255814, 0.13613636363636364, 0.13555555555555557, 0.13521739130434782, 0.13489361702127659, 0.13458333333333333, 0.13346938775510203, 0.1338, 0.13352941176470587]
100までに25個、200までに46個、…..... という結果が、
x=100で、rates=0.25, x=200で、rate=0.23.,,,,,,,,というデータになっていることがわかるね。
もっと、xの桁数を上げて調べるとどうなるだろうか?
limit=1000000のとき、
[OUT]
1000000までの素数のこさ
Any[20000.0, 40000.0, 60000.0, 80000.0, 100000.0, 120000.0, 140000.0, 160000.0, 180000.0, 200000.0, 220000.0, 240000.0, 260000.0, 280000.0, 300000.0, 320000.0, 340000.0, 360000.0, 380000.0, 400000.0, 420000.0, 440000.0, 460000.0, 480000.0, 500000.0, 520000.0, 540000.0, 560000.0, 580000.0, 600000.0, 620000.0, 640000.0, 660000.0, 680000.0, 700000.0, 720000.0, 740000.0, 760000.0, 780000.0, 800000.0, 820000.0, 840000.0, 860000.0, 880000.0, 900000.0, 920000.0, 940000.0, 960000.0, 980000.0, 1.0e6,
1.02e6]
Any[0.1131, 0.105075, 0.10095, 0.0979625, 0.09592, 0.094175, 0.09292857142857143, 0.09176875, 0.09078888888888889, 0.08992, 0.08917272727272728, 0.08842083333333334, 0.08783461538461539, 0.08725714285714285, 0.08665666666666667, 0.086275, 0.08582941176470588, 0.08543611111111112, 0.085, 0.08465, 0.08426190476190476, 0.08395681818181819, 0.08360434782608696, 0.08334375, 0.083076, 0.08280961538461538, 0.08254074074074073, 0.08227142857142856, 0.08204827586206896, 0.08183, 0.08163225806451613, 0.081365625, 0.08115757575757576, 0.080975, 0.08077571428571428, 0.08059583333333334, 0.0804472972972973, 0.08023421052631578, 0.08008717948717949, 0.07993875, 0.07977560975609756, 0.07963095238095239, 0.07946744186046512, 0.07934431818181818, 0.07919333333333334, 0.07905869565217391, 0.07892234042553191, 0.07876875, 0.07863979591836735, 0.078498, 0.07840196078431373]
limit=10000000にすると
[OUT]
10000000までの素数のこさ
Any[200000.0, 400000.0, 600000.0, 800000.0, 1.0e6, 1.2e6, 1.4e6, 1.6e6, 1.8e6, 2.0e6, 2.2e6, 2.4e6, 2.6e6, 2.8e6, 3.0e6, 3.2e6, 3.4e6, 3.6e6, 3.8e6, 4.0e6, 4.2e6, 4.4e6, 4.6e6, 4.8e6, 5.0e6, 5.2e6, 5.4e6, 5.6e6, 5.8e6, 6.0e6, 6.2e6, 6.4e6, 6.6e6, 6.8e6, 7.0e6, 7.2e6, 7.4e6, 7.6e6, 7.8e6, 8.0e6, 8.2e6, 8.4e6, 8.6e6, 8.8e6, 9.0e6, 9.2e6, 9.4e6, 9.6e6, 9.8e6, 1.0e7, 1.02e7]
Any[0.08992, 0.08465, 0.08183, 0.07993875, 0.078498, 0.07744833333333333, 0.07651857142857142, 0.075704375, 0.07504, 0.0744665, 0.07393727272727273, 0.07345916666666667, 0.07303076923076923, 0.07262928571428572, 0.072272, 0.0719403125, 0.07162911764705883, 0.07131277777777778, 0.07104921052631578, 0.0707865, 0.07055095238095238, 0.0703034090909091, 0.07009586956521739, 0.069883125, 0.0697026, 0.06950134615384615, 0.0693262962962963, 0.06914321428571428, 0.06896431034482758, 0.06880816666666667, 0.06865290322580646, 0.0685015625, 0.06835742424242425, 0.0682164705882353, 0.06809257142857143, 0.06796097222222222, 0.0678327027027027, 0.06770592105263158, 0.06758384615384615, 0.067472125, 0.06735597560975609, 0.0672472619047619, 0.06714406976744186, 0.06704613636363636, 0.06694322222222222, 0.06683880434782609, 0.06674468085106383, 0.06665114583333333, 0.06655765306122449, 0.0664579, 0.06636960784313725]
質問:素数のこさをグラフにしてみましょう。どんな特徴が見えますか?
視覚化のためにパッケージをインストールします。
jupyter notebook のコードとして次の一行を入力して実行しましょう。
import Pkg; Pkg.add("PyPlot")
しばらくすると、パッケージがインストールされて、PyPlotが使えるようになります。
#julia
#======================
using PyPlot
xs= clxs
# 描画
ys1= rates
ys2= 1 ./(log.(xs))
plt.ylim(0, 0.12)
plt.plot(xs,ys1)
plt.plot(xs,ys2)
xs[end],ys2[end],ys1[end]
#======================
limit=1000000のとき
[OUT]
(1.02e6, 0.07227881195095438, 0.07840196078431373)
limit=10000000のとき
[OUT]
(1.02e7, 0.06196593774218297, 0.06636960784313725)
整数xまでの範囲での素数のこさは約1/ln(x)。
これはグラフから予想がつくね。
整数xまでの素数の個数をπ(x)とすると、素数のこさはπ(x)/xですね。
だからπ(x)/x≒1/ln(x)という式ができそうです。これが素数定理です。これをかきかえると、
ln(x)・π(x)/x≒1
π(x)/(x/ln(x))≒1
つまり、
素数の個数はx/ln(x)
に近づくだろうということだね。