可以找到兩個質數,他們的比值最接近 π 嗎?

如題。

幼兒園版本:可以找到最接近 π 的兩個整數之比嗎?


有人證明了兩個素數相除也是稠密的。。。

Using Quotient of Prime Numbers to Approximation Reals?

mathoverflow.net圖標

所以任給一個實數x&<π,必然能在(x, π)區間內找到一對素數P,Q使得 [公式]

所以答案是否定的。


最高票答案的素數之比稠密並不是多難證明的問題,這就是個素數定理的簡單推論,評論里不能寫公式,單寫一下證明吧:

素數定理 [公式]

給定任意正數 [公式] ,都有:

[公式]

極限大於1,說明只要x足夠大, [公式][公式] 之間必然有至少一個質數。

利用這個,對於任意正實數a,給定任意鄰域大小 [公式] ,找一對素數p,q滿足 [公式]

怎麼找,很簡單,轉換一下: [公式]

所以根據前面的結論,只要aq足夠大(先找一個足夠大的質數q), [公式][公式] 之間必然有一個質數p,證畢。


Mathematica對於該問題的解答

首先其他答主已經說明了,質數的比值是稠密的,因此顯然答案是否定的(可以仿照極限的定義)。而整數與整數的比值,是有理數, [公式] 是無理數,因此兩質數之比可以無限逼近 [公式] 卻不能與之相等。現用Mathematica探討此問題。首先,只要有一個給定的「精度預期」,必然可以找出在該精度範圍內最接近 [公式] 的質數比值。需要說明的是,這個「精度預期」可以用分子的最大或分母的最大值來定義。鑒於答主極Low的Mathematica水平,這裡採用比較易於編寫的分子最大值為例。

先給出完整的代碼

FractionList[x_] := Table[Prime[x]/Prime[n], {n, 1, x}]
p[x_] := Flatten[
Position[Abs[FractionList[x] - Pi],
Min@Abs[FractionList[x] - Pi]]][[1]]
MinLossFraction[x_] := FractionList[x][[p[x]]]
ApPiList[x_] := Table[MinLossFraction[n], {n, 1, x}]
MP[x_] :=
ApPiList[x][[Flatten[
Position[Abs[ApPiList[x] - Pi],
Min[Abs[ApPiList[x] - Pi]]]][[1]]]]

大致的思路是:先找出以第 [公式]個質數為分子 , [公式] 以內所有質數為分母的所有比值構成的List,然後再與[公式]作差,取絕對值。選出差最小的那一項所對應的比值。然後取一定範圍以內的所有質數重複以上操作,再從中取最小值對應的比值即可

運行示例如下:

但這種演算法的問題在於,需要先把所有可能的比值都算出來,再進行比較。這就造成了運算所需的時間被大大拉長,而實際上很多計算是不必要的。以本人老爺機的I5-4590為例,運算第120個質數以內最接近 [公式] 的比值所需要的時間就有0.33s。如果再把精度提升,到了1000個質數以內,運算時間就會大幅度增加到41.52s之長。而這顯然不利於高精度計算。

精度的分布

為了研究當分子大小變化時比值的精度情況(即與 [公式] 的差的絕對值),現取第 [公式] 到第 [公式] 個質數作為分子,取以每一種情況下最接近 [公式] 的那個比值的精度。

Table[Abs[MP[n] - Pi], {n, 1, 80}]

輸出結果:{2.14159, 1.64159, 0.641593, 0.358407, 0.358407, 0.358407, 0.258407, 0.258407, 0.144122, 0.144122, 0.144122, 0.144122, 0.0122535, 0.0122535, 0.0122535, 0.0122535, 0.0122535, 0.0122535, 0.0122535, 0.0122535, 0.0122535, 0.0122535, 0.0122535, 0.0122535, 0.0122535, 0.0122535, 0.0122535, 0.0122535, 0.0122535, 0.0122535, 0.0122535, 0.0122535, 0.0122535, 0.0122535, 0.0122535, 0.0122535, 0.0122535, 0.0122535, 0.00935074, 0.00935074, 0.00935074, 0.00935074, 0.00935074, 0.00935074, 0.00935074, 0.00935074, 0.00766108, 0.000747583, 0.000747583, 0.000747583, 0.000747583, 0.000747583, 0.000747583, 0.000747583, 0.000747583, 0.000747583, 0.000747583, 0.000747583, 0.000747583, 0.000747583, 0.000747583, 0.000747583, 0.000747583, 0.000747583, 0.000747583, 0.000747583, 0.000747583, 0.000747583, 0.000747583, 0.000747583, 0.000747583, 0.000747583, 0.000747583, 0.000747583, 0.000747583, 0.000747583, 0.000747583, 0.000747583, 0.000747583, 0.000747583}

繪製成圖像如下所示:

前面幾個數據因為過大因此沒有給出顯示

由圖像可以看出,精度隨「精度預期」的增加呈階梯狀下降。因為電腦運算能力有限,所以沒能給出更加靠後的數據。

因此我們可以得出結論,隨著「精度預期」的增加,

①可以得到越來越精確的質數之比,使得它更加接近於 [公式]

②不存在一組質數 [公式] ,使得其比值恰好為 [公式] ,因為有理數 [公式] 無理數

③永遠都不會有一組質數的比最接近於 [公式] ,因為質數的比是稠密的


8.23 20:44

經過優化,現運算速度大幅度提高。修改後的代碼如下:

FindRegion1[x_] := PrimePi[Prime[x]/3.2]
FindRegion2[x_] := PrimePi[Prime[x]/3.08]
FractionList[x_] :=
Table[Prime[x]/Prime[n], {n, FindRegion1[x], FindRegion2[x]}]
p[x_] := Flatten[
Position[Abs[FractionList[x] - Pi],
Min@Abs[FractionList[x] - Pi]]][[1]]
MinLossFraction[x_] := FractionList[x][[p[x]]]
ApPiList[x_] := Table[MinLossFraction[n], {n, 4, x}]
MP[x_] :=
ApPiList[x][[Flatten[
Position[Abs[ApPiList[x] - Pi],
Min[Abs[ApPiList[x] - Pi]]]][[1]]]]

優化方法是將分母的範圍大大縮小,從原來的小於 [公式] 的全體質數修改到了現在分子的 [公式][公式] 。這可以減少許多冗餘的計算,從而提高運算速度。

新代碼的運行時間如下:

只花費了1.51s,相當於原來的 [公式] ,而當「精度預期」更高時,時間的減少倍數將會越高。答主測試時,用舊代碼運行 [公式] 需要180s,而用新代碼運行只需要4.5s。

值得注意的是,當用FindRegion函數進行範圍縮小時, 在[公式] ~ [公式] 的運算中,因為 [公式]過小,所以會出現「第0個質數」導致程序錯誤。而本身 [公式] ~ [公式] 精度舊非常低,沒有什麼實際意義,所以就將這三組近似的計算從程序中刪除了。


8.24 9:03

非常感謝評論區@233所提供的思路。修改後的代碼如下:

FindPrime1[x_] := PrimePi[Prime[x]/Pi]
FindPrime2[x_] := PrimePi[Prime[x]/Pi] + 1
FractionPair[x_] := {Prime[x]/Prime[FindPrime1[x]],
Prime[x]/Prime[FindPrime2[x]]}
p[x_] := Flatten[
Position[Abs[FractionPair[x] - Pi],
Min@Abs[FractionPair[x] - Pi]]][[1]]
MinLossFraction[x_] := FractionPair[x][[p[x]]]
ApPiList[x_] := Table[MinLossFraction[n], {n, 4, x}]
MP[x_] :=
ApPiList[x][[Flatten[
Position[Abs[ApPiList[x] - Pi],
Min[Abs[ApPiList[x] - Pi]]]][[1]]]]

改進的地方在於,當分子確定時,分母的取值範圍已經縮小到了只有兩個數,即不超過分子除以 [公式] 的最大質數以及大於分子除以 [公式] 的最小質數。這就導致了對於每一個 [公式] ,所需要做的除法只有兩次。按照目前的測試,計算 [公式] 只需要0.3s,而計算 [公式] 也只用了3.8s。

如果有更好的演算法,可以在評論進行回復


重磅!!!

經過接近9小時的運算,答主已經將 [公式] 的值算了出來。截圖如下:

有需要的讀者可以複製結果進行使用。


用Mathematica搜了一下分母在50億(5×10^9)以內最接近π的素分數

大於10^10的也搜到一個

77633864123/24711626453 ≈ 3.1415926535897932384 loss: 9.6877285155973596807*10^-20
11678491999/3717379459 ≈ 3.1415926535897932393 loss: 8.8284792670516338659*10^-19
13987552207/4452376151 ≈ 3.1415926535897932493 loss: 1.0791512007600004142*10^-17
10556478001/3360231311 ≈ 3.1415926535897933010 loss: 6.2525974182756860974*10^-17
8760797041/2788648309 ≈ 3.1415926535897933482 loss: 1.0969526518718412384*10^-16
13721170289/4367584153 ≈ 3.1415926535897933505 loss: 1.1199418065951072655*10^-16

生成較大素數列表使用內置函數Prime並不快,還不如使用篩法定義一個函數primes,當然還有更快的方法。

更大的範圍

Numerator: 3141592653589793238462643383279502884197169399375105820974944592307816406286208998628034825342117067982148086513282306647093844609550582231725359408128481117450284102701938521105559644622948954930381964428810975665933446128475648233786783165271201909145648566923460348610454326648213393607260249141273724587006606315588174881520920962829254091715364367892590360011330530548820466521384146951941511609433057270365759591953092186117381932611793105118548074462379962749567351885752724891227938183011949129833673362440656643086021394946395224737190702179860943702770539217176293176752384674818467669405132000568127145263560827785771342757789609173637178721468440901224953430146549585371050792279689258923542019956112129021960864034418159813629774771309960518707211349999998372978049951059731732816096318595024459455346908302642522308253344685035261931188171010003137838752886587533208381420617177669147303598253490428755468731159562863882353787593751957781857780532171226806613001927876611195909216420198938095257201065485863278865936153381827968230301952035301852968995773622599413891249721775283479131515574857242454150695950829533116861727855889075098381754637464939319255060400927701671139009848824012858361603563707660104710181942955596198946767837449448255379774726847104047534646208046684259069491293313677028989152104752162056966024058038150193511253382430035587640247496473263914199272604269922796782354781636009341721641219924586315030286182974555706749838505494588586926995690927210797509302955321165344987202755960236480665499119881834797753566369807426542527862551818417574672890977772793800081647060016145249192173217214772350141441973568548161361157352552133475741849468438523323907394143334547762416862518983569485562099219222184272550254256887671790494601653466804988627232791786085784383827967976681454100953883786360950680064225125205117392984896084128488626945604241965285022210661186306744278622039194945047123713786960956364371917287467764657573962413890865832645995813390478027590099465764078951269468398352595709825822620522489407726719478268482601476990902640136394437455305068203496252451749399651431429809190659250937221696461515709858387410597885959772975498930161753928468138268683868942774155991855925245953959431049972524680845987273644695848653836736222626099124608051243884390451244136549762780797715691435997700129616089441694868555848406353422072225828488648158456028506016842739452267467678895252138522549954666727823986456596116354886230577456498035593634568174324112515076069479451096596094025228879710893145669136867228748940560101503308617928680920874760917824938589009714909675985261365549781893129784821682998948722658804857564014270477555132379641451523746234364542858444795265867821051141354735739523113427166102135969536231442952484937187110145765403590279934403742007310578539062198387447808478489683321445713868751943506430218453191048481005370614680674919278191197939952061419663428754440643745123718192179998391015919561814675142691239748940907186494236879
Denominator: 10^3000+1027

代碼

p1 = NextPrime[10^3000]
p2 = p1 Pi // Round // NextPrime

Clear[primes];
primes[n_] :=
Module[{p = Range[1, n, 2]},
p[[1]] = 2;
Do[If[p[[(k + 1)/2]] != 0, p[[(k^2 + 1)/2 ;; ;; k]] = 0], {k, 3, n^.5, 2}];
SparseArray[p]["NonzeroValues"]
];

primesPi[n_, k_: 5] :=
Module[{pi, pList, kpList, pos, num, den, idx},
pList = primes[n];
kpList = Round[pList N[Pi, 20]];
pos = Flatten@Position[PrimeQ@kpList, True];
num = kpList[[pos]];
den = pList[[pos]];
idx = Ordering[Abs[N[num, 20]/N[den, 20] - Pi], k];
TableForm[Transpose@{#, N[#, 20], N[Abs[# - Pi], 20]} @(num[[idx]]/ den[[idx]]), TableSpacing -&> 3]
];


看到很多人都把自己找到的極限拿出來,我也把我的值算出來放在這吧。

分子:2827002372659445290357260962855242897405152052079569203405914392983540083737887098285318267558710591520186730238741839062655739621849049433096550408763877915486174241634056346841814348043838402739590717184349303380520653021701998707783513779636916081123511398123671055654868531529074633180779306045661095127935291805982716319903901019979381267554717786396715442470357511283347671625196879220353976983538584611197655947470384916808426158822499558916254388002391116975063743361195147543153399137231217719641788572511373906379129024889629321081376624132704246235727377105967551778231280246137426994500860846867192947482380921228210708325761380739779730441372124606596438728748305088912040699417480565348399877195979811839689790723369511409102946094569035768912644999825015325620652560737204822903921436209866346608534564848640687902039180468700842268498085030852719763042927217100836614482715319102094676844242424231508499444367965826083721145604444818833102596141094966856171454992298100159682725184041569377515368822477439215476436734955097692891579949593059539348120320783399907925273013946356739756537428450104034351129598831721416967729513148462523537087560982548756542734179677908589624742232868839280260485736905156136751123425656741997263821594621301843640603377245020234482889080390704440510851311246448840618736717576164902033856935929653539443998396856453260272131291673484207253946176831975464762118497098133163539094142904053974856665180748544445976786242579149594933244838321270584436526947534465748601769717843910826249097896957120475866708789846659079641323176404035969203166473427515217401213060726199740039837418824867419263827072476538745922206017043767373613409744639858474332453262441897957146215876640813788801879682485226767853205522280183617273502169204159707530822572099599337097623237614051075095506167880173928542635061563327591251326094152760164456006267239641167572591331025440614440006503365094736431389223915704780819271681424332781711199356177383244936229853302521961201485605479347170042584270485658794562045487057795194226577848725694228755842602714071749606595760845392283822718419451835293208948064903051571664188417068638357334767334967983367517438237486564419177860684208604113575824697133204698053513261656395158113025254746883964892455361581287069746333095041713651298010415205687516352033941396571593373255160710935712216865948479313424857980589481997031826625257566577587443067158003969660496549206746337446987165009171446078765192485374697492232720125514993212310473953

分母:899862803482534211706798214808651328230664709384460955058223172535940812848111745028410270193852110555964462294895493038196442881097566593344612847564823378678316527120190914564856692346034861045432664821339360726024914127372458700660631558817488152092096282925409171536436789259036001133053054882046652138414695194151160943305727036575959195309218611738193261179310511854807446237996274956735188575272489122793818301194912983367336244065664308602139494639522473719070217986094370277053921717629317675238467481846766940513200056812714526356082778577134275778960917363717872146844090122495343014654958537105079227968925892354201995611212902196086403441815981362977477130996051870721134999999837297804995105973173281609631859502445945534690830264252230825334468503526193118817101000313783875288658753320838142061717766914730359825349042875546873115956286388235378759375195778185778053217122680661300192787661119590921642019891415926535897932384626433832795028841971693993751058209749445923078164062862089986280348253421170679821480865132823066470938446095505822317253594081284811174502841027019385211055596446229489549303819644288109756659334461284756482337867831652712019091456485669234603486104543266482133936072602491412737245870066063155881748815209209628292540917153643678925903600113305305488204665213841469519415116094330572703657595919530921861173819326117931051185480744623799627495673518857527248912279381830119491298336733624406566430860213949463952247371907021798609437027705392171762931767523846748184676694051320005681271452635608277857713427577896091736371787214684409012249534301465495853710507922796892589235420199561121290219608640344181598136297747713099605187072113499999983729780499510597317328160963185950244594553469083026425223082533446850352619311881710100031378387528865875332083814206171776691473035982534904287554687311595628638823537875937519577818577805321712268066130019278766111959092164201989141592653589793238462643383279502884197169399375105820974944592307816406286208998628034825342117067982148086513282306647093844609550582231725359408128481117450284102701938521105559644622948954930381964428810975665933446128475648233786783165271201909145648566923460348610454326648213393607260249141273724587006606315588174881520920962829254091715364367892590360011330530548820466521384146951941511609433057270365759591953092186117381932611793105118548074462379962749567351885752724891227938183011949129833673362440656643086021394946395224737190702179860943702770539217176293176752384811

分子/分母:
3.141592653589793238462643383279502884197169399375105820974944592307816406286208998628034825342117067982148086513282306647093844609550582231725359408128481117450284102701938521105559644622948954930381964428810975665933446128475648233786783165271201909145648566923460348610454326648213393607260249141273724587006606315588174881520920962829254091715364367892590360011330530548820466521384146951941511609433057270365759591953092186117381932611793105118548074462379962749567351885752724891227938183011949129833673362440656643086021394946395224737190702179860943702770539217176293176752384674818467669405132000568127145263560827785771342757789609173637178721468440901224953430146549585371050792279689258923542019956112129021960864034418159813629774771309960518707211349999998372978049951059731732816096318595024459455346908302642522308253344685035261931188171010003137838752886587533208381420617177669147303598253490428755468731159562863882353787593751957781857780532171226806613001927876611195909216420198914159265358979323846264338327950288419716939937510582097494459230781640628620899862803482534211706798214808651328230664709384460955058223172535940812848111745028410270193852110555964462294895493038196442881097566593344612847564823378678316527120190914564856692346034861045432664821339360726024914127372458700660631558817488152092096282925409171536436789259036001133053054882046652138414695194151160943305727036575959195309218611738193261179310511854807446237996274956735188575272489122793818301194912983367336244065664308602139494639522473719070217986094370277053921717629317675238467481846766940513200056812714526356082778577134275778960917363717872146844090122495343014654958537105079227968925892354201995611212902196086403441815981362977477130996051870721134999999837297804995105973173281609631859502445945534690830264252230825334468503526193118817101000313783875288658753320838142061717766914730359825349042875546873115956286388235378759375195778185778053217122680661300192787661119590921642019891415926535897932384626433832795028841971693993751058209749445923078164062862089986280348253421170679821480865132823066470938446095505822317253594081284811174502841027019385211055596446229489549303819644288109756659334461284756482337867831652712019091456485669234603486104543266482133936072602491412737245870066063155881748815209209628292540917153643678925903600113305305488204665213841469519415116094330572703657595919530921861173819326117931051185480744623799627495673518857527248912279381830119491298334801305240800788431659287443138186135599385658292066391558423397778380666400850315366027727543337749161258676405341359271719956722767443301514720597798122289789042766799076652705438258368279009231959491073001422646541761420836125044233568542677324764518650674387868857630508771362609489848808633585778067731804792221402029665624559205821829160373678939845220235657341873263170965575513112357688449710488375892580604182418309183264797700433857994792844850477027375944422069141627330543962983093558

善用ctrl+f,在480130524080078843165928744313818這個位置之前的都是準確的(手機划到分子分母的盡頭附近就能找到)。

小數點後2504位是精確的。(另外細心的朋友可能發現了,我這個儘可能大的質數也是從π里截取的。)

這個值還只是隨手找的,如果想要更精確也容易得多。

所以窮舉什麼的,無論用什麼方式來優化效率,從一開始的思路上就要落後太多了。

2019年12月21日前的答案如下-----------------------------------------------------------

首先答案是找不到

其次就算要找近似值,窮舉也太蠢了吧。。

找一個儘可能大的質數n,算出n×π的結果m,再找到距離m最近的質數k(最好是取整後直接就是質數)。

n/k的精度要比你們這些窮舉出來的高不知道多少,而且計算成本也低得多。。。


可以仿照丟番圖逼近, 定義 [公式] 的素數最佳逼近.

給定一個實數 [公式] ,素數對 [公式][公式] 的最佳逼近,當且僅當對每個與 [公式] 不同的素數 [公式] ,在 [公式] 時恆有 [公式] .

對於任意 [公式] 都可以找到一個因子 [公式] , 使得 [公式] 更接近 [公式] , 所以素分數不但可以逼近任何實數, 還可以找到無窮多序列花式逼近這個實數...

但我們關心的只是最佳逼近, 怎麼找最佳逼近, 估計只能靠窮舉.

pair[n_] := With[{p = Prime[n]}, NextPrime[Pi * p, {-1, 1}] / p];
ans = Flatten[ParallelMap[pair, Range[10*10000]]];
sorted = SortBy[ans, Abs[# - Pi] ];
save = {};
list = sorted;
While[Length@list &> 0,
PrependTo[save, max = First@list];
list = Select[list, Denominator[#] &< Denominator@max ] ]; save

[公式]

然後一查, OEIS 上已經有了: A265810, A265811, 一查文獻, 沒辦法, 那就完事了...


Mathematica 啥都好, 就是吃內存, 瞬間 64 G 消失, 這誰頂得住哇...

extern crate primal;
use std::f64::consts::PI;
const LIMIT: usize = 10_0000_0000;

fn pi_times(n: usize) -&> usize {
(n as f64 * PI).ceil() as usize
}

fn pi_diff(r: usize, s: usize) -&> f64 {
(r as f64 / s as f64 - PI).abs()
}

fn main() {
let mut pair: (usize, usize);
let mut loss = PI;
let sieve = primal::Sieve::new(pi_times(LIMIT));
for q in sieve.primes_from(1).take_while(|x| *x &< LIMIT) { let s = sieve.prime_pi(pi_times(q)); let d = sieve.nth_prime(s); let u = sieve.nth_prime(s + 1); if pi_diff(d, q) &< pi_diff(u, q) { let c = pi_diff(d, q); if c &< loss { loss = c; pair = (d, q); println!("Fraction{:?} Loss: {}", pair, c); } } else { let c = pi_diff(u, q); if c &< loss { loss = c; pair = (u, q); println!("Fraction{:?} Loss: {}", pair, c); } } } }

10億以下的最優近似如下:

Fraction(7, 2) Loss: 0.3584073464102069
Fraction(17, 5) Loss: 0.2584073464102068
Fraction(23, 7) Loss: 0.14412163212449247
Fraction(41, 13) Loss: 0.012253500256360628
Fraction(167, 53) Loss: 0.009350742636621945
Fraction(211, 67) Loss: 0.007661077753490453
Fraction(223, 71) Loss: 0.0007475831672580924
Fraction(619, 197) Loss: 0.000539326105638338
Fraction(757, 241) Loss: 0.0005138154155193142
Fraction(977, 311) Loss: 0.00011355391133660575
Fraction(1109, 353) Loss: 0.00005040590029192771
Fraction(4483, 1427) Loss: 0.0000369423073824926
Fraction(5237, 1667) Loss: 0.000020967926925852254
Fraction(5413, 1723) Loss: 0.000020811297032352627
Fraction(9497, 3023) Loss: 0.00001144287196330751
Fraction(14423, 4591) Loss: 0.000011298765136391609
Fraction(16063, 5113) Loss: 0.000007189946291230598
Fraction(18061, 5749) Loss: 0.0000028118781911778967
Fraction(30841, 9817) Loss: 0.0000015361404703817527
Fraction(45751, 14563) Loss: 0.0000009485839562728415
Fraction(47881, 15241) Loss: 0.0000008945188660902659
Fraction(60661, 19309) Loss: 0.0000006498609619320916
Fraction(137341, 43717) Loss: 0.00000013809238952333658
Fraction(162901, 51853) Loss: 0.00000007456832840091465
Fraction(177811, 56599) Loss: 0.000000045946548343778204
Fraction(211891, 67447) Loss: 0.00000000434903313362156
Fraction(626443, 199403) Loss: 0.0000000004826130606261358
Fraction(833719, 265381) Loss: 0.000000000008715250743307479
Fraction(38144863, 12141887) Loss: 0.000000000006801670338063559
Fraction(40436969, 12871487) Loss: 0.000000000001823874384854207
Fraction(45230587, 14397343) Loss: 0.0000000000008637535131583718
Fraction(93379723, 29723689) Loss: 0.0000000000004121147867408581
Fraction(114431749, 36424757) Loss: 0.0000000000001816324868286756
Fraction(120059441, 38216107) Loss: 0.000000000000038191672047105385
Fraction(185091653, 58916503) Loss: 0.00000000000001687538997430238
Fraction(347672183, 110667493) Loss: 0.0000000000000013322676295501878
Fraction(1725229397, 549157573) Loss: 0.0000000000000008881784197001252
Fraction(1833616417, 583658233) Loss: 0.0000000000000004440892098500626


首先素數相除是稠密的,但是對於一個給定的上界,確實存在一個O(n)的方法來判斷

看了樓上的答案,一百萬跑了一個多小時。。就順手優化了一下演算法。

高中生自學C++,可能寫的有點問題,希望大家不要噴。

跑的範圍是 2 ~500000000(5億)

得出的答案是 最接近π的兩個素數相除是 347672183 / 110667493 ≈ 3.141592653589794430

而圓周率約為:3.141592653589793239

大概在第15位出現了偏差。

處理器:Intel i7-8550U 用時大概3s多。

#include&
#include&
const long double pi = 3.141592653589793238462643383279502884197169399375105820974945L;
const int maxn = 5e8+10;
int pri[maxn],top;
std::bitset& vis;
long double abs(long double x) {
return x&>0?x:-x;
}
void init(int n) {
vis[1]=1;
for(int i = 2;i&<=n;++i) { if(!vis[i]) pri[++top]=i; for(int j = 1;1LL*i*pri[j]&<=nj&<=top;++j) { vis[i*pri[j]]=1; if(i%pri[j]==0) break; } } } int main() { int n = 500000000; init(n); int l = 1,r=1; long double ans = 0; int ansl,ansr; while(r&<=top) { long double tmp = (long double)pri[r]/pri[l]; if(abs(tmp-pi)&=pi) ++l;
else ++r;
}
printf("Pi: %.18Lf My ans : %.18Lf = %d / %d
",pi,ans,pri[ansr],pri[ansl]);
return 0;
}


100萬以內的質數里

833719和265381的比值

大概是3.14159265358

π:3.141592653589793.......

在這個精確度的話是3.14159265359

和π的誤差已經在12位小數之後了

跑了1個小時10分鐘終於跑出來了。。。

更新:

經評論要求po出代碼,高中生業餘自學python,完全是愛好,希望大佬不要噴

def primenumber(x):
i = 0
PrimeNum = []
PrimeNum.append(2)
for a in range (3,x + 1):
b = 0
while b &< i + 1 and a%PrimeNum[b] &<&> 0:
b = b + 1
if b == i + 1:
PrimeNum.append(a)
i = i + 1
return PrimeNum

while True:
print "Enter the range"
x = int(raw_input())
PrimeNum = []
PrimeNum = primenumber(x)
import math
pi = math.pi
closest = pi - 1.5
for pointer in range(1, len(PrimeNum)):
for p in range(0,pointer):
ratio = float(PrimeNum[pointer])/float(PrimeNum[p])
difference = ratio - pi
if difference &< 0: difference = 0 - difference if difference &< closest: closest = difference low = p high = pointer print "These are those prime numbers:",PrimeNum[high],PrimeNum[low] print "Their ratio is",float(PrimeNum[high])/float(PrimeNum[low]) print "The difference between this number and pi is",closest

代碼寫得不規範而且還沒有注釋,大概的思路就是窮舉:

先算出這個範圍內所有的質數

然後兩個for循環套在一起,來窮舉這個範圍里所有質數兩兩的比值

每次求出比值減去pi,再取絕對值

最後選擇比值減去pi絕對值最小的數,輸出


再補充一下:

100億以內,最接近pi的前兩個商,與pi都是前16位相同。

補充一下:

10億以內,最接近的是347672183/110667493

其次就是926083643/294781579

以下為原回答

一億以內,是這兩個數:

93379723

29723689

與pi的差值大致是4.1220339889675058476948118789434557256874256930457541830264979730741819357840039174120243643959282894200474305695396730170551761827017970632633192115831819003084380066044131591280613837366681198151143080612748232346892828552892223583666873746681623103302534457527953559508319385282938676497209024634166136044680537669124136249344002606920719292476565157086772647436649883753549131107389568375376880235981610557778583663763743551831709421966106331471128635059894464386551852907414476472758078592705122266758292105E-13


十萬以內比值最接近π的兩個質數:

60661,19309.

更新:

給出從2開始所有n個質數比值最接近π的兩個質數的c語言代碼,方法是逐個枚舉,初學c語言,有不足請大神指點.

程序中π的值需要自己輸入(小數在15位以內,最多輸入到3.141592653589793).

#include&

#include&

#define n 100000

int prime(int x)

{

int i;

for (i = 2; i &<= (int)sqrt(x); i++)

{

if (x%i == 0)

return 0;

}

return 1;

}

int main(void)

{

double pi;

int a[n],b[n],i,j,imin,jmin,t=2;

double k,min;

printf("請輸入pi的值:");

scanf("%lf",pi);

printf("%d個質數為:
",n);

for(i=0;i&

{

if(prime(t))

a[i]=t;

else

i--;

t++;

}

for(i=0;i&

printf("%d ",a[i]);

printf("
");

t=2;

for(i=0;i&

{

if(prime(t))

b[i]=t;

else

i--;

t++;

}

min=fabs((double)b[1]/(double)a[0]-pi);

for(i=0;i&

for(j=i+1;j&

{

k=fabs((double)b[j]/(double)a[i]-pi);

if(k&

{

min=k;

imin=i;

jmin=j;

}

}

printf("%d個質數中第%d個質數:%d,與第%d個質數:%d的比值最接近%.15f,誤差為%.15f ",n,imin,a[imin],jmin,b[jmin],pi,min);

printf("
");

return 0;

}


令 p_i 是第i個質數, 由於 lim n-&>inf p(n)/p(n+1) = 1

所以對於任意實數A,任一足夠小的epsilon, 都存在一個M,對任一n&>=M, 有 p(n+1)/p(n) &< 1+epsilon/A, p (M+1)/p(M)&< 1+ epsilon/A ---(1)

那麼,對於M+1,我們找出最小的N,滿足p(N)/p(M+1)&>A, 當然 p(N-1)/p(M+1)&

1,2 式相乘,有p(N-1)/p(M)&< A+ epsilon,

又因為p( N-1)/p_(M)&>p(N)/p(M+1)&>A

所以對於任意實數A,任一足夠小的epsilon, 都存在M,N,使得 A&< P(N)/P(M)&


不能,了解一下斐波那契兔子數列,黃金分割比。


很容易啊,現在的 [公式] 已經計算到了3萬億位了,找個超大的質數乘以[公式],結果圓整成最近的質數,就是你要的結果了。


先上結論:能無限接近

給個鏈接:https://www.bilibili.com/video/av73773499?from=searchseid=3587306093225534660

這個B站視頻通俗的解釋了為什麼而且說的很奇妙,不需要多高深的數學知識你就能理解。


孿生素數接近被證明,這樣考慮,似乎方便一點


好吧。瀉藥。


首先,百度文庫下載一個100萬以內質數表,這個不難的。一般是word格式,用空格分開的,查找替換後換成行一個的,存為txt格式。應該有78498個質數。

然後,在SQL Server 資料庫中,新建一個質數表。表名,zhishu,列名,numb,int類型。

然後將剛老的txt文件導入到這個zhishu表中。

下面是裝逼時刻:請不要眨眼。

  1. 新建查詢分析器,輸入以下代碼,按F5。顯示 共有156996行數據受影響。

select numb,floor(numb*pi()) as pi_numb into step1 from zhishu
union
select numb,ceiling(numb*pi()) as pi_numb from zhishu

--根據質數表,獲取當前質數乘以Pi以後的數據 pi_numb,並將數據分別上下取整
-- 將數據pi,pi_numb(上下值)匯合後導入到Step1表中

2 再在查詢分析器中執行以下代碼,按F5,顯示共有4466行受影響。

select * into step2 from step1 where step1.pi_numb in (select numb from zhishu)

-- 將step1中,質數乘以pi的結果pi_numb 與質數表對照,篩選出來pi_numb仍是質數的,導入到Step2表中。
-- 需要注意的是,部分大於100萬的pi_numb仍是質數,但因為不在原100萬以內的質數表中,仍會被過濾掉。

3 再在查詢分析器中執行以下代碼,按F5,顯示共有4466行受影響。

select *,pi_numb/numb as like_pi,abs(pi()-pi_numb/numb) as pi_diff into step3 from step2

-- 計算pi_numb_/numb 與Pi的差異 pi_diff ,並按差異的升序排序。

4 以下是前20項數據結果,誤差在小數點後8-12位。

5 以下是10000以內質數的結果,誤差在小數點後3-5位。 977/311, 1907/607,1109/353,這幾個精度相當可以的。


我想了一個演算法不知道有沒有用。

設一個π值,精確到小數點後32位。

假設在0到x範圍內尋找a和b兩個質數,那麼只要找到最接近x的質數b,再除以π得到一個數c,再尋找和c最接近的質數b就行了。


把Pai換成任意無理數都不行。

其實高票回答拍出了一個「質數之比是稠密的」這麼一個高大上的結論,但是這個原理實際上用初中數學就可以解釋。


約率 [公式]

密率 [公式]

好像不是素數,算了。。


明顯不能,這就跟不存在最大的質數一樣


推薦閱讀:

[乾貨]---微分幾何學習筆記I------曲線論
清北學堂noip2018集訓D2
我們眼中平平無奇的生活現象,在數學家眼中竟然是這樣的
英國人的數學有多差?這些例子,你可別笑!

TAG:數學 | 數論 | 素數 |