欧拉函数在编程中是非常重要的一个版块:
φ函数的值 通式:φ(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本身)。 (注意:每种质因数只一个。比如12=2*2*3
欧拉公式
那么φ(12)=12*(1-1/2)*(1-1/3)=4
要灵活运用公式:
C++代码:
#include
#include
using namespace std;
#define N 10000000
int main(int argc, const char *argv[])
{
int *phi;
char *prime;
prime = (char*)malloc((N + 1) * sizeof(char));
prime[0] = prime[1] = 0;
for(int i = 2; i <= N; i++)
prime[i] = 1;
for(int i = 2; i + i <= N; i++)
if(prime[i])
for(int j = i * i; j <= N; j += i)
prime[j] = 0;
//这段求出了N内的所有素数
phi = (int*)malloc((N + 1) * sizeof(int));
for(int i = 1; i <= N; i++)
phi[i] = i;
for(int i = 2; i <= N; i++)
if(prime[i])
for(int j = i; j <= N; j += i)
phi[j] = phi[j] / i * (i - 1); //此处注意先/i再*(i-1),否则范围较大时会溢出
return 0;
}
//这段求出了N内所有数的欧拉函数值
C语言函数,复杂度(sqrt(n))
int eular(int n)
{
int ret=1,i;
for(i=2;i*i<=n;i++)
if(n%i==0)
{
n/=i,ret*=i-1;
while(n%i==0)
n/=i,ret*=i;
}
if(n>1)
ret*=n-1;
return ret;
}