1.<a>为a反复相乘生成算法导论-----数论-----元素的幂的子群,算法导论-----数论-----元素的幂(a)为a在算法导论-----数论-----元素的幂中的阶,phi为算法导论-----数论-----元素的幂规模

2.欧拉定理:对n>1,算法导论-----数论-----元素的幂=1(modn),对所有a属于算法导论-----数论-----元素的幂成立

3.费马定理:p素数,,算法导论-----数论-----元素的幂=1(modp) 对所有a属于算法导论-----数论-----元素的幂成立

4.原根:算法导论-----数论-----元素的幂(g)=|算法导论-----数论-----元素的幂|,对模n,算法导论-----数论-----元素的幂每个元素都是g的幂,g是算法导论-----数论-----元素的幂的原根或生成元

算法导论-----数论-----元素的幂包含一个原根,则算法导论-----数论-----元素的幂循环群

5.对所有素数p>2和正整数e,满足算法导论-----数论-----元素的幂循环群n的值为2,4,算法导论-----数论-----元素的幂

6.离散对数:g是算法导论-----数论-----元素的幂中的原根,a是算法导论-----数论-----元素的幂中任一元素,存在z使,算法导论-----数论-----元素的幂=a(modn),z称为离散对数,即算法导论-----数论-----元素的幂

7.离散对数定理:g是算法导论-----数论-----元素的幂原根,则算法导论-----数论-----元素的幂=算法导论-----数论-----元素的幂(modn)成立,当且仅当x=y(modφ(n))成立

8.p 是奇素数且e>=1,则方程算法导论-----数论-----元素的幂仅有两个解,x=1和x=-1

证明:
因为算法导论-----数论-----元素的幂,所以必有原根,设n=算法导论-----数论-----元素的幂

        算法导论-----数论-----元素的幂,算法导论-----数论-----元素的幂=算法导论-----数论-----元素的幂(modn),算法导论-----数论-----元素的幂)=算法导论-----数论-----元素的幂=0(modφ(n))

φ(n)=(p-1)算法导论-----数论-----元素的幂,gcd(2,算法导论-----数论-----元素的幂)=2,d=2,且0|2,有两个解,1,-1.

9.平凡平方根:1,-1

10.模n存在1的非平凡平方根,n是合数

11.反复平方法求数的幂(c无用),所需位操作次数O(算法导论-----数论-----元素的幂) β为位数

  注:下面代码多乘一个a的原因:

  举例:a^10=a^5*a^5

     a^5=a^2*a^2*a

MODULAR-EXPONENTIATION(a,b,n)

{

        c =0;

        d =1;

        let<bk,bk-1,…,b0>be the binary represention of b;

        for(i from k down to 0 )

            c=2c;

            d=(d*d)modn;

            if(bi==1)

                c=c+1;

                d=(d*a)modn;

        return d;

}

c语言的两种写法

1.递归

__int64 exp_mod(__int64 a, __int64 n, __int64 b)

{

    __int64 t;

    if(n==0) return 1%b;

    if(n==1) return a%b;

    t=exp_mod(a,n/2,b);

    t=t*t%b;

    if((n&1)==1) t=t*a%b;

    return t;

}

2.递推

__int64 modexp(__int64 a,__int64 b,__int64 n)     

{     

    __int64 ret=1;     

    __int64 tmp=a;     

    while(b)     

    {     

       //基数存在     

       if(b&0x1) ret=ret*tmp%n;     

       tmp=tmp*tmp%n;     

       b>>=1;     

    }     

    return ret;     

}

 

相关文章: