2023.1.16【数学】 二次剩余
2023.1.16 二次剩余
问题叙述
给出 N,p,求解方程
且保证 p 是奇素数。
算法流程
解的数量
首先,探究
可以得到
因为
所以
在模p意义下有
判断二次剩余
怎样快速判断一个数是否是模p的二次剩余?
假设n不为0
因为p是质数,可以得到
若
那么有
也就是说 k 一定是偶数,那么令
反推也可以得到,所以
Cipolla
我们随机化得到一个a,使得
定义
所以仿照复数域对实数域的定义,我们将数表示成A + Bi的形式,以下有两个引论:
引论
1 .
2 .
对于
最后,使用这两条引论,我们可以推出:
Q1:为什么
Q2:为什么
这样,答案为n开根,就是
对于a + i,我们采用复数乘法的方式进行快速幂,将其当成一个多项式进行乘方,记录下
(xa + yi) * (za + ri) = (xz + yrw) + (yz + rx)i
可得此乘法的“单位元”是1 + 0i
得到a后直接初始化为(a + 1i)代入快速幂计算即可,最后取实数部分
Q3:为什么快速幂后的复数部分一定为0?
A3:使用反证法,设存在
那么
式子左侧复数为0,则右侧复数也为0,
B
由于
终于完了qwq
Code
(代码实现时注意时刻取模,必要时正数处理)
#include<bits/stdc++.h>
using namespace std;
int w;
struct Inum{//复数
int a,b;
inline Inum mul(Inum x,Inum y,int p)
{
Inum z;
z.a = (1ll * x.a * y.a % p + (1ll * x.b * y.b % p) * w % p) % p;
z.a = (z.a + p) % p;
z.b = (1ll * x.a * y.b % p + 1ll * x.b * y.a % p) % p;
z.b = (z.b + p) % p;
return z;
}
};
int p,n;
inline int ksm(int base,int pts,int p)
{
int ans = 1;
for(;pts > 0;pts >>= 1,base = 1ll * base * base % p)
if(pts & 1)
ans = 1ll * ans * base % p;
return ans;
}
inline Inum ksmI(Inum base,int pts,int p)
{
Inum ans;ans.a = 1;ans.b = 0;
for(;pts > 0;pts >>= 1,base = base.mul(base,base,p))
if(pts & 1)
ans = base.mul(ans,base,p);
return ans;
}
inline bool judge(int x,int p)//检验x是不是二次剩余
{
if(ksm(x,(p - 1) >> 1,p) == 1) return 1;
return 0;
}
int main()
{
srand(time(NULL));
int T;
scanf("%d",&T);
while(T--)
{
scanf("%d%d",&n,&p);
if(ksm(n,(p - 1) >> 1,p) == p - 1)
{
printf("Hola!\n");//无解
continue;
}
int s = rand() % p;
while(judge(((1ll * s * s % p - n) % p + p) % p,p))
s = rand() % p;
w = ((1ll * s * s % p - n) % p + p) % p;
Inum x;
x.a = s;x.b = 1;
Inum ans = ksmI(x,(p + 1) >> 1,p);
int ret = ans.a;
if(ret != 0)
printf("%d %d\n",min(ret,-ret + p),max(ret,-ret + p));//按照模后从小到大的顺序输出
else
printf("0\n");
}
return 0;
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· AI 智能体引爆开源社区「GitHub 热点速览」
· 从HTTP原因短语缺失研究HTTP/2和HTTP/3的设计差异
· 三行代码完成国际化适配,妙~啊~