威尔逊定理在写了在写了
互质
对于任意的自然数 a , b a,b a,b 若有 g c d ( a , b ) = 1 gcd(a,b)=1 gcd(a,b)=1,则说 a , b a,b a,b 互为质数。
欧拉函数(容斥定理)
解析
一、欧拉函数
欧拉函数 φ ( n ) \varphi(n) φ(n),指的是 1 ∼ n 1\sim n 1∼n 中与 n n n 互质的数的个数。 φ ( 6 ) = 2 \varphi(6)=2 φ(6)=2。
欧拉函数存在一个公式,这个公式同样要使用之前的算数基本定理。
N
=
p
1
α
1
p
2
α
2
⋯
p
k
α
k
N=p_1^{\alpha_1}p_2^{\alpha_2}\cdots p_k^{\alpha_k}
N=p1α1p2α2⋯pkαk
φ ( N ) = N ( 1 − 1 p 1 ) ( 1 − 1 p 2 ) ⋯ ( 1 − 1 p k ) \varphi(N)=N(1-\frac{1}{p_1})(1-\frac{1}{p_2})\cdots(1-\frac{1}{p_k}) φ(N)=N(1−p11)(1−p21)⋯(1−pk1)
φ ( 6 ) = 6 ( 1 − 1 2 ) ( 1 − 1 3 ) = 2 \varphi(6)=6(1-\frac{1}{2})(1-\frac{1}{3})=2 φ(6)=6(1−21)(1−31)=2。
二、求解
这里使用了容斥原理,
(1)从 1 ∼ N 1\sim N 1∼N 中去除 p 1 , p 2 , ⋯ , p k p_1,p_2,\cdots,p_k p1,p2,⋯,pk 的所有倍数。
(2)加上所有 p i ∗ p j p_i*p_j pi∗pj 的倍数。
(3)减去所有 p i ∗ p j ∗ p k p_i*p_j*p_k pi∗pj∗pk 的倍数。
(4) ⋯ \cdots ⋯。
使用公式表现为。
φ
(
n
)
=
N
−
N
p
1
−
N
p
2
−
⋯
−
N
p
k
+
N
p
1
p
2
+
N
p
1
p
3
+
⋯
+
N
p
k
−
1
p
k
−
N
p
1
p
2
p
3
−
N
p
1
p
2
p
4
−
⋯
−
N
p
k
−
2
p
k
−
1
p
k
⋯
⋯
\begin{aligned} \varphi(n)=& N-\frac{N}{p_1}-\frac{N}{p_2}-\cdots-\frac{N}{p_k}\\ & +\frac{N}{p_1p_2}+\frac{N}{p_1p_3}+\cdots+\frac{N}{p_{k-1}p_k}\\ & -\frac{N}{p_1p_2p_3}-\frac{N}{p_1p_2p_4}-\cdots-\frac{N}{p_{k-2}p_{k-1}p_k}\\ & \cdots\cdots \end{aligned}
φ(n)=N−p1N−p2N−⋯−pkN+p1p2N+p1p3N+⋯+pk−1pkN−p1p2p3N−p1p2p4N−⋯−pk−2pk−1pkN⋯⋯
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-taUXDWqi-1652423268318)(C:/Users/李俊霖/AppData/Roaming/Typora/typora-user-images/image-20220509193744870.png)]
模板
int phi(int x){
int res=x;
for(int i=2;i<=x/i;i++)
if (x%i==0){
res=res/i*(i-1);
while(x%i==0)x/=i;
}
if(x>1)res=res/x*(x-1);
return res;
}
例题
#include <iostream>
using namespace std;
int t,n;
int phi(int x){
int res=x;
for(int i=2;i<=x/i;i++){
if(x%i==0){
res=res/i*(i-1);
while(x%i==0)x/=i;
}
}
if(x>1)res=res/x*(x-1);
return res;
}
void slove(){
cin>>n;
cout<<phi(n)<<endl;
}
int main(){
cin>>t;
while(t--)slove();
return 0;
}
筛法求欧拉函数
解析
筛法求欧拉函数是在线性筛质数的过程中可以顺带完成的。
模板
void get_eulers(int n){
euler[1]=1;
for(int i=2;i<=n;i++){
if(!st[i]){
primes[cnt++]=i;
euler[i]=i-1;
}
for(int j=0;primes[j]<=n/i;j++){
int t=primes[j]*i;
st[t]=true;
if(i%primes[j]==0){
euler[t]=euler[i]*primes[j];
break;
}
euler[t]=euler[i]*(primes[j]-1);
}
}
}
例题
#include <iostream>
using namespace std;
typedef long long LL;
const int N=1e6+10;
int primes[N],cnt,euler[N],n;
bool st[N];
void get_eulers(int n){
euler[1]=1;
for(int i=2;i<=n;i++){
if(!st[i]){
primes[cnt++]=i;
euler[i]=i-1;
}
for(int j=0;primes[j]<=n/i;j++){
int t=primes[j]*i;
st[t]=true;
if(i%primes[j]==0){
euler[t]=euler[i]*primes[j];
break;
}
euler[t]=euler[i]*(primes[j]-1);
}
}
}
int main(){
cin>>n;
get_eulers(n);
LL res=0;
for(int i=1;i<=n;i++)res+=euler[i];
cout<<res<<endl;
return 0;
}
欧拉定理
解析
一、定义
欧拉定理,若 a a a 与 n n n 互质,则 a φ ( n ) ≡ 1 ( m o d n ) a^{\varphi(n)}\equiv1(mod\ n) aφ(n)≡1(mod n)。 a = 5 , n = 6 a=5,n=6 a=5,n=6, 5 φ ( 6 ) m o d 6 = 5 2 m o d 6 ≡ 1 5^{\varphi(6)}\ mod\ 6=5^2\ mod\ 6\equiv1 5φ(6) mod 6=52 mod 6≡1。
二、证明