演算法 線性篩質數

2021-08-21 06:41:54 字數 1926 閱讀 4429

輸出從0

00到1000000

1000000

100000

0的所有質數。

首先0

00和1

11不是質數,從2

22開始逐個判斷是否為質數。如果t

tt為質數,那麼對於任意正整數k

kk,k×t

k \times t

k×t不是質數,因此可以將k×t

k \times t

k×t篩去。如果t

tt已經被篩去,那麼t

tt不是質數,但仍然要將k×t

k \times t

k×t篩去。為了避免重複篩選,需要對篩選條件加以限制,當且僅當k

kk為k×t

k \times t

k×t除了1

11以外的最小因數時將k×t

k \times t

k×t篩去,這樣可以保證每個數最多被篩選1

11次。當k×t

k \times t

k×t被篩去時,k

kk必然為質數,對於t

tt,如果t

tt為質數,那麼k

kk從2

22到t

tt;如果t

tt為合數,那麼k

kk從2

22到t

tt除了1

11以外的最小因數。

o (n

)o(n)

o(n)

#include using namespace std;

#include const int max = 1000000;

int pos; // the amount of prime

int check[max]; // 0 to prime, 1 to composite

int prime[max]; // the prime numbers

/** * @other: 0 and 1 are not prime numbers

*/void prime()

}}

利用篩選得到的質數對n進行分解質因數。

#include "prime.h"

int count[max]; // the amount of prime numbers

/** * @param n: number n

*/void ext1(int n)

}

#include "ext1.h"

int amount; // the amount of prime factors

int factor[max]; // the prime factors

/** * @param n: number n

*/void ext2(int n)

} if (n > 1) factor[amount++] = n;

}

計算n所有因數的和。設一共有k

kk種質因數,質因數t

it_i

ti​的數量為a

ia_i

ai​,那麼因數和為∏i=

1k∑j

=0ai

ti

j\prod^k_ \sum^_ ^j

∏i=1k​

∑j=0

ai​​

ti​j

#include "ext2.h"

/** * @param n: number n

* @return: the sum of factors

*/int ext3(int n)

ans *= sum;

} return ans;

}

ACM演算法 線性篩

應用 判斷是否為素數 第乙個想法 普通優化,對數字加根號遍歷。不夠優秀 第二個想法 如果我們知道乙個數是素數,那麼我們可以將這個素數的倍數篩去。我們從2開始,每次迴圈到乙個數,先判斷它是否被篩過,如果沒有,那麼它肯定是素數,就用它去篩它的倍數,否則就跳過。上述的篩法稱為 複雜度大約為nln n 這個...

尤拉篩法 線性篩

尋找素數是我們剛學迴圈的時候就會遇到的乙個問題,但我們第一時間想到的便是暴力查詢.判斷乙個素數的複雜的就是o n 通過迴圈中值判斷到根號n可以優化一些,不過複雜度也達不到預期.但在數論中,有更完美的方法,埃氏篩法o nlog logn 尤拉篩法o n 思想 從2開始,將每個素數的倍數都標記成合數,用...

質數線性篩法 O n

埃氏篩法o nloglogn 仍會重複標記合數 such as i 2時 12 2 6,先會被 2 標記已是合數 i 3時 12 3 4,又被標記了一次 我們在生成乙個需要標記的合數時,每次只向現有的數中乘上乙個質因子,並且讓它是所生成合數的最小質因子 code include include us...