数论入门 2021-2-28
一、
模運(yùn)算
當(dāng)答案或者運(yùn)算過程中數(shù)據(jù)太大,題目要求輸出答案對某個大數(shù)據(jù)取模,
有以下結(jié)論:
c++語言取模過程中,會遵循商盡量大的原則,所以(-5)%3=-2
這個不符合數(shù)學(xué)上取模的標(biāo)準(zhǔn),因此使用c++對減法取模應(yīng)該寫成:
二、質(zhì)數(shù)
1~n當(dāng)中,大約有nln(n)\frac{n}{ln(n)}ln(n)n?個質(zhì)數(shù)
1、質(zhì)數(shù)篩
埃氏篩
復(fù)雜度為O(nlg(lg(n)))
//此處有個小優(yōu)化,嵌套的循環(huán)內(nèi)jjj從 i?ii * ii?i 開始,而不是i+ii + ii+i開始,因?yàn)?span id="ozvdkddzhkzd" class="katex--inline">i?(2?>i?1)i*(2 ->i-1)i?(2?>i?1)在這之前都已經(jīng)被篩去。
歐拉篩
復(fù)雜度O(n)
2、質(zhì)因數(shù)分解----試除法
任意正整數(shù)nnn最多有一個比sqrt(n)sqrt(n)sqrt(n)大的質(zhì)因子,質(zhì)因數(shù)分解模版如下:
(?????????)
質(zhì)因數(shù)分解模版
三、約數(shù)
1、試除法
直接枚舉從1~sqrt(n)所有的數(shù)字,可以得到n所有的約數(shù)。
每個數(shù)的約數(shù)個數(shù)期望為lg(n).
2、約數(shù)個數(shù)和約數(shù)之和
先對N進(jìn)行質(zhì)因數(shù)分解,假設(shè)分解后:
o(`ω′ )o:::::
N==p1c1?p2c2?...?pkckN== p_1^{c_1} * p_2^{c_2} * ... *p_k^{c_k}N==p1c1???p2c2???...?pkck??
(pi為質(zhì)因子,ci為質(zhì)因子對應(yīng)的次數(shù))
那么N的約數(shù)個數(shù)為::
(c1+1)?(c2+1)?...?(ck+1)(c1 + 1) * (c2 + 1) * ... * (ck + 1)(c1+1)?(c2+1)?...?(ck+1)
N的約數(shù)之和為::
(p10+p11+...+p1c1)?...?(pk0+pk1+...+pkck)(p_1^0 + p_1^1 + ... + p_1^{c_1}) * ... * (pk^0 + pk^1 + ... + pk^{c_k})(p10?+p11?+...+p1c1??)?...?(pk0+pk1+...+pkck?)
(把上式子展開后,直接看出為計(jì)算每個約數(shù)的和)
3、最大公約數(shù)(gcd)
歐幾里得算法
gcd(a,b)=gcd(b,agcd(a,b)=gcd(b,a%b)gcd(a,b)=gcd(b,a
(好神奇啊!)? ????
int gcd(int a,int b){if(b==0){return a;}elsereturn gcd(b,a%b); }四、歐拉函數(shù)
1、定義
歐拉函數(shù)是小于n的正整數(shù)中與n互質(zhì)的數(shù)的數(shù)目(比如φ(1)=1φ(1)=1φ(1)=1)
2、公式
φ(N)=N?(1?1p1)?.....?(1?1pi)φ(N)=N*(1-\frac{1}{p_1}) * ..... * (1-\frac{1}{p_i})φ(N)=N?(1?p1?1?)?.....?(1?pi?1?)
其中pip_ipi?為NNN的質(zhì)因子。
3、篩法求1~n的歐拉函數(shù)
void get_eulers(int n){//得到1~n所有歐拉函數(shù)的值//其實(shí)是歐拉篩變體int cnt=0;phi[1]=1;for(int i=2;i<=n;i++){if(!vis[i]){prim[++cnt]=i;//如果這個數(shù)是個素?cái)?shù),顯然在1~i之間,有i-1個數(shù)與其互質(zhì)phi[i]=i-1;}for(int j=1;prim[j]*i<=n&&j<=cnt;j++){vis[i*prim[j]]=1;if(i%prim[j]==0){//如果prim[j]是i的因子//根據(jù)公式,phi[i]=i*(1-1/P1)*...*(1-1/Pi)//i*prim[j]的所有因子跟i相同//phi[i*prim[i]]=prim[i]*i*(1-1/P1)*...*(1-1/Pi)=phi[i]*prim[i]phi[i*prim[j]]=phi[i]*prim[j];break;}//如果prim[j]不是i的因子//那么i*prim[j]的因子與i相差一個prim[j]//phi[i*prim[i]]=phi[i]*prim[j]*(1-1/prim[j])=phi[i]*phi[prim[j]]phi[i*prim[j]]=phi[i]*(prim[j]-1);}} }歐拉定理
如果a與n互質(zhì),那么aphi(n)≡1(modn)a^{phi(n)}≡1(mod n)aphi(n)≡1(modn).
四、快速冪
ll my_pow(int a,int k,int p=1e9+7){ll res=1;while(k){if(k&1){//如果k不能整除2res=(res*a)%p;}k>>=1;a=(a*a)%p;//讓底數(shù)平方}return res; }總結(jié)
以上是生活随笔為你收集整理的数论入门 2021-2-28的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 密码(图解密码技术)_第二章_Enigm
- 下一篇: 排序算法(天勤数据结构高分笔记)