數論 素數篩選法與整數的素因子分解

2021-09-01 01:14:11 字數 1582 閱讀 8919

篩選法

求出n以內的素數,最快的應該是篩選法。

篩選法的思路是:

要求10000以內的素數,把1-10000都列出來,1不是素數,劃掉;2是素數,所有2的倍數都不是素數,劃掉;取出下乙個倖存的數,劃掉它的所有倍數;直到所有素數找完為止。

這種做法的空間複雜度是o(n),時間複雜度o(n/logn)。

const int max = 1000005;

bool prime[max]=;//0表示素數,1為非素數

//篩選n以內的素數

void getprime(int n)

}}

分解素因子

唯一質因子分解定理:任意乙個合數a僅能以一種方式,寫成如下的乘積形式:

a = p1^e1*p2^e2*...*pr^er

其中pi為素數,p1

素因子的分解技巧:首先a的某兩個素因子不可能同時大於sqrt(a),這樣,先用篩選法求出sqrt(a)以內的所有素數,然後用a依次去mod這些素數,若能整除,則找到素因子,將素因子去掉,再繼續找。最後若a>1,則a也是它的素因子。

const int max = 100005;

int isprime[max]=;

int prime[max/5],num=0;

int factors[100],s=0;

void getprime(int n)

}}void decompose(int n, int* factors)

poj2262

題意:給出任意乙個正整數n(n<=10^6),根據哥德**猜想:任意乙個不小於6的整數,都可以表示為兩個奇素數之和。問雖任意整數是否滿足這個猜想。

解:篩選法將n以內的所有素數都求出來,若a是素數,判斷n-a是否為素數,若找到一組不滿足,則答案為否定。

poj1142

題意:給乙個數n(n<=10^7),求最小的m>n,使得m的素因子每一位上的數的和 == m的每一位上的數的和。

解:顯然這題就是要分解素因子。先求10^4以內的素數,再用素因子分解,然後判斷。

#include #include #include #include using namespace std;

const int max = 10005;

bool isprime[max]=;

int prime[max/4],num=0;

void getprime(int n)

}}int getsum(int n)

return ret;

}bool issmith(int n)

int main()

printf("%d\n",i);

}return 0;

}

素數判斷與素數篩選法

方法一 直接判斷,思想簡單,實現比較簡單,但是複雜度過高bool isprime int a return true 方法二 素數篩選法 eratosthenes 篩法 只有素數才能當篩子 篩掉對應的倍數,不超過要求的範圍即可 遍歷一遍 void getprime int n 從i i開始計算 j ...

(基本數論)素數篩選與判斷

這種方法就是將給出的數判斷能否找到處1以及它本身以外的因數。樣例 include using namespace std bool f int n return 1 int main 埃氏篩法就是從2開始篩掉2的倍數 必須從2倍開始 往下依次進行。樣例 include using namespace...

素數篩選法與點燈案例

1.介紹 假設所有待判斷的數字的上限是l,宣告乙個長度為l 1的布林陣列a l 1 用這個陣列來表示對應下標的數字是不是素數。起初,將陣列所有成員標記為1,然後按照某種方法將其中的非素數都標記為0即可 2.實現 1 首先宣告乙個布林陣列isprime l 1 先將isprime 0 isprime ...