模运算的世界--费马小定理
1.费马小定理
在p是素数的情况下,对任意整数x都有x^p=x(mod p),这个定理称为费马小定理。
如果x无法被p整除,我们有x^(p-1)=1(mod p)。
上述式子变形后a^(-1)=a^(p-2)(mod p),因此可以通过快速幂运算求出逆元。
在不是素数的情况下,可以有类似的欧拉定理可以使用。m=p1^(e1)*p2^(e2)*p3^(e3)....pn^(en)
合数定理:一个数K能分解成p1^(q1)*p2^(q2)...
那么,这个数的因子个数就是(1+q1)*(1+q2)*...*(1+qk)
//求欧拉函数值。复杂度O(n½)
int euler_phi(int n)
{
int res=n;
for(int i=2;i*i<=n;i++)
{
if(n%2==0)
{
res=res/i*(i-1);
for(;n%i==0;n/=i);
}
}
if(n!=1)res=res/n*(n-1);
return res;
}
//O(maxn)时间内·筛出1-n欧拉函数值的表
const int maxn=100;
int euler[maxn];
void euler_phi2()
{
for(int i=0;i<maxn;i++)
{
euler[i]=i;
}
for(int i=2;i<maxn;i++)
{
if(euler[i]==i)
{
for(int j=i;j<maxn;j++)euler[j]=euler[j]/i*(i-1);
}
}
}