超高速計算n以內素數個數(百億內3毫秒解決)

2021-12-30 02:56:20 字數 2178 閱讀 1824

判斷n以內素數個數有很多演算法,最簡單的是迴圈直接判斷,這個效率不用說,n稍大就不行了。最流行的是篩選法,原理就是定義乙個素數標誌位表,初始為1,遇到乙個數如果對應標誌位為1判斷這個數是不是素數,是將該為置1,不是放0,然後將他的倍數字置全部置0,然後繼續。。這個效率還是比較快的,但是計算到10^8時候需要3s左右了,對於一般要求基本夠了,但是對於acm裡面對時間要求很嚴還是不夠。可以對帥選法進行優化,不如偶數直接跳過,以後直接加偶數倍,甚至加入移位運算判斷是不是3的倍數,5的倍數等等,最後基本勉強在acm要求的時間之內。下來介紹一種逆天的演算法:meissel-lehmer,布吉島的可以百度下。不容易看懂。。。。。。

先看下效果絕對碉堡!!!!

**如下:

[cpp] 

#include      

#include      

#include      

#include      

#include      

__int64 *primarr, *v;  

__int64 q = 1, p = 1;  

//π(n)  

__int64 pi(__int64 n, __int64 primarr, __int64 len)  

}  if (mark)  

return i + 1;  

return 0;  

}     

//φ(x,a)  

__int64 phi(__int64 x, __int64 a, __int64 m)  

__int64 prime(__int64 n)  

mark[0] = mark[1] = 1;  

//統計素數數目  

for (i = 0; i < mark_len; i++)  

if (!mark[i])  

count++;  

//儲存素數  

primarr = (__int64 *)malloc(sizeof(__int64) * count);  

j = 0;  

for (i = 0; i < mark_len; i++)  

if (!mark[i])  

primarr[j++] = i;  

if (n < 10000)  

return pi(n, primarr, count);  

//n^(1/3)內的素數數目  

len = pi((__int64)exp(1.0 / 3 * log(n)), primarr, count);  

//n^(1/2)內的素數數目  

len2 = pi((__int64)sqrt(n), primarr, count);  

//n^(2/3)內的素數數目  

len3 = pi(mark_len - 1, primarr, count);  

//乘積個數  

j = mark_len - 2;  

for (i = (__int64)exp(1.0 / 3 * log(n)); i <= (__int64)sqrt(n); i++)  

sum += s;  

}  }  

free(mark);  

sum = (len2 - len) * len3 - sum;  

sum += (len * (len - 1) - len2 * (len2 - 1)) / 2;  

//尤拉函式  

if (m > len)  

m = len;  

for (i = 0; i < m; i++)  

v = (__int64 *)malloc(sizeof(__int64) * q);  

for (i = 0; i < q; i++)  

v[i] = i;  

for (i = 0; i < m; i++)  

for (j = q - 1; j >= 0; j--)  

v[j] -= v[j / primarr[i]];  

sum = phi(n, len, m) - sum + len - 1;  

free(primarr);  

free(v);  

return sum;  

}     

int main()  

return 0;  

}   

華為將推出超高速充電技術

眾所周知,電池壽命是掛在智慧型手機上的達摩克利斯之劍。在智慧型手機提供高質量使用者體驗的眾多特性中,電池壽命長短是其中最薄弱的一環。手機廠商們一直以來主要通過兩種方式來解決這個問題 要麼增加快速充電功能 要麼增加電池充電密度。中國國家智財權局最近公示了華為公司的一項鋰電池發明專利,專利中描述了一種全...

香港電訊將構建光纖超高速公路

據悉,電訊盈科旗下pccw hkt日前透露,計畫興建一條連線將軍澳工業區 tkoie 與柴灣區的 光纖超高速公路 該超快速鏈路將是乙個長達3公里 跨越將軍澳的高容量 低延遲海底電纜系統。該電纜系統計畫在2017年開始提供服務。hkt集團董事總經理alex arena表示,該系統將為tkoie多個資料...

百G乙太網開啟網路超高速時代

隨著乙太網技術在網路構建中的迅速普及,乙太網平台已經成為網路組建中的主流技術平台。目前都會網路寬頻接入方面有20mbps 50mbps 100mbps 200mbps,甚至500mbps的頻寬也已經成為許多國家未來幾年的網路發展目標。接入層頻寬的增加必然導致都會網路匯聚層和核心層的頻寬需求增加,匯聚...