莫反,欧拉,扩展欧拉

对欧拉定理 , 莫比乌斯等过敏者请慎重食用

  • 简单涉猎一下数论,讲的顺序很迷,,,一些东西了解个大概就好,莫要深究哈
  • 数论这个东西, 尤其像莫比乌斯和欧拉这种, 基本上就是靠临场推式子, 会证明只是个心理基础(当然你也可以直接用,但明白了为什么,用起来会更得心应手)
  • 若无特殊说明,则突然出现的某个函数默认为积性函数
  • 应该用不了(60min)(希望)
  • 这堂课应该没题(大概)
  • 有什么不懂的, 这课件上面又没说(或只打了个“显然”什么的),直接问我, 我能口胡就口胡,口胡不了就让(YLCH)上((q(>-<)p

前(che)摇(dan)

积性函数:

对于任意互质的整数a和b有性质(large f(a*b)=f(a)*f(b))的数论函数。

完全积性函数:

对于任意整数a和b有性质(large f(a*b)=f(a)*f(b))的数论函数。

0/0 引入几个函(fei)数(hua)

1.恒等函数_不管参数是什么,函数值恒为1

(I(n) = 1)(id_0 (n) = 1)

2.元函数_只在参数为1时函数值为1,其余情况皆是0

(e(n) = [n = 1])

e 实际上是 (largeepsilon),但是太难打了......

3.单位函数_函数值就是参数值

$ id_1 (n) = n $

这三个函数都是完全积性函数

。。。有点觉得这三个函数没啥用(就跟废话一样)

不!它们有大用!(其实的确挺废物的)

下面是一些稍作了解的函数全是废话

积性函数
φ(n) -欧拉函数,计算与n互质的正整数之数目

μ(n) -莫比乌斯函数,关于非平方数的质因子数目

d(n) -n的正因子数目

σ(n) -n的所有正因子之和

σk(n)-因子函数,n的所有正因子的k次幂之和,当中k可为任何复数。

I(n) -不变的函数,定义为 1(n) = 1 (完全积性)

Id_k(n)-单位函数,定义为 Idk(n) = nk(完全积性)id_0(n) = I(n) = 1

ε(n) -定义为:若n = 1,ε(n)=1;若 n > 1,ε(n)=0。别称为“对于狄利克雷卷积的乘法单位”(完全积性)

λ(n) -刘维尔函数,关于能整除n的质因子的数目

γ(n),定义为γ(n)=(-1)^ω(n),在此加性函数ω(n)是不同能整除n的质数的数目

另外,所有狄利克雷特征均是完全积性的[1]

1/0 狄利克雷卷积

我们用符号 * 表示两个函数卷积

形如

[large (f * g) (n) = sum_{d|m} f(d) g(frac{n}{d}) ]

“(n)”在平常可以省略, n 指参数大小

(好了接下来我就把它省略了,因为 * 这玩意容易和乘积弄混,所以下面仔细听我说)

他满足

交换律 $ large f * g = g * f$

结合律 $large (f * g) * h = f * (g * h) $

分配律 $large (f + g) * h = f * h + g * h $

证明口胡就行

好了, 接下来开始跟我一起进行无厘头的推导)))

试想, 有一个积性函数 (f) , 卷上元函数((e(n) = [n = 1])),会发生什么?

[large f * e = sum_{d | n} f(d)e(frac{n}{d}) ]

然后显然这个式子只在 (d=n) 时有值

所以上式等价于

[large f * e = sum_{d|n}f(d)[d = n] = f ]

写简洁点 (large f*e = f)

这个很重要

2/0莫比乌斯

莫比乌斯函数,符号为 (mu)

它表示的值咋算呢,(Ame) 大佬给了一个神奇的定义式, 还有一个计算公式

定义式:

[large mu(m) = egin{cases} (-1)^r & ext{$m = p_1p_2...p_r$}\ 0 & ext{$m$能被某个$p^2$整除} end{cases} ]

计算式

[large sum_{d|n}mu(d) = [n=1] ]

细想,上面的式子可不可以用狄利克雷卷积表示呢?

左式多乘以一个恒等函数应该没关系吧

右式貌似也可以用元函数换掉,emm....有了!

[largesum_{d|n}mu(d)id_0(frac{n}{d}) = e(n) ]

(mu * id_0 = e)

这个很重要


回想上面已经证明得到的两个卷积式

(large f *e = f)

(large mu * id_0 = e)

有了这个,接下来就说说莫比乌斯反演

先上公式

[large g(m) = sum_{d|m}f(d) ]

卷积表示为 (g = f * id_0) (1)

[large f(m) = sum_{d|m}mu(d)g(frac{m}{d}) ]

卷积表示 (large f = g * mu) (2)

我们现在的任务就是由(1)推出(2)或从(2)推出(1),只要证明这两个式子中某个式子使用另一个式子可以成立就行,注意我不是证它俩等价!!!

推吧(下面的证明即是把(1)当做结论, (2)为衍生式来推导)

[large{ g * mu \ = f*id_0*mu\ =f*(id_0*mu)\ =f*e\ =f } ]

QED! QVQ

3 / 0 欧拉函数与定理、费马小定理证明

3 / 1 函数定义

​ 在数论中,对于正整数N,少于或等于N ([1, N]),且与N互质的正整数(包括1)的个数,记作 φ(n)。

3 / 2 函数性质

​ (1)对于一个质数 p,和一个正整数 k。

[large varphi(p ^ k) = p ^ k - p ^ {k - 1} = (p - 1) * p ^ {k - 1} ]

​ (2)m,n互质

[large varphi(m*n) = varphi(m) * varphi(n) ]

欧拉函数是积性函数。

    (3)对于任意整数 x,都有

     (largevarphi(x)=xprod^n_{i=1}(1-frac{1}{p_i})))

​ (4)对于某一奇数 n,φ(2*n) = φ(n)。

    (5)对于任意两个互质的数 a,n(n>2),都有

[large a^{varphi(n)} ≡ 1 (mod n) ]

​ 此为 欧拉定理

    (6)当n=p 且 a与素数p互质(即:gcd(a,p)=1)则上式有:

[large a^{p-1} ≡ 1 (mod n) ]

​ 为 费马小定理

    (7)

[large varphi(m) = sum_{d|m}mu(d)frac{m}{d} ]

3 / 3 函数性质证明

实在不想打latex

​ (1)在性质(1)中,很明显,k = 1时,φ(pk) = φ(p) = p-1。

    已知小于 (p^k) 的正整数的个数为 (p^k-1)

    其中和 pk 不互质的正整数有 { p×1,p×2,...,p×(p(k-1)-1)},共计p(k-1)-1个,

    所以 φ(pk) = pk - p(k-1) = (p-1)*p(k-1)

    (2)关于性质(2)性质

    对于 m*n,它是 m 和 n 的最小公倍数

    与它不互质的数有

    (1*n , 2*n,3*n.......m*n)

    和

    (1*m,2*m,3*m.....n*m) 共 m+n-1 个,

    所以(φ(m*n) = m*n-(m+n-1) = (m-1)*(n-1) = φ(m)*φ(n))

    (3)对于性质(3)(先说好这东西咋证明我也没有什么好办法

    众所周知,任意一个整数n都可以表示为其质因子的乘积:

    那我们就假设 n = (a[1] ^ k[1]) * (a[2] ^ k[2]) * ......* (a[e] ^ k[e])。

    a[] 为 n 的某一质因数,e 为不同的质因数个数,k[i] 为相应的质因数 a[i] 的对应个数。

    n*(1-1/a[i])是不是就表示 n 中除去公因数为 a[i] 的数的个数?

    那么 n * (1-1/a[1]) * (1-1/a[2]) * (1-1/a[3]) * ... * (1-1/a[e]) 就是 φ(n)呗。

​ 没错,这是口糊感性证明。。。。。

    (4)不用说吧。。。就是 (2)

    (5)(6)见下欧拉定理证明

    

    (7)这是个好东西呢

    前面的莫比乌斯反演公式还记得不?

    若

[large g(m) = sum_{d|m}f(d) ]

    则

[large f(m) = sum_{d|m}mu(d)g(frac{m}{d}) ]

    我现在先给你这么一个式子, 这个式子为啥成立的证明听我口胡

[large (varphi * id_0) ≡ id_1 ]

​ 然后用基本的莫比乌斯反演式, 就可以求出(7)    

​ 于是我们可以用这个式子去求解欧拉函数

[large varphi(m) = sum_{d|m}mu(d)frac{m}{d} ]

   

3 / 4 欧拉定理证明

    (缓一缓。。。。。(¯﹃¯)咱们继续)

[large a^{varphi(n)} = 1 (mod n) ]

    设

[large x_1 , x_2 , x_3 ...... x_{varphi(n)} ]

​ 是 1~n 中与 n 互质的数。1<=i<=φ(n)

[large m_1=a*x_1,m_2=a*x_2 ...... m_{varphi(n)}=a*x_{varphi(n)} ]

  • 对于这其中任意两个不相同的数 (m_s)(m_r) 都不模 n 同余

​ 这里用反证法证明:// s 和 r 都是下标

    若 (m_s ≡ m_r (mod n)),咱们假设(m_s)更大。那么(m_s - m_r = a*(x_s-x_r))

    a与n互质,(x_s-x_r<n),因此 (a*(x_s-x_r)) 一定无法被 n 整除。

​ 即便 (x_s-x_r) 可能不与 n 互质

    也就是说这 φ(n) 个数 %n 都不同余。

    φ(n)个数有φ(n)种余数。(a*x_i) 和 n 互质!

    2)那么这些数的余数和 n 的关系又是什么?

  • 这些数除n的余数都与n互质

    假设其余数和 n 有公因数 r。

    那么 $large a * x_i=p * n + q * r,n = k * r $---> (a * x_i = (p * k + q) * r).

    (a*x_i) 和 n 不互质了!

    那么这(指 m 序列)些数%n,都在(x_1,x_2,x_3……x_{φ(n)})中,因为这(指 x 序列)是1~n中与n互质的所有数,而m余数又小于且互质于n。

    由上得出:

    (large m_1 * m_2 * m_3 … … m_{φ(n)} ≡ x_1 * x_2 * x_3 … … x_{φ(n)} (mod n))

    (large a ^ {φ(n)} * (x_1 * x_2 * x_3 … … x_{φ(n)}) ≡ x_1 * x_2 * x_3 … … x{φ(n)} (mod n))

​ 化简

(large a ^ {φ(n)} ≡ 1 (mod n))

    (QED!)

3 / 5 费马小定理证明

    (large a ^ {p - 1} ≡ 1 (mod n))

    (large a ^ {φ(p)} ≡ 1 (mod n))

    得证。┐(´∇`)┌

4 / 0 欧拉降幂证明

   让你求这么一个式子

   $a^b mod p $ (不要求a, c 互质)

   当然没那么简单,

   a = 56895, b = 10000000052

   求吧(带着和善的笑容)

   很明显, 问题不在 a 而在 b

   数太大了,我们需要想办法让 b 变得短小(精悍)

   这时候我们要用一个叫做 欧拉降幂 的东东

   欧拉降幂是个啥?

   直接上式子

[large a^b = egin{cases} a^{b mod varphi(p)} & ext{gcd(a,p) = 1}\ a^b & ext{gcd(a,p) != 1, b < $varphi(p)$}\ a^{b mod varphi(p) + varphi(p)} & ext{gcd(a,p) != 1, b >= $varphi(p)$} end{cases} ]

   证明

4 / 1(a^b = a^{b mod varphi(p)} (mod p)),(gcd(a,p) = 1)

[large { egin{aligned} &a^{b - b mod φ(p)} * a^{b mod φ(p)} = a^{b mod φ(p)} (mod p)\ \ &b - b mod φ(p) = k * φ(p)\ \ &a^{b - b mod φ(p)} = a^{k * φ(p)} = (a^{φ(p)})^k = 1 (mod p)\ \ &so:\ \ &a^b = a^{b - b mod φ(p)} * a^{b mod φ(p)} = a^{b mod φ(p)} (mod p) end{aligned} } ]

4 / 2...... Need I zheng it? ARE YOU SURE ?

4 / 3 (a^b = a^{b mod varphi(p) + varphi(p)} (mod p) gcd(a,p) != 1,b >= varphi(p))

​ 上述即是普遍情况,a,p 不互质

​ 从特殊情况(gcd(a,p) = a)对其进行上述式证明

​ 令 (p = s * x^r,gcd(s,x) = 1)

​ 因而

[large{ egin{aligned} &x^{varphi(s)} = 1 (mod s)\ \ &x^{varphi(s) * varphi(x^r)} = 1 (mod s)\ \ &x^{varphi(p)} = 1 (mod s)\ \ &x^{varphi(p)} = k*s+1\ \ &同乘x^r\ \ &x^{varphi(p)+r} = k*s*x^r+x^r\ \ &x^{r + varphi(p)} = x^r (mod p)\ \ &又有x^{varphi(p)} = 1 (mod p)\ \ &故x^{varphi(p) * k} = 1 (mod p),k >= 0\ \ &x^{r + varphi(p)*k} = x^r (mod p)\ \ &(一长溜式子过于恶心,这里和谐一下)\ \ &x^b ≡ x^{b-r+r} = x^{b-r+varphi(p)+r} = x^{b+varphi(p)} (mod p) b≥r,b-r≥0\ \ &故\ \ &x^b = x^{b + varphi(p)} (mod p)\ \ &x^b = x^{b mod varphi(p) + varphi(p)} (mod p)\ \ &(x^{b mod varphi(p) + varphi(p)} = x^{b mod varphi(p) + k*varphi(p)} = x^b (mod p)) end{aligned} } ]

​ 得出(large x^b = x^{x mod varphi(p) + varphi(p)} (mod p))

​ 对质数的幂同样适用

[large{ egin{aligned} &(x^k)^b = x^{k*b} \ \ &= x^{varphi(p) + k*b} \ \ &= x^{k*varphi(p) + k*b} \ \ &= (x^k)^{varphi(p)+b} \ \ &= (x^k)^{b mod varphi(p)+varphi(p)} (mod p)\ \ &b >=varphi(p),k>0 end{aligned} } ]

​ 将 a 分解

[large a = prod_{i}^nx_i^{k_i} ]

​ 每个 x 都可满足上面的公式, 乘起来就是

[large a^b = a^{b mod varphi(p) +varphi(p)} (mod p) ]

QED

5 / 0 结语(甩个水题)

(luogu P5091)

题目背景

​ 出题人也想写有趣的题面,可惜并没有能力。

题目描述

​ 给你三个正整数,a,m,b你需要求:(a^b mod m)

输入格式

​ 一行三个整数,a,m,b

输出格式

​ 一个整数表示答案

数据范围

(1≤a≤10^9)(1≤b≤10^{20000000})(1≤m≤10^8)

#include <bits/stdc++.h>

#define ll long long 
#define _ 0

using namespace std;

ll a, m, b;
bool flg;

inline ll read (int p) {
	ll x = 0;
	char ch = getchar();
	while (! isdigit (ch)) ch = getchar ();
	while (isdigit (ch)) {
		x = (x << 1) + (x << 3) + (ch ^ '0');
		if (x >= p) flg = 1; // 记录是否为第三种情况
		x %= p;
		ch = getchar ();
	}
	return x + (flg ? p : 0);
} // 这里的快读虽然并不能提速,但可以实现 b 的 mod

inline ll fast_pow (ll a, ll b, ll p) { // 快速幂(当然不用也行, 就是慢一点)5.12s
	ll base = a, ans = 1;
	while (b) {
		if (b & 1) ans = ans * base % p;
		b >>= 1;
		base = base * base % p;
	}
	return ans % p;
}

inline ll phi (int p) {
	int a, b;
	a = b = p;
	for (int i = 2; i * i <= a; ++i) { // 根号就够了 需要口胡吗
		if (a % i == 0) {
			b -= b / i; // 等价于 b = b * (1 - 1 / i), 精度问题 
			while (a % i == 0) {
				a /= i; // 把这几个质因子全去掉。。。 
			}
		}
	}
	if (a > 1) { // 应对素数情况 , 同时将最后一个没有因数用掉 
		b = b - b / a;
	}
	return b;
} // 不行你就死记硬背,反正也不长(((

signed main () {
	scanf ("%lld%lld", &a, &m);
	b = read (phi (m));
/*
    int k = a;
	for (int i = 2; i <= b; i++) {
		a *= k;
		a %= m;
	}
	printf ("%lld", a); // 这么打也能过,就是慢一点,5.12s
*/
	printf ("%lld", fast_pow (a, b, m)); // 1.01s
    return ~~(0^_^0);
}
原文地址:https://www.cnblogs.com/codingxu/p/15002680.html