1.欧几里得
int gcd(int a,int b){
while(b){
int t=a%b;
a=b;
b=t;
}
return a;
}
2.扩展欧几里得
乘法逆元:如果有ax≡1( mod p),则称x是mod p意义下a的乘法逆元。
逆元:x是最小的正整数解;
int e(int a,int b,int &x,int &y){
if(b!=0){
x=1;
y=0;
return a;
}
int ans=e(b,a%b,x,y)
int temp=x;
x=y;
y=temp-(a/b)*x;
return ans;
} //ans是最大公约数,x是逆元;
3.欧拉函数
Euler函数表达通式:euler(x)=x(1-1/p1)(1-1/p2)(1-1/p3)(1-1/p4)…(1-1/pn),其中p1,p2……pn为x的所有素因数,x是不为0的整数。euler(1)=1(唯一和1互质的数就是1本身)。
欧拉公式的延伸:一个数的所有质因子之和是euler(n)*n/2。.
int Euler(int n){
int ret=n;
for(int i=2;i<=sqrt(n);i++)
if(n%i==0){
ret=ret/i*(i-1);//先进行除法防止溢出(ret=ret*(1-1/p(i)))
while(n%i==0)
n/=i;
}
if(n>1)
ret=ret/n*(n-1);
return ret;
}
4.中国剩余定理
设正整数两两互素,则同余方程组
有整数解。并且在模下的解是唯一的,解为
其中,而为模的逆元。
int shengyu(int a[],int m[],int n) {
int M = 1;
int ans = 0;
for(int i=1; i<=n; i++)
M*=m[i];
for(int i=1; i<=n; i++) {
int x,y;
int Mi=M/m[i];
e(Mi,m[i],x,y); //扩展欧几里得
ans=(ans+Mi*x*a[i])%M;
}
if(ans<0) ans+=M;
return ans;
}
5.费马小定理
即费马小定理。
容易知:逆元即为 x^(p-2);
long long qmod(long long a, long long b, long long p) {
long long ans= 1;
long long base= a%p;
while(b) {
if(b&1)
ans=(ans*base)%p;
base=(base*base)%p;
b>>= 1;
}
return ans;
}