Problem
給定一個模數 $m$,找到其 primitive root $g$。
primitive root $g$ 滿足
$$g^{\phi(m)} \equiv 1 \mod m \\ g^{\gamma} \not\equiv 1 \mod m \text{ , for } 1 \le \gamma < \phi(m)$$意即在模 $m$ 下,循環節 $ord_m(g) = \phi(m)$,若 $m$ 是質數,則 $\phi(m) = m-1$,也就是說循環節長度是 $m-1$,更可怕的是組成一個 $[1, m-1]$ 的數字排列。
現在假定 $m$ 是質數,請求出一個最小的 primitive root $g$。
Sample Input
|
|
Sample Output
|
|
Solution
primitive root 在密碼學中,用在 Diffie-Hellman 的選定中的穩定度,倘若基底是一個 primitive root 將會提升破解的難度,因為對應情況大幅增加 (值域比較廣,因為不循環)。
由於歐拉定理,可以得知 $a^{\phi(p)} \equiv 1 \mod p$,那麼可以堆導得到若 $a^x \equiv 1 \mod p$,則滿足 $x | \phi(p)$,否則與歐拉矛盾,藉此可以作為一個篩選的檢查手法,對於所有 $phi(p)$ 的因數都進行檢查,最後我們可以得到 一般檢測 的作法。
為了加速驗證,由於 $x | \phi(p)$,若最小的 $x$ 存在 $a^x \equiv 1 \mod p$,那麼 $kx$ 也會符合等式,因此只需要檢查 $x = (p-1)/\text{prime-factor}$ 的情況,如此一來速度就快上非常多。最後得到 加速版本 ,此做法由 liouzhou_101 提供想法。
一般檢測
|
|
加速版本
|
|