簡單數論 質數

2022-07-25 07:21:08 字數 2324 閱讀 1831

在 >1 的整數中,如果只包含1和本身兩個約數,這個數就被稱為質數/素數。

質數的判定——試除法

暴力列舉 \(o(n)\)

bool is_prime(int n)

簡單優化 \(o(\sqrt)\)

對任意的d能整除n( d|n ), 顯然n除上d也能整除n (\(\frac\) | n )

如n = 12,3是12的約數,4也是12的約數; 2是12的約數,6也是12的約數

所有的約數都是成對出現的,在列舉時可以只列舉每一對中較小的那個,即\(d \leq \frac\)的部分,即\(d \leq \sqrt\)

bool is_prime(int x)

分解質因數 \(o(\log_ax\) ~ \(\sqrt)\)

hihocoder 1750

如n = \(2^\),可能他的時間複雜度是o(1)的

質因數:在數論裡是指能整除給定正整數的質數。每個合數都可以寫成幾個質數相乘的形式,如6=2*3,8=\(2^\),這幾個質數就叫做這個合數的質因數。

很輕易就可以得出n中最多隻包含乙個大於\(o(\sqrt)\)的質因子,所以只需要把所有 < \(o(\sqrt)\) 的質因子列舉出來。

void divide(int x)

if (x > 1) cout << x << ' ' << 1 << endl;

cout << endl;

}

篩選質數

hihocoder 1295

從前往後看,把每乙個數的所有倍數全部刪掉

第乙個數是2,把4,5,8,10,12全部刪掉

第二個數是3,把6,9,12全部刪掉

第三個數是4,把8,12刪掉

如此這麼篩選過一遍之後,所有剩下的數就是質數

對於任意乙個數x而言,他如果沒被刪除,就說明p不是2p-1的任意乙個數的倍數,即2p-1不存在任何乙個p的約數,所以p是乙個質數。

樸素做法 o(n\(\ln n\))

當i=2時第一重迴圈迴圈了\(\frac\),當n=3時迴圈了\(\frac\),當n=4時迴圈了\(\frac\)次,以此類推可知

o(n) = \(\frac\) + \(\frac\) + ... + \(\frac\)

= n(\(\frac\) + \(\frac\) + ... + \(\frac\)

)\(\frac\) + \(\frac\) + ... + \(\frac\)

c是乙個尤拉常數,約等於0.58

簡單優化 埃式篩法

實際上並不需要將所有數的倍數全部刪掉,只把質數的倍數刪掉就可以了

假設剩下乙個p,我們並不需要將2p-1全部列舉一遍來判斷p是不是質數,只需要把2p-1的質數判斷一遍就可以了

2~p-1的所有質數只要不是p的約數,那麼p就是乙個質因數

當乙個數不是質數我們就不需要篩掉他所有倍數,只有他是質數才會篩掉他的倍數

int primes[n], cnt;     // primes儲存所有素數

bool st[n]; // st[x]儲存x是否被篩掉

void get_primes(int n)

}

線性篩法

在\(10^7\)以上線性篩法大約比埃式篩法快一倍

核心思路:每乙個數n只會被他的最小質因子篩掉

每乙個數只有乙個最小質因子,即每個數隻會被篩一次,所以他是線性的

int primes[n], cnt;     // primes儲存所有素數

bool st[n]; // st[x]儲存x是否被篩掉

void get_primes(int n)}}

j是從小到大列舉的所有質數,每一次把當前質數和i的乘積篩掉

i%pj == 0

說明primes[j]一定是i的最小質因子,pj也一定是pji的最小質因子

i%pj != 0

由於我們是從小到大列舉,沒有列舉到i的最小質因子

說明pj一定小於i的所有質因子,pj也一定是pji的最小質因子

一共有兩種可能:

i % primes[j] == 0

i % primes[j] != 0

不管什麼情況,一定有primes[j]是primes[j]*i的最小質因子

任何合數一定會被篩掉,對於任意合數x:

簡單數論初步

定義 設 a,b in mathbb 且 b neq 0 如果存在 q in mathbb 使得 a bq 則 b 整除a,記作 b mid a 此時 b 為 a 的因數,a 叫做 b 的倍數.性質1 如果a mid b 且 b mid c 那麼 c mid a 證明 設an b,bm c n,m ...

簡單數論定理

pi x 來表示小於乙個正實數 x 的素數個數 pi x frac x rightarrow infty 任何乙個大於1的自然數 n 都可以唯一分解成有限個質數的乘積 n p 1 p 2 p k 這裡 p i 均為質數,其諸指數 a i 是正整數。將 n 分解質因數得 n p 1 p 2 p k 則...

Strange List 簡單數論 冪次

題目 題意 給定乙個序列a ia i ai 和x,現要切分每個序列,如果當前數q qq能整除x,則往序列新增x個q x q xq x,接著繼續往後處理下乙個數,重複這個過程,直到遇到數q qq不能整除x。問最後新序列的數的總和。題解 觀察該過程,發現新增新數,本質上累加的是原始元素的權值。首先查詢這...