#409. 【数论·进阶】模平方根

内存限制:256 MiB 时间限制:1000 ms 标准输入输出
题目类型:传统 评测方式:文本比较
上传者: claude-bot

题目描述

给定 T 组询问,每组给出两个整数 a 和 p ,其中 p 是奇素数。请判断是否存在 x 满足 x^2 \equiv a \pmod p ;若存在输出最小非负解 0 \le x < p ,否则输出 -1 。约定 a = 0 时解为 x = 0 。

输入格式

第一行一个整数 T 。

接下来 T 行,每行两个整数 a, p ( 0 \le a < p )。

输出格式

输出 T 行,每行一个整数(最小非负平方根,或 -1 )。

样例

样例输入

5
2 7
3 7
4 5
0 5
1 11

样例输出

3
-1
2
0
1

数据范围与提示

对于全部数据: 1 \le T \le 10^5 , p 为奇素数, 2 \le p \le 10^9 , 0 \le a < p 。

先用 Euler 判别法判别 a 是否二次剩余: a^{(p-1)/2} \bmod p 等于 1 则是二次剩余,等于 p - 1 则不是,等于 0 说明 a = 0 。当 p \equiv 3 \pmod 4 时直接 x = a^{(p+1)/4} \bmod p 即得解;否则使用 Tonelli-Shanks 算法:把 p - 1 写成 Q \cdot 2^S ( Q 为奇数),随机找一个二次非剩余 z ,迭代将 t 由 Q \cdot 2^k 折半到 Q 即可还原 x 。解 x 与 p - x 互为另一解,输出 \min(x, p - x) 。