原根与指标
(所有^为次方)
阶:
设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的原根
原根的存在定理:
- 若p为奇素数,则原根存在
- 若p为奇素数,g为模p的一个原根,则g或g+p是模 p^2的原根,则g是模p^a的原根
- 模m有原根的必要条件是m=2, 4, p^a 或 2*p^a 其中p为奇素数,a >=1
- 若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(qpow(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 | g
与(g,m)=1 矛盾
因此可以用数学归纳法,发现(g,m)=1 ,则 (g^x, m) =1
在知道原根的情况下,求指标可以使用BSGS,利用hashtable, O(sqrt(phi(m)))求出
gp_hash_table<int,int>mp; int BSGS(int a,int b,int p){//原根,求指标值,模数 mp.clear(); int phi=getphi(p),m=ceil(sqrt(phi)); int tmp=1; for(int i=1;i<=m;i++){ tmp=(LL)tmp*a%p; if(tmp==b)return i; mp[tmp]=i; } int now=1; for(int i=m;i<=phi;i+=m){ now=(LL)now*tmp%p; if(now==b)return i; } int inv=1; tmp=qpow(tmp,phi-1,p); for(int i=m;i<=phi;i+=m){ inv=(LL)inv*tmp%p; int need=(LL)inv*b%p; if(mp[need])return mp[need]+i; } return -1; }
指标又叫离散对数
因为它由类似对数的性质
解一类 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)