求解 $ax+by = \gcd(a,b)$。
1
2
3
4void exgcd(int &x,int &y,int a,int b){
if(!b) return x=1,y=0,void();
exgcd(y,x,b,a%b),y-=a/b*x;
}1
2
3
4
5
6int a1,b1;
void sol(int a2,int b2){
int x,y,d=__gcd(a1,a2),na; exgcd(a1,a2,x,y);
x=(x*(b2-b1)/d%a2+a2)%a2;
na=a1/d*a2,b1=((x*a1%na+b1)%na+na)%na,a1=na;
}exBSGS,每次除去 $\gcd$ 递归下去直到互质。
满足 $a^x \equiv 1 \mod m$ 的最小正整数 $x$,叫做 $a$ 模 $m$ 的阶,记作 $\delta_m(a)$。$a$ 与 $m$ 互质是阶存在的充要条件。可以用 BSGS 求解。
满足 $\delta_m(g) = \varphi(m)$ 的 $g$ 称为 $m$ 的原根。
原根判定可以枚举 $\varphi(m)$ 的质因数 $p$,看是否有 $g^{\frac{\varphi(m)}{p}} \equiv 1 \mod m$。
最小的原根很小,可以枚举求解。
原根满足 $g^0,g^1,…,g^{\varphi(m)-1}$ 在模 $m$ 意义下互不相同,$m$ 是质数的话可以乘法转加法。