对于数字
n
n
n,求
n
%
p
\sqrt{n}\%p
n%p,看
n
n
n是否是%p的二次剩余,是的话用
x
x
x代替
n
\sqrt{n}
n
代码:
template<typename T>
inline int pow(int x, T y)
{
int res = 1; x %= MOD;
for (; y; y >>= 1, x = (LL)x*x%MOD) if (y & 1) res = (LL)res*x%MOD;
return res;
}
inline int Quadratic_residue(const int a)
{
if (a == 0)return 0;
int b = (rand() << 14 ^ rand()) % MOD;
while (pow(b, (MOD - 1) >> 1) != MOD - 1)b = (rand() << 14 ^ rand()) % MOD;
int s = MOD - 1, t = 0, x, inv = pow(a, MOD - 2), f = 1;
while (!(s & 1))s >>= 1, t++, f <<= 1;
t--, x = pow(a, (s + 1) >> 1), f >>= 1;
while (t)
{
f >>= 1;
if (pow((int)((LL)inv*x%MOD*x%MOD), f) != 1) x = (LL)x*pow(b, s) % MOD;
t--, s <<= 1;
}
return min(x, MOD - x);
}
int main() {
int n;
scanf("%d", &n);
printf("%d\n", Quadratic_residue(n));
return 0;
}
好像直接暴力找也可,比如说找 m o d = 1 e 9 + 9 时 候 5 的 x mod=1e^9+9时候\sqrt{5}的x mod=1e9+9时候5的x:
for (LL i = 1; i <= MOD; i++) {
if (i*i%MOD == 5) { cout << i << endl; break; }
}