zoukankan      html  css  js  c++  java
  • 费马小定理,欧拉函数

    在证明这些定理之前先证明一个有意思的定理。

                对于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:

    一个是基础实现 一个是筛法。

  • 相关阅读:
    更改Delphi系统的默认字体
    Delphi TThread中文注释
    Delphi中的线程类 TThread详解
    TreeView使用笔记
    用未公开函数实现Shell操作监视
    Delphi面向对象编程的20条规则
    Delphi操作Excel命令
    delphi 创建一个纯文本文件
    判断滚动条到底部、
    数据库性能优化之SQL语句优化1
  • 原文地址:https://www.cnblogs.com/Milkor/p/4393489.html
Copyright © 2011-2022 走看看