原根与指标

Posted bibibi

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了原根与指标相关的知识,希望对你有一定的参考价值。

(所有^为次方)

 

阶:

设a,m∈Z, m>1, (a,m) =1 则使

 a^r = 1 (mod m)

成立的最小正整数r,成为a对模m的阶,记为ord m (a)

如:ord m (1)=1 , ord 2(-1)=1 , ord m(-1)=1 (m>2) , ord 17(3)=16

注意:

       如果(a,m)>1, 则此时ord m(a)=0,

所以在谈到a对模m的阶是,总假定m>1, (a,m)=1

证明:反证—设 a^x =1 (mod m)   (a,m)>1 , x>=1

则a^x = k*m +1 -> a^x + k*m =1

-> a * (a^(x-1)) + k*m =1 则 a*y + k*m =1 有解

但从exgcd得知,不满足 (a,m) |1,所以方程无解

所以不存在a^x = 1 (mod m)   (a,m)>1, x>1

 

阶的基本性质:

1. a^n=1 (mod m)的充要条件是 ord m(a) | n

分析:设n= ord m(a)*q +r , 0<=r<ord m(a)

则 a^n = a^( ord m(a)*q +r ) = a^r =1 (mod m)

因为ord m(a)最小,所以r=0

推论:ord m(a) | phi(m)

若ord m(a) = phi(m) 称 a为模m的原根

 

2. 若a=b (mod m) , (a,m) =1 , 则ord m(a) =ord m(b)

分析:a^ord(a) = b^ord(b) = a^ord(b) = b^ord(a) = 1 (mod m)
所以ord m(a) | ord m(b) , ord m(b) | ord m(a) 则 ord m(a) =ord m(b)

 

3. 若a^n = a^l (mod m ), (a,m) =1  <=>   n=l ( mod ord m(a) )

分析:不妨设n<=l ,则a^(l-n) =1 (mod m ),则ord m(a) | l-n,反之一样

 

4. 记n=ord m(a), 则a^0,a^1,a^2…a^(n-1)对模m两两不同余

分析:反证—若有0<=i<j <=n-1 ,使得a^i = a^j (mod m),

则由(a,m)=1 的 a^(j-1) = 1 (mod m), 与 j-I < n = ord m(a)矛盾

 

5. (a^-1)*a = 1 (mod m ) ,则 ord m(a) = ord m(a^-1)

分析:( (a^-1)*a )^n = 1 (mod m) 则

(a^-1) ^n =1 (mod m)  <=>  a^n = 1(mod m)

 

6. 记 n= ord m(a) ,i>0 , ord m(a^i)=s, 则s= n/( i ,m)

分析:(a^i)^s =1 (mod m)   <=>  n=ord m(a) | i*s

<=>  n/(i,n) | i/(i,n) *s  <=>  n/(i,n) | s   则最小的s=n/(i,n)

所以当( i,n )=1时,幂后阶不变,此时i的个数为phi (n)

所以有phi(n) 个a^i 的阶为n=ord m(a)

所以,如果有原根,则原根个数为phi( phi(m) )

(a,b)表示gcd(a,b)

 

7. 若n | m , 则ord n(a) | ord m(a)

分析:a^ ord m(a) = 1 (mod m) -> a^ord m(a) =1 (mod n)

 

8. 若(m,n) =1 , (a, mn) =1 ,则 ord mn(a) =[ord m(a), ord n(a)]  [a,b]表示lcm(a,b)

分析:设s= [ord m(a), ord n(a)], t= ord mn(a)

由7 得 ord n(a) | t,ord m(a) | t  ->  s | t

a^s = 1 (mod m) , a^s = 1(mod n)  -> a^s = 1 ( mod mn)  -> t|s

 

最后这条可以推广到更多情况

a^s= g (mod m),  a^s= g (mod n) ,  (m,n) =1 

-> a^s = k1*m +g , a^s = k2*n +g

-> k1*m = k2*n

由(m,n)=1 得 n| k1 , m| k2 

->  m*n | k1*m 

->  a^s = g (mod m*n)

 

9. (ab,m) =1 , (ord m(a) , ord m(b) )=1 则 ord m(ab)= ord m(a)*ord m(b)

分析: a^( ord m(b)* ord m(a) ) = a^( ord m(b)* ord m(ab) ) b^( ord m(b) * ord m(ab) )

= (ab)^( ord m(b)* ord m(ab) ) =1 (mod m)

-> ord m(a) | ord m(b)* ord m(ab)

同理得ord m(b) | ord m(a)* ord m(ab)

所以,ord m(a)* ord m(b) | ord m(ab)

另外 (ab) ^(ord m(b)* ord m(b) ) = a^(ord m(b)* ord m(b) ) b^(ord m(b)* ord m(b) ) =1 (mod m)

所以 ord m(ab) | ord m(a)* ord m(b)

 

原根:

若a对模m的阶(即 ord m(a) )为phi(m) ,则称a为模m的原根

原根的存在定理:

  1. 若p为奇素数,则原根存在
  2. 若p为奇素数,g为模p的一个原根,则g或g+p是模 p^2的原根,则g是模p^a的原根
  3. 模m有原根的必要条件是m=2, 4, p^a 或 2*p^a 其中p为奇素数,a >=1
  4. 若m存在原根,则有phi( phi(m) )个原根(阶的性质6)

 

原根的计算技巧:

设 x存在原根, phi(x) = ∏ pi^ei , pi为素数, 若对(a,x) =1 满足

对于所有pi,a^( phi(x) /pi ) ≠ 1 (mod x)

则a为模x的原根

证明:设ord x(a) =n , 则n | phi(x)

若n<phi(x) 则存在某个素数pi | ( phi(x)/n )

即:phi(x) /n = pi * u  ->  phi(x) / pi = n * u

即:a^( phi(x)/pi ) = a^(n*u) = 1 (mod x)

所以若条件成立则n=phi(x)

 

int pri[mxn],cnt=0;
int GetG(int p){//求原根
    int tmp=getphi(p);
    int m=sqrt(tmp+0.5);
    cnt=0;
    for(int i=2;i<=m;i++)
        if(tmp%i==0){
            while(tmp%i==0)tmp/=i;
            pri[++cnt]=i;
        }
    if(tmp>1)pri[++cnt]=tmp;
    for(int g=2;g<p;g++){
        bool is=1;
        for(int i=1;i<=cnt;i++)
            if(ksm(g,(p-1)/pri[i],p)==1){is=0;break;}
        if(is)return g;
    }
    return 0;
}

 

 

指标:

设对于m>1, g是模m的一个原根,(a,m) =1, 则存在唯一整数0<r <=phi(m)使

g^r =  a (mod m)  

则r 叫做以g为底对模m的一个指标,记为 r=ind g(a)

 

(a,m)>1 则不存在

证明:首先(g, m)=1 (前面阶的注意已经证明)

先假设x=2使g^x = y (mod m)  ,(y,m) >1

则g^2 – k*m =y (mod m) , (y,m) >1

即 a*g + k*m = y (mod m) ,(y,m)>1 存在解 ( g, k )

由exgcd可知最后a要乘上 y/(g,m)即y,即y | a即y | m

与(g,m)=1 矛盾

因此可以用数学归纳法,发现(g,m)=1 ,则 (g^x, m) =1

在知道原根的情况下,求指标可以使用BSGS,利用hashtable或map,  O(sqrt(phi(m)) log)求出

 

map<int,int>mp;
int BSGS(int a,int b,int p){//原根,求指标值,模数
    mp.clear();
    int m=sqrt(p),i,j;
    int tmp=1;
    for(i=1;i<=m;i++){
        tmp=(LL)tmp*a%p;
        if(tmp==b)return i;
        if(!mp[tmp])mp[tmp]=i;
    }
    mp[1]=0;
    int res=1,phi=getphi(p);
    for(i=0;i<=p;i+=m){
        LL inv=ksm(res,phi-1,p);
        inv=inv*b%p;
        if(mp[inv])return mp[inv]+i;
        res=(LL)res*tmp%p;
    }
    return 0;
}

 

 

指标又叫离散对数

因为它由类似对数的性质

解一类 x^a= b (mod c)的方程 (x为未知数) (c存在原根)( (b,c)=1 )

求出模c的一个原根rt

则每个x都可表示为rt^g 则原方程可变为 rt^(ag) = b (mod c)

用BSGS求出b的指标t1 即 rt^t1=b (mod c)

设t2=phi(c) ,则有 rt^( t1+t2*y ) =b  (mod c) (y>=0)   ( rt^t2=1(mod c) 且 rt^x以t2为周期 )

其中( t1+t2*y )%a=0 ,则有 ag + t2y = t1  ①

用exgcd求解g和y,由于g的增幅为t2/(t2,a) , 所以在[1,c]的解个数为(t2,a)个

看①式,可变化为 a*ind rt(x) = ind rt(b) (mod phi(c) )

就跟对数两边取个log变成a*logx= log b一样

要注意,模数变了,变成了phi(c)


以上是关于原根与指标的主要内容,如果未能解决你的问题,请参考以下文章

bzoj-2219 数论之神

初等数论 ——原根指标及其应用

转载学习总结:初等数论——原根指标及其应用

Diffie-Hellman协议

bzoj2219-数论之神求解x^a==b(%n)-crt推论-原根-指标-BSGS

根与 slug rails 4 路由