「证明」原根和离散对数相关性质及证明
先定义阶的概念:如果$gcd(a,p)==1$,那么对于方程$a^r \equiv 1 (mod\ p)$来说,首先根据欧拉定理$ a^{\phi(p)}\equiv 1 (mod\ p) $,解一定存在所以$ r\leq \phi(p) $,最小的$r$称为$a$关于$p$的阶,记作$ ord_p(a) $
定义原根概念:一个模$ p $意义下的$ 0->p-1 $次幂各不相同,取遍$ [0,p-1] $,也就是说$ ord_p(g)=\phi(p) $。
先说一下什么样的数具有原根。
结论是:对于奇质数$ p $,有原根的数是:$ 2,4,p^e,2p^e $证明比较麻烦,$Niven$和$Zuckerman$证明,略去过程。
因为最小原根一般都比较小,所以可以直接枚举出来,而这种方法有时候就显得过于慢。
怎么更快。
有一个结论可以用:对于一个有原根的数$p$,如果$g$的$\phi(p)$的所有因子次方在$mod\ p$条件下均不为1,那么$g$是$p$的原根。
证明:首先结论可以转化为,如果对于任意的$b|\phi(p)$,均不满足$ g^b \equiv 1 (mod\ p)$那么,对于任意的$1\leq b\leq\phi(p)-1$ ($b$不满足$b|\phi(p)$),均不满足$g^b \equiv 1 (mod\ p)$。
反证:
假设存在一个$b$,($b$不满足$b|\phi(p)$),满足$g^b \equiv 1 (mod\ p)$,设其中小的为$c$,那么$g^c\equiv 1 (mod\ p)$成立。
令$d=\phi(p)-c,d>=c$
根据欧拉定理。
$ g^d \equiv g^{\phi(p)-c} \equiv g^{-c} \equiv 1 (mod\ p) $
引理:$c|d$不成立。
反证:假设成立。
令$d=kc$
那么:$\phi(p)=d+c=(k+1)c$
不满足$c|\phi(p)$。
所以假设不成立。
引理$c|d$不成立得证。
那么$gcd(c,d)\leq c$
因为:
$g^c \equiv 1 (mod\ p)$
$g^d \equiv 1 (mod\ p)$
那么:
$g^{c-d} \equiv 1 (mod\ p)$
模拟更相损益术重复相减得到最终的$gcd$的过程,发现最终结果是:
$ g^{gcd(d,c-d)} \equiv g^{gcd(c,d)} \equiv 1 (mod\ p) $;
因为$gcd(c,d)<c$与假设的$c$是最小的$b$不成立。
所以假设不成立。
证毕。
所以用这种方式可以较快的验证原根。
int primert(int p,int phi) { int d=0; for(int i=2;1LL*i*i<=phi;i++) if(phi%i==0) dp[++d]=i,dp[++d]=phi/i; for(int i=2;;i++) { int j; for(j=1;j<=d;j++) if(qw(i,dp[j],p)==1) break; if(j==d+1) return i; } return 0; }
关于离散对数,也称作指标。
定义概念:如果$g$是$p$的一个原根,那么对于方程$g^x \equiv a(mod p)$的解$x$,称$x$为对模$p$到基$g$上的$a$的一个离散对数或指标。记作$ind_{p,g}(a)$
离散对数定理:当且仅当$x \equiv y (mod\ \phi(p))$成立时,$ g^x \equiv g^y (mod\ \phi(p)) $成立。
(当且仅当和充分必要是等价表述)
先证必要性:因为$g$的各个次幂在$mod\ p$条件下各不相同,而以$\phi(p)$为循环节,那么也就是说在每个长度为$\phi(p)$的循环节中都存在某一个值和之前的循环节中的某个值相同,如果$x$和$y$在$mod\ phi(p)$条件下不同余,他们就不可能的到相同的同余于$p$的g的次方的答案。
再证充分性:
假设$x \equiv y(mod \phi(p))$成立。
那么:
$ g^x \equiv g^{y+k \phi(p)} $ $(mod\ p) $
$ \equiv g^y (g^{\phi(p)})$ $(mod\ p)$
$ \equiv g^y 1^k $ $(mod\ p)$
$ \equiv g^y $ $(mod\ p)$
导出结论,证明充分。
这是离散对数定理。
写一下推论。
$x^A \equiv B (mod\ p) \Leftrightarrow Aind_{p,g}(x) \equiv ind{p,g}(B) (mod\ p)$
于是我们成功的把高次同余方程等价转化为了线性同余方程,而离散对数可以用$BSGS$算法求得。