Loading

欧拉函数基础 学习笔记

供复习,无证明过程。

一、基本知识

  • \(\varphi(n)\) 定义为 \([1,n]\) 中与 \(n\) 互质的整数的个数。两个数互质即最大公因数为 \(1\)

    例如,\(\varphi(3) = 2,\varphi(9) = 7\)

二、一些性质

  1. \(n\) 为质数,有 \(\varphi(n) = n - 1\)

  2. 欧拉函数是积性函数。\(x,y\) 互质,有 \(\varphi(xy) = \varphi(x) \times \varphi(y)\)

  3. \(x\) 是奇数,有 \(\varphi(2x) = \varphi(x)\)

  4. \(\varphi(x)=x\prod_{i=1}^n(1-\frac{1}{p_i})\)

  5. \(p\) 为质数:

  • \(p|i\),有 \(\varphi(ip) = \varphi(i) * p\)

  • 否则,有 \(\varphi(ip) = \varphi(i) * (p-1)\)

运用 4、5 两个性质,我们有:

三、欧拉筛

A 求单个数字的欧拉函数值

通过上面 性质4,我们可以在 \(O(\sqrt{n})\) 内求出一个数字的欧拉函数值。

代码:下面实现了求 \(M\) 的欧拉函数值。

void prephi() {
	phi = M;
	LL m = M;
	for(LL i = 2; i * i <= m; ++i) {
		if(!(m % i)) {
			phi *= (i - 1);
			phi /= i;
			m /= i;
		}
		while(!(m % i)) m /= i;
	}
	if(m > 1) {
		phi *= (m - 1);
		phi /= m;
	}
}

B 欧拉筛

通过上面 性质5,我们可以在 \(O(n)\) 内求出 \(1\) ~ \(n\) 的欧拉函数值。其实实现比较简单,只要在 线性筛素数 的基础上加一点。

代码:下面实现了求 \(1\) ~ \(N\) 的欧拉函数值。

void prephi() {
	memset(isp, true, sizeof(isp));
	isp[1] = 0, phi[1] = 1;
	for(int i = 2; i <= N; i++) {
		if(isp[i]) {
			prime[++prime_num] = i;
			phi[i] = i - 1;
		}
		for(int j = 1; j <= prime_num && prime[j] * i <= N; j++) {
			isp[i * prime[j]] = 0;
			if(!(i % prime[j])) {
				phi[i * prime[j]] = phi[i] * prime[j];
				break;
			}
			else phi[i * prime[j]] = phi[i] * (prime[j] - 1);
		}
	}
}

四、欧拉定理及其扩展

A 欧拉定理

  • \(a,m\) 互质,有 \(a^{\varphi(m)}≡1(mod\ m)\)

  • 特别地,当 \(m\) 为质数,即为 费马小定理

  • 上式也可以扩展为 \(a^b≡a^{b \mod \varphi(m)}(mod\ m)\) , 此时仍要求 \(a,m\) 互质。

B 扩展欧拉定理

  • \(b > \varphi(m)\) , 有 \(a^b≡a^{b \mod \varphi(m) + \varphi(m)}\left(mod\ m\right)\),此式不要求 \(a,m\) 互质。

  • 注意当 \(b ≤ \varphi(m)\) 时无效。

P5091 【模板】欧拉定理

P2158 SDOI2008 仪仗队

P4139 上帝与集合的正确用法

参考

咕咕日报#200 欧拉系列 作者:Morning-Glory

有关证明和进一步的学习可以点击链接。个人认为讲的不错。

posted @ 2020-08-01 12:03  Sqrtyz  阅读(259)  评论(0)    收藏  举报