數論筆記。

篩素數

int num;
int prime[maxn], sf[maxn];
void shai(int n){
	memset(sf, 1, sizeof sf);
	sf[1]=sf[0]=0;
	for(int i=2; i<=n; i++){
		if(sf[i]) prime[++num]=i;
		for(int j=1; j<=num; j++){
			if(i*prime[j]>maxn) break;
			sf[i*prime[j]]=1;
			if(i%prime[j]==0)break;
		}
	}
}

如果多次詢問區間素數個數顯然可以用前綴和優化。

int cnt[maxn];//前綴和 
void qzh(int n){
	int tot=0;
	for(int i=1; i<=n; i++){
		if(sf[i]) tot++;
		cnt[i]=tot; 
	}
}

逆元

線性推逆元

p爲素數。

\(inv[i]=(p-p/i)*inv[p\%i]\%p\)

模板題1

p一定爲質數,直接線性推就好了。

#include<bits/stdc++.h>
#define N 3000001
typedef long long ll;
using namespace std;
int inv[N], n, p;
int main(){
    scanf("%d%d", &n, &p);
	inv[1]=1;
	printf("1\n");
    for(int i=2;i<=n;i++){
        inv[i]=(ll)(p-p/i)*inv[p%i]%p;
        printf("%d\n",inv[i]);
    }
	return 0;
}

單個逆元求法

模板題2

\(x∗b≡1(\mod p)\) 注意:被除數與n要求互質。

·若p爲素數顯然費馬小定理。
·用exgcd求解\(x*b+y*p=1\)
·根據歐拉公式,\(x=b^{\phi(n−1)}(\mod p)\)

費馬小定理求模質數意義上的逆元

代碼顯然。

歐拉定理求模任意數意義上的逆元

篩出歐拉函數。

於是就順便說一下歐拉函數

歐拉函數\(\phi(n)\)即n以內n的約數的個數。

由歐拉定理:\(a^\phi(p)≡1(\mod p)\)

顯然a的逆元\(b=a^{\phi(p)-1}\);

CODE:

#include<iostream>
#include<cstdio>
#define ll long long
using namespace std;
int a, b;
int phi(int n){//求歐拉函數。
	int ans=1;
	for(int i=2; i*i<=n; ++i){
		if(n%i==0) {
			n/=i;
			ans*=i-1;
			while(n%i==0){
				n/=i;
				ans*=i;
			}
		}
	}
	if(n>1)
		ans*=n-1;
	return ans;
}
ll ksm(int n, int k){
	ll res=1;
	while(k){
		if(k&1)res=res*n%b;
		n=n*n%b;
		k>>=1;
	}
	return res;
}
int main() {
	scanf("%d%d", &a, &b);
	printf("%d", ksm(a, phi(b)-1));
	return 0;
}

奇怪的數

常見的遞推關係

EXCRT

問題

求解同餘方程組

\(\left\{\begin{aligned}x\equiv\ a_1(\mod m_1) \quad\\ x\equiv\ a_2(\mod m_2) \quad\\ x\equiv\ a_3(\mod m_3) \quad\\ ...\quad\\x\equiv\ a_k(\mod m_k) \quad\end{aligned}\right.\)

其中\(m_1,m_2,m_3...m_k\)不一定兩兩互質的整數, 求\(x\)的最小非負整數解

求解

假設已經求出前\(k-1\)個方程組成的同餘方程組的一個解爲\(x\)

且有\(M=\prod_{i-1}^{k-1}m_i\)

則前\(k-1\)個方程的方程組通解爲\(x+i*M(i\in Z)\)

那麼對於加入第\(k\)個方程後的方程組

我們就是要求一個正整數\(t\),使得 \(x+t*M \equiv a_k(\mod m_k)\)

轉化一下上述式子得\(t*M \equiv a_k-x(\mod m_k)\)

對於這個式子我們已經可以通過exgcd求解\(t\)

若該同餘式無解,則整個方程組無解, 若有,則前\(k\)個同餘式組成的方程組的一個解解爲\(x_k=x+t*M\)

所以整個算法的思路就是求解\(k\)次擴展歐幾里得

更多

here
以及
here

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章