有关x^a = b (%p) p为质数 的问题
首先求解可以 用 原根+BSGS 转换 成 g^(x'a) = g ^ b' ,即 x' * a = b' (% p-1 )
然后可以判无解 或 判多解 (多解是循环的, 解的个数是 gcd(p-1,a), 每(p-1)/gcd(p-1,a) 一个解)
【二次剩余】
a2=b(%p)
(a2)(p-1)/2=b(p-1)/2=1
所以:b(p-1)/2=1 (欧拉判别法)是非零数b为p的二次剩余的充要条件。 若b为0要特判
下面的做法 用于无解时 扩域来运算 或者 是 用更小的复杂度来代替上面的BSGS:
random出一个b使得 w=b2-a 不是二次剩余。即 w(p-1)/2=-1。 因为[1,p)中的x的(p-1)/2次方 一半是1 一半是-1。 所以很快就能rand出来
则x=(b+sqrt(w))(p+1)/2为方程的一个解。
证明: {
(b+sqrt(w))p = bp+wp/2 (二项式展开后,C(p,i)%p!=0 当前仅当i=0或p )
= b+w(p-1)/2*sqrt(w) =b-sqrt(w)
所以 x2=(b+sqrt(w))p+1=(b-sqrt(w))*(b+sqrt(w)) =b2-w =a。
}
定义一个二元组进行之后的运算即可。