第四章 数学知识 欧拉函数

1、欧拉函数

1∼N 中与 N 互质的数的个数被称为欧拉函数,记为 ϕ ( N ) \phi(N) ϕ(N)
若在算数基本定理中,N= p 1 k 1 p 2 k 2 p 3 k 3 . . . p n k n p_1^{k1}p_2^{k2}p_3^{k3}...p_n^{kn} p1k1p2k2p3k3...pnkn,则有

ϕ ( N ) = N ( 1 − 1 p 1 ) ( 1 − 1 p 2 ) . . . ( 1 − 1 p n ) \phi(N) = N(1-\frac{1}{p_1})(1-\frac{1}{p_2}) ...(1-\frac{1}{p_n}) ϕ(N)=N(1p11)(1p21)...(1pn1)

这个公式可以这样推导:
一到N中,一共有N个数字。其中, p 1 p_1 p1的倍数,一共有 N p 1 \frac{N}{p_1} p1N个,同理 p 2 p_2 p2的倍数有 N p 2 \frac{N}{p_2} p2N个,后面同理。这些个数字一定都不是质数,所以要把他们减去。但是还有些数既是 p 1 p_1 p1 p 2 p_2 p2等类似两个质因数的倍数,这些数字都在前面减了两次,需要把多减的一次加上。但是还有是三个质因数倍数的数字,一开始被减掉了3次,后来又被加上了3次,所以还是要再减掉1次…于是我们得到了下面的式子
ϕ ( N ) = N − N p 1 − N p 2 − . . . − N p n + N p 1 p 2 + N p 1 p 3 + . . . N p n − 1 p n − N p 1 p 2 p 3 − N p 1 p 3 p 4 − . . − N p n − 2 p n − 1 p n . . . \phi(N) = N - \frac{N}{p_1} - \frac{N}{p_2} - ... - \frac{N}{p_n}+\frac{N}{p_1p_2}+\frac{N}{p_1p_3} +...\frac{N}{p_{n-1}p_{n}}-\frac{N}{p_1p_2p_3}-\frac{N}{p_1p_3p_4} - ..-\frac{N}{p_{n-2}p_{n-1}p_{n}}... ϕ(N)=Np1Np2N...pnN+p1p2N+p1p3N+...pn1pnNp1p2p3Np1p3p4N..pn2pn1pnN...
整理后就可以得到上面的式子

int n,res;
//分解质因数,并套用公式
for(int i = 2; i <= n / i; i ++)
{
	if(n % i == 0)
	{	
		res = res / i * (i - 1);
		while(n % i == 0)
		{
			n /= i;
		}
	}
	if(n > 1) res = res / n * (n - 1);
}		

2、筛法求欧拉函数

这种方法是用来解决求1-N中每个数的欧拉函数。过程中利用了质数的线性筛法
ps:利用线性筛法可以同时求出不少东西
这里我们先给出代码,再来解释合理性

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[p[j] * i] = true;
       if(i % p[j] == 0) {
          phi[i * p[j]] = p[j] * phi[i];
          break;
       }
       phi[i * p[j]] = (p[j]- 1) * phi[i];
   }
}

phi[i]用来记录i的欧拉函数值,p用来记录所有的质数,st用来表示哪些数还未筛掉。
这里phi[i]的记录分成了三类

  • i为质数的时候
    因为质数与所有除了1和其自身的数字之外互质,所以应该是i-1
  • 当i % p[j] == 0的时候
    此时i * p[j]的所有质因数与i的所有质因数相同,也就是
    phi[i * p[j]] = i * p[j] * ( 1 − 1 p 1 ) ( 1 − 1 p 2 ) . . . ( 1 − 1 p n ) (1-\frac{1}{p_1})(1-\frac{1}{p_2}) ...(1-\frac{1}{p_n}) (1p11)(1p21)...(1pn1)=p[j] * ϕ ( i ) \phi(i) ϕ(i) = p[j] * phi[i]
  • 当i%p[j] != 0的时候
    此时i*p[j]与i的质因数不相同,i*p[j]还多一个p[j],有下面的式子
    phi[i * p[j]] = i * p[j] * ( 1 − 1 p 1 ) . . . ( 1 − 1 p j ) . . . ( 1 − 1 p n ) = p [ j ] ∗ ( 1 − 1 p j ) ϕ ( i ) = ( p [ j ] − 1 ) ∗ p h i [ i ] (1-\frac{1}{p_1})...(1-\frac{1}{p_j}) ...(1-\frac{1}{p_n})=p[j] *(1-\frac{1}{p_j}) \phi(i) = (p[j] -1)* phi[i] (1p11)...(1pj1)...(1pn1)=p[j](1pj1)ϕ(i)=(p[j]1)phi[i]

参考资料

Acwing

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值