如358723134241


Meissel - Lehmer 公式[1]

[公式]

其中 [公式]

解遞歸可以求出

時間複雜度是 [公式]

空間複雜度是 [公式]


THE MEISSEL, LEHMER, LAGARIAS, MILLER, ODLYZKO METHOD

這篇文章宣稱他們的時空複雜度是 [公式][公式]

參考

  1. ^https://mathoverflow.net/questions/297785/prime-counting-meissel-lehmer-is-there-a-general-formula


這裡解釋一個比較樸素的思路,可以認為是 @醬紫君 老師給出公式的低配版,是二潘《初等數論》上計算 [公式] (它表示不超過 [公式] 的素數個數)的方法,由勒讓德第一個發現。

利用集合的文氏圖可以直觀的看出,對於任意兩個有限集 [公式],有

[公式]

以及對任意三個有限集 [公式],有

[公式]

可以用數學歸納法證明其一般形式,對於任意 [公式] 個有限集 [公式] 成立

[公式]

這就是所謂容斥原理

我們利用這個原理導出 [公式]的計算方法(僅考慮 [公式] 的情形)。如果我們知道了 [公式] 的值,並知道不超過 [公式][公式] 個素數為 [公式],我們如何計算不超過 [公式] 的素數個數呢?記集合

[公式][公式]

它表示的就是 [公式] 以內的正整數中,素數 [公式] 的倍數構成的集合。於是集合 [公式] 就是 [公式] 以內的正整數中能同時被 [公式]整除的那些數構成的集合( [公式] ),自然有

[公式]

這是因為

  1. [公式] ,則不超過 [公式] 的正整數中,能被 [公式] 整除的恰好有 [公式] 個,即 [公式]
  2. 同時被若干個數整除等價於被這些數的最小公倍數整除。
  3. 若干素數的最小公倍數即它們的乘積。

到此,就可以利用容斥原理計算 [公式] 了,也就是 [公式] 以內的正整數中至少能被[公式]其中之一整除的數的個數。之後,在正整數 [公式] 中,除了 [公式] 這個非素非合的異類,集合 [公式] 之外的數一定是(大於 [公式] 的)素數,這是因為不超過 [公式] 的合數一定有不超過 [公式] 的素因數。而 [公式] 包含了 [公式] ,因為它們都是自身的倍數。這樣,不超過 [公式] 的素數個數就是

[公式]

於是,我們只要知道 [公式] 以內有多少素數,以及這些素數都是什麼,就可以求 [公式] 以內有多少素數。


能,時間問題。

如果考慮時間問題,不能。

當然,你給的這個很簡單,是第14032817002個素數。


當然可以啊,從2開始按次序把素數一個一個找出來不就行了。


用循環查找


要麼查表要麼篩,沒什麼好辦法吧


可以。

但是我懶得寫程序。


答案: wolframalpha: 14032817002

C++代碼:

#include&
using namespace std;
typedef long long LL;
const int N = 1e6+2;
LL L[N],R[N];
LL pi(LL n){
LL rn = (LL)sqrt(n+0.2);
for(LL i=1;i&<=rn;++i) R[i]=n/i-1; LL ln = n/(rn+1)+1; for(LL i=1;i&<=ln;++i) L[i]=i-1; for(LL p=2;p&<=rn;++p){ if(L[p]==L[p-1]) continue; for(LL i=1,tn=min(n/(p*p),rn);i&<=tn;++i){ R[i] -= (i*p&<=rn?R[i*p]:L[n/(i*p)])-L[p-1]; } for(LL i=ln;i&>=p*p;--i){
L[i] -= L[i/p]-L[p-1];
}
}
return R[1];
}
int main(){
LL n;
while(cin&>&>n){
cout&

時間複雜度 [公式] ,空間複雜度 [公式]

理論解釋: https://dna049.com/computationOfPiX/ 最後面部分


要求準確值的話,只有把前面的素數全部找出來,最少都是O(n)的複雜度。

但是可以根據素數定理,用O(1)的時間得到一個估計值。

素數定理的內容是,不超過x的素數個數的漸進估計為x/lnx。

套用公式,358723134241/ln(358723134241) = 13482883765.4557


看你給的素數多大了。現在已知的最好演算法,大概能到 10^27數量級吧。可對著人家的論文,我也寫不出代碼。退而求其次,用勒讓德公式,寫個10^18左右的,倒還成功了。更大的素數,比如10^30以上,可用概率判斷是否素數,但Pi(N)就計算不能了,更大的,例如梅森素數之類的特殊素數,更別指望了。


推薦閱讀:
相關文章