1性质
欧拉函数是指:对于一个正整数n,小于n且和n互质的正整数(包括1)的个数,记作φ(n) 。
通式:φ(x)=x*(1-1/p1)*(1-1/p2)*(1-1/p3)*(1-1/p4)…..(1-1/pn),其中p1, p2……pn为x的所有质因数,x是不为0的整数。φ(1)=1(唯一和1互质的数就是1本身)。
对于质数p,φ(p) = p - 1。注意φ(1)=1.
欧拉定理:对于互质的正整数a和n,有a^φ(n) ≡ 1 mod n 即 。
欧拉函数是积性函数——若m,n互质,φ(mn)=φ(m)φ(n)。
若n是质数p的k次幂,φ(n)=p^k-p^(k-1)=(p-1)p^(k-1),因为除了p的倍数外,其他数都跟n互质。
特殊性质:当n为奇数时,φ(2n)=φ(n)
欧拉函数还有这样的性质:
设a为N的质因数,若(N % a == 0 && (N / a) % a == 0) 则有E(N)=E(N / a) * a;若(N % a == 0 && (N / a) % a != 0) 则有:E(N) = E(N / a) * (a - 1)。
代码实现:
#include //欧拉之实现
int ef(int n)
{
int cnt=n;
int i;
for(i=2;i<=n;i++)
if(n%i==0)
{
cnt - =cnt/i; // m-m/p
while(n%i==0)
n/=i;
}
return cnt;
}
int main()
{
int n;int m;
int count;
while(scanf("%d",&m)!=EOF)
{
while(m--){
scanf("%d",&n);
count=ef(n);
printf("%d\n",count);}
}
return 0;
}
2模版以及一些快速求值方法
//线性,最快但是很占内存
const int maxp = 1000000 + 5;
LL pri[maxp], phi[maxp], pnum;
bool vis[maxp];
void phi_table(int n) {
pnum = 0;
phi[1] = 1;
for(int i = 2;i <= n; i++){
if(!vis[i]) {
pri[pnum++] = i;
phi[i] = i-1;
}
for(int j = 0;j < pnum; j++) {
if(i*pri[j] > n) break;
vis[i * pri[j]] = true;
if(i % pri[j] == 0) {
phi[i*pri[j]] = phi[i]*pri[j];
break;
}
phi[i * pri[j]] = phi[i]*(pri[j] - 1);
}
}
}
//非线性模版
LL phi[maxp];
void init()//筛选法求欧拉函数的模版,比线性的慢,但是不消耗内存
{
memset(phi, 0, sizeof(phi));
phi[1] = 1;
for(int i = 2; i < maxp; i++) if(!phi[i])
{
for(int j = i; j < maxp; j+=i)
{
if(!phi[j]) phi[j] = j;
phi[j] = phi[j] / i * (i-1);
}
}
return ;
}
//筛选法 同时求出了n以内的素数
LL phi[N+10];//sum[N+10];
bool prime[N+10];
void init()
{
LL i,j;
memset(prime,true,sizeof(prime));
prime[0]=prime[1]=false;
for(i=2;i*i<=N;i++)
{
if(prime[i])
{
for(j=i*i;j<=N;j+=i)
{
prime[j]=false;
}
}
} //这段求出了N内的所有素数
for(i=1;i<=N;i++)
{
phi[i]=i;
}
//sum[0]=0;
//sum[1]=phi[1];
for(i=2;i<=N;i++)
{
if(prime[i])
{
for(j=i;j<=N;j+=i)
{
phi[j]=phi[j]/i*(i-1); //此处注意先/i再*(i-1),否则范围较大时会溢出
}
}
//sum[i]=sum[i-1]+phi[i];
}
}//这段求出了N内所有数的欧拉函数值
//无需数组存欧拉函数值,肥预处理型用的
void init()//这段求出了N内的所有素数
{
ll i,j;
for(i=2;i<=N;i++)
{
if(!isprime[i])
prime[cnt++]=i;
for(j=0;j
isprime[i*prime[j]]=true;
}
}
cnt--;
isprime[1]=true;
}
ll euler(ll n)//这里利用上面求出来的 素数来进行求解就会快很多,
{
ll i;
ll tempn=n;
ll ans=n;
for(i=0;i<=cnt && prime[i]*prime[i]<=n;i++)
{
if(n%prime[i]==0)
{
ans=ans/prime[i]*(prime[i]-1);
while(tempn%prime[i]==0)
tempn/=prime[i];
}
}
if(tempn>1)
ans=ans/tempn*(tempn-1);
return ans;
}
3
关于 A^x = A^(x % Phi(C) + Phi(C)) (mod C) 的若干证明】【指数循环节】
转了图片就没了 只转个地址