zoukankan      html  css  js  c++  java
  • 欧拉定理及其应用

    Euler定理:对于正整数a,p,若(a,p)=1,有aφ(p)mod p=1,其中欧拉函数φ(p)=p(1-1/p_1) (1-1/p_2)......(1-1/p_k),p_1,p_2,....,p_k是p的所有的素数因子.
    当p是一个素数时,它的特例如下:
    Fermat 小定理:如果p是素数,(a,p)=1,则a(p-1) mod p=1.(这是因为φ(p)=p-1)
    它 的应用:
    1.求a^n mod(p),其中n是一个较大的数,而p是一个素数
    这时就可以用费马小定理了,将a^n拆为a^(p- 1)*a^(p-1)*......*a^(n%(p-1)).这时原式就等于a^(n%(p-1)) mod(p),这样就可以大大减小运算次数,如果p还是很大,可以用反复平方的方法,复杂度在O(log(n%(p-1)))的级别.

    2.给定一个正整数n,求一个最小的整数x,使得2^x mod n=1。

    当n是偶数时无解。

    当n是奇数时,(2,n)=1,根据Euler定理,2^phi(n)mod n=1,但phi(n)未必就是答案,因为有可能存在一个更小的解,但我们可以确信最小解x一定是phi(n)的因子,如果不是phi(n)的因子,则设n mod x=r(0<r<x),由于2^phi(n)=2^x=1,则2^r=1,这与x是最小的解矛盾,所以命题得证,既然缩小了解的范围,下面就好办了,解法如下:

    (1)求解x=phi(n);

    (2)找出phi(n)的所有的素因子p_i(1<=i<=nr);

    (3)for i=1……nr

                 让x=x/p_i

                           直到2^x mod n!=1 或 p_i不能整除x

                  if 2^x mod n!=1

                            x=x*p_i

    (4)x就是所求解

  • 相关阅读:
    C语言预处理
    C语言结构体对齐
    C语言共用体、大小端、枚举
    C语言内存分配方法。
    C与指针(结构体指针,函数指针,数组指针,指针数组)定义与使用
    C语言中函数的传入值与传出值
    #define与typedef在重定义类型中的区别
    宏定义在位运算中的运用
    wait函数
    exit()与_exit()区别
  • 原文地址:https://www.cnblogs.com/Open_Source/p/1904950.html
Copyright © 2011-2022 走看看