欧拉函数
欧拉函数是小于n的正整数中与n互质的数的数目(φ(1)=1)。(例如φ(8)=4,因为1,3,5,7均和8互质。)
通式:
其中p1, p2……pn为x的所有质因数,x是不为0的整数。
质因数:质因数(素因数或质因子)在数论里是指能整除给定正整数的质数。
int ouler(int n)
{
int number = 1, i;
for(i=2; i*i <= n; i++)
{
if(n%i == 0)
{
n =n/ i;
number *= (i-1);
while(n%i == 0)
{
n /= i;
number *= i;
}
}
}
if(n > 1)
number *= (n-1);
return number;
}
欧拉定理
若n,a为正整数,且n,a互质,则:
降幂
ab≡{ab%φ(n)( mod  n) n,a互质ab( mod  n) b<φ(n)ab%φ(n)+φ(n)( mod  n) b≥φ(n)a^b\equiv \left\{ \begin{aligned} a^{b\%\varphi(n)}(\bmod\ n)\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ n,a互质\\ a^b (\bmod\ n)\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ b<\varphi(n)\\ a^{b\%\varphi(n)+\varphi(n)}(\bmod\ n)\ \ \ \ \ \ \ \ b\geq\varphi(n) \end{aligned} \right.ab≡⎩⎪⎪⎨⎪⎪⎧ab%φ(n)(mod n) n,a互质ab(mod n) b<φ(n)ab%φ(n)+φ(n)(mod n) b≥φ(n)
#include <stdio.h>
#include <string.h>
int main()
{
long long int a,p;
long long int b=0;
char s[100];
printf("底数 指数 模数\n");
scanf("%lld %s %lld",&a,s,&p);
int phi=ouler(p),len=strlen(s);
printf("phi(%lld)=%d\n",p,phi);
for(int i=0; i<len; i++)
b=(b*10+s[i]-'0')%phi;
int result=quickpow(a,b+phi,p);
printf("%d",result%p);
}
int quickpow(long long int a,long long int b,long long int p)
{
long long int r=1,base=a;
while(b)
{
if(b%2)
r=r*base%p;
base=base*base%p;
b=b/2;
}
return r;
}
int ouler(int n)
{
int result=n;
for(int i=2; i*i<=n; i++)
{
if(n%i==0)
{
n=n/i;
result=result*(i-1)/i;
while(n%i==0){
n=n/i;
}
}
}
if(n>1)
result=result*(n-1)/n;
return result;
}