時隔兩三個月重新打$ntt$的時候,已經忘記了常見模數的原根。
想要回憶原根的求法,以備不時之需,然而也忘記了。
所以頹了大神$yxs$的證明博客,為了防止再次遺忘,來復讀一遍大神的做法和證明。
做法:
因為原根往往很小,所以可以采用暴力枚舉的方法。
然而直接暴力$check$的復雜度並不是合法的。
一個可行的$check$方法:
對$\varphi(p)$質因數分解,得到$y_i=\frac{\varphi(p)}{p_i}$
設當前$check$的數為$x$
對每個$y_i$,快速冪求出$x^{y_i}$,若均不為$1$,那么$x$為$p$的一個原根。
證明:
若$x^i \equiv 1$ $(mod\ p)$,有$x^{i*k} \equiv 1$ $(mod\ p)$。
若存在$x^k \equiv 1$ $(mod\ p)$ $(0<k<\varphi(p))$,$x$一定不為原根,所以該做法具有必要性。
下面通過反證證明充分性。
設存在$x^k \equiv 1$ $(mod\ p)$ 其中$k$不被任意$y_i$整除。
一定存在一組$u,v$滿足$u*k+v*\varphi(p)=gcd(k,\varphi(p))$。
有$u*k=gcd(k,\varphi(p))-v*\varphi(p)$。
因為$x^{u*k} \equiv 1$ $(mod\ p)$,
有$x^{gcd(k,\varphi(p))-v*\varphi(p)} \equiv 1$ $(mod\ p)$。
因為$x^{v*\varphi(p)} \equiv 1$ $(mod\ p)$,
有$x^{gcd(k,\varphi(p))} \equiv 1$ $(mod\ p)$,
顯然存在$y_i$為$gcd(k,\varphi(p))$的倍數,所以不存在這樣的$k$。