數論2 素數篩

2022-08-28 02:03:14 字數 775 閱讀 2065

判斷素數可通過試除小於\(\sqrt n\)的素數來實現,那麼將其反過來,只要將\(<= \sqrt n\)的素數的倍數都刪掉,那麼就能得到一張\(<=n\)的素數表,\(o(n\lg \lg n)\)

// 需劃掉合數,所以最初假設均為素數,即陣列初始化為0

bool composite[maxn];

void generate(int n)

for(int i = 2; i < n; ++i)

if(!composite[i]) printf("%d ", i);

putchar('\n');

}

埃氏篩的問題在於乙個合數可能會被多個素數刪除,造成不必要操作。為解決該問題,注意到每個合數均可寫成其最小素因數p乘c,即\(n=pc\),其中必有\(c \ge p\),因為若非如此,當c為素數時,不滿足假設「p為最小素因數」;當c為合數時,其必能分解除小於c的素因數,同樣不滿足假設「p為最小素因數」。線性篩就是通過從小到大地遍歷c來保證每個合數均被,其僅被刪除一次。

// composite同樣初始化為0;np是素數個數;prime儲存找到的素數

bool composite[maxn];

int np, prime[maxn];

void generate2(int n)

}for(int i = 0; i < np; ++i)

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

putchar('\n');

}

數論 快速冪,素數篩

int qupow int a,int b,int m return ans 位運算 為 int qupow int a,int b,int m return ans 快速冪將原來0 b 的時間複雜度降為了o logb 首先我們在一般方式求素數時,可以採用以下方式 bool ifprime int ...

數論 C 線性篩素數

在c 中,篩素數是乙個非常重要演算法。我花了半天時間才明白的尤拉篩 我實在是太蒻了 最愚蠢的方法 1 include2 intmain 10 11 printf no 12 普通方法 1 include2 intmain 10 11 printf no 12 以上兩種方法其實都是判定方法,並不是篩法...

數論 多種素數判斷法及素數篩法

水了一篇啊.眾所周知,大於等於 2 的僅含有 1 和自身這兩個因子的正整數被稱作素數 故只要判斷在 2,n 1 範圍內是否存在其它因子,就可以判斷 n 是否為素數了 無腦判斷法直接從 2 for到 n 1 稍微優化下可以縮減到 2,frac n 2 但這個方法時間複雜度為 o n 可以發現,如果某個...