原根与指标
阶
对于互质的数字a,n,满足
的最小正整数,
x称为a模n的阶
原根
如果r模n的阶刚好是
,则我们称r是n的原根
我们计算原根的幂次模n,在一个循环节内,我们就能得到n的简化剩余系
原根求法
P为质数,如果g是P的原根,那么
,
当且仅当指数为
的时候成立
根据欧拉定理推论,
的最小正整数解为
的约数,
因此我们只要枚举
的约数并做检测即可
int getG(int n) {
int i, j, t = 0;
for (i = 2; (LL)i * i < n - 1; i++)
if ((n - 1) % i == 0)
q[t++] = i, q[t++] = (n - 1) / i;
for (i = 2;; i++) {
for (j = 0; j < t; j++)
if (quickpow(i, q[j], n) == 1) break;
if (j == t) return i;
}
}
指标
对于式子
我们称 a 是 b 模 P 的指标,即为
例题
给定整数 a,b,p,其中a,p互质,求一个非负整数 x,使得
用 BSGS 求出指标,通过 exgcd 求解方程,用快速幂还原原数即可
注意 BSGS 的步长要根据询问数量来设置 BSGS 的步长 = 询问 * 模数/(步长),即