1. 程式人生 > >數論初步——Eratosthenes篩法

數論初步——Eratosthenes篩法

無平方因子的數
給出正整數 nm,區間[nm]內的“無平方因子”的數有多少個?
整數 p 無平方因子,當且僅當不存在k>1,使得 p 是 k2 的倍數。(1 <= n <= m <= 1012,m - n <= 107)。
分析:
首先先介紹一下用Eratosthenes篩法構造1 ~ n的素數表。
思想:

對於不超過 n 的每個非負整數 p,刪除2p,3p,4p,…..,當處理完所有的數之後,還沒有被刪除的數就是素數。

實現程式碼:

int m = sqrt(n + 0.5);
memset(vis,0
,sizeof(vis)); for(int i = 2; i <= m; i++) if(!vis[i]) for(int j = i*i; j <= n; j+=i) vis[j] = true;

這裡給出一個有意思的問題:
給定n,c的值是多少???換句話說,不超過n的整數中,有多少的素數呢?

素數定理:π(x)~xlnx

最後,我們如何求出區間內無平方因子的個數呢?方法和篩素數類似,對於不超過m的所有素數p,篩掉區間[n,m]內p2的所有倍數。

實現程式碼:


int r = sqrt(m + 0.5);
memset(vis,0
,sizeof(vis)); for(int i = n; i <= r; i++) if(!vis[i]) for(int j = i*i; j <= m; j+=i*i) vis[j] = true;