欧拉函数
对于正整数n,欧拉函数是小于或等于n的正整数中与n互质的数的数目,记作φ(n)(φ(1)=1).
如果a,b 是质数,φ(ab)=ab(1−1/a)(1−1/b)=a(1−1/a)b(1−1/b)=φ(a)φ(b);
求一个数的欧拉函数模板:
#include<iostream>
using namespace std;
int main()
{
int t;
cin >> t;
while(t--)
{
int a;
cin >> a;
int res=a;
for(int i=2;i<=a/i;i++)
{
if(a%i==0)
{
res=res/i*(i-1);
while(a%i==0)
{
a=a/i;
}
}
}
if(a>1)
{
res=res/a*(a-1);
}
cout << res << endl;
}
return 0;
}
求1~n中每一个数的欧拉函数:
#include <iostream>
using namespace std;
const int N=1001001;
bool st[N];
int p[N],phi[N];
int main()
{
int n;
cin >> n;
int cnt=0;
phi[1]=1;
for(int i=2;i<=n;i++)
{
if(!st[i])
{
p[cnt++]=i;
phi[i]=i-1;
}
for(int j=0;p[j]<=n/i;j++)
{
st[i*p[j]]=true;
//如果i能整除p[j]说明,i*p[j]的所有因子和i的相同,只需再乘个p[j]即可;
if(i%p[j]==0)
{
phi[i*p[j]]=phi[i]*p[j];
break;
}
phi[i*p[j]]=phi[i]*(p[j]-1);
}
}
long long sum=0;
for(int i=1;i<=n;i++)
{
sum+=phi[i];
}
cout << sum << endl;
return 0;
}
欧拉定理
若a和p互质 a^b(b为p的欧拉函数)≡1(mod p);
当p为质数时,就变成了费马小定理;
φ§是这等式成立的一组解,但最小的解一定是φ§的约数(结论);
当一个式子如上式,a和p不互质的话则无解;
费马小定理
假如p是质数,且gcd(a,p)≡1(mod p),那么a的(p-1)次方除以p的余数恒等于1;
a^(p-1)≡1(mod p);
两边同除以p得到 a^(p-2)≡1/a(mod p);
所以 inv(a)=a^(p-2)(mod p);