费马小定理,欧拉函数
在证明这些定理之前先证明一个有意思的定理。
对于0 mod m,n mod m , 2n mod m, 3n mod m, 4n mod m... (m-1)n mod m
对应解集序列 一定有 m/d份 0 d 2d 3d..m-d. (不一定按照顺序) 这样的解。 其中d = gcd(n,m)
具体点:n=8,m=12. d = gcd(n,m)=4
对于 0 mod 12,8 mod 12,16 mod 12,24 mod 12,32 mod 12,40 mod 12...88 mod 12.
对应解 0 8 4 0 8 4 ..... 4
可见结论应该是对的。
证明:
Kunth的证明很简略,当时我没看懂。虽然是一些简单的同余运算。
以下是我的见解:
证明:(0~m-1)n mod m 的解集是m/d个0 d 2d 3d ...m-d循环。
称(0~m-1) 为 k,m/d个0 d 2d 3d ...m-d循环为D
1:证明解集D是可行且唯一的。
另外k=(0~m-1),D = m/d个0 d 2d 3d ...m-d循环 (重申)
即证明 kn mod m 的解集是 m/d个0 d 2d 3d ...m-d循环 。
即证明kn ≡ D (mod m) (看不懂这个可以去看一下我写的同余定理以及基本的数论知识,欧几里得,扩展欧几里得,中国剩余那里。)
即要证明kn = m'm+D (其实直接从上一步就可以得到下面那一步) 有解k
kn - m'm = D也就是证明这个式子有解.
这种式子何时有解?参见扩展欧几里得中的证明过程中的裴蜀定理(不得不说欧几里得真心有用,以及裴蜀定理)
即D为gcd(n,m)的正整数倍的时候,且唯一也就是符合D的定义了。我这里就不赘述了。
附上链接关于这个式子的求解以及性质:
再从另外一个角度:
既然D构成了循环。我们建立映射关系。可以认为有多个k对应着d.如果你深熟裴蜀定理。你这个时候大概就能知道前因后果了。其实我们要证明的东西就是裴蜀定理。只是一个换了个说法而已。
2:证明:当 k.对应解为x(当然了,x为d的正整数倍 )时k'-k = m 时k'对应解也为x.就是证明符合上述的循环
k'n mod m = (m+k)n mod m = ((mn mod m)+(kn mod m)) mod m = (0 + kn mod m) mod m = kn mod m = x
所以你会发现循环的造成原因是因为k'为k+zm (z为整) k为原解 (这个原解的说法有点模糊。可以认为就是构成第一个循环解对应的k好了)
其实这是扩展欧几里得(大家都爱全部都归为这个)的一种应用吧。
完整地描述一下:n'n+m'm = d
当方程有正整数解n'和m' 的时候 d 符合 k*gcd(n,m) (k为正整数,0在此处就不探讨了),且对应解n' m' 有多组。 其中n'的解集 可以是 n'+qm (q为整数)
费马小定理:
n^p-1 ≡ 1 (mod p) -> n^p-1 mod p = 1. 其中n和p互素。
证明:
我们可以构造 p-1个 n mod p,2n mod p,3n mod p ...(p-1)n mod p
根据同余运算(把余数转成同余式子):
那么就有 (p-1)! n^(p-1) ≡ (p-1)! (mod p)
其中 (p-1)!不能整除p 所以式子变成 n^(p-1) ≡ (mod p),得证。
又可以在两边均乘n. n^p ≡ n (mod p)
这里有一个思维小插曲:
考虑下面这个证明:
由于n和p互素.所以有n ≡ 1(mod p).根据同余定理 n^(p-1) ≡ 1^(p-1) (mod p) -> n^(p-1) ≡ (mod p),得证。
简单明了。可这是错的。因为前提就错了。由于n和p互素.不一定有n ≡ 1(mod p)
只能说 由于n和p互素,存在kn ≡ 1(mod p) (k|1,2,3..p-1) (根据上述定理)
举例 n=2 p=5 .有3n mod p = 1.而 n mod p = 2.
欧拉函数:
作用:输入n,你想知道1~n中有多少个数和n是互素的吗?
这就是欧拉函数的一个作用。而且还能让扩展费马小定理。算质因子之和
欧拉函数记为φ函数也就是说φ(1) = 1,φ(2)=1,φ(3)=2...
对于φ(n).
如果n为素数,即φ(n) = n-1.
如果n为合数,即φ(n) < n-1.
显然这对于应用还是不够的。我们当然想要能够输入n就可能获得具体结果,而不单只是范围.
对于这个问题:我们可以接下来的证明中解决该问题并且发现新的东西。
如果说m是一个素数幂p^k (比如2^3).φ(p^k)还是可以计算的。
对于0~p^k -1中有多少个和p^k互素呢?
那我们可以先找什么数中没有p因子.
那么可以找有p因子的数。然后总个数减去和p^k非互素的数。
在0~p^k -1 中有 p的倍数有 (0 p 2p 3p 4p ...p^k-p) 最后一位这个你可以列一下不等式算算,发现是<p^k的。那就是p^k-p了。
那么易得 p 的倍数的个数有 p^(k-1)个
那么 φ(p^k) = p^k - p^(k-1) = p^(k-1)*(p-1)。 所以我们就解决了。当这个数是素数幂的时候。欧拉函数的计算。
那么如何扩展到任何正整数呢?
根据算术基本定理。m = p1^(mp1)* p2^(mp2)....&pn^(mpn)。不懂的话可以去查一下 算术基本定理
那么如何利用这个呢?我们可以想到把一个数拆成各个素数幂相乘。而这经过欧拉函数会有什么关系呢?就好比一个函数我们知道自变量是相乘的。
并且知道各个自变量的函数值。我们要求这个乘积的对应函数值该如何?
即φ(a) = a1,φ(b) = b1,那么φ(a*b) = ?
证明 φ(a*b) = a1*b1 也就是证明欧拉函数是积性函数。这个证明网上有很多。具体做法就是引入剩余系。利用分量来证明即可。不赘述了。
而当欧拉函数是积性的时候。我们可以推导出以下的关系式:
(待上图)。
这里附上实现欧拉函数的code:
一个是基础实现 一个是筛法。