\(\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. GitHub 开源了多款字体「GitHub 热点速览 v.22.48」

    本期 News 快读有 GitHub 官方大动作一下子开源了两款字体,同样大动作的还有 OpenAI 发布的对话模型 ChatGPT,引燃了一波人机对话. 项目这块,也许会成为新的 Web 开发生产力 ...

  2. 24V转5V,24V转3.3V稳压芯片的电路图,,PCB和BOM

    1,PW6206与PW6513系列是一款高精度,40V高输入电压,低静态电流,低压降线性稳压器具有高纹波抑制.在VOUT=5V&VIN=7V时,负载电流高达300mA,(输入与输出电压的压差越 ...

  3. C#从实习到搬砖

    日常唠唠 没事就聊聊我在c#上踩过的那些坑,和一些笔记 少点比较,多些谦虚 会者不难 原博:轩先生大冒险 2022.4.19 datagridview 修改表头 dataGridView1.Colum ...

  4. SQLMap入门——获取当前网站数据库的用户名称

    列出当前网站使用的数据库用户 python sqlmap.py -u http://localhost/sqli-labs-master/Less-1/?id=1 --current-user

  5. .NET周报【12月第2期 2022-12-15】

    国内文章 九哥聊Kestrel网络编程第一章:开发一个Redis服务器 https://mp.weixin.qq.com/s/HJYnBE-7wbvkAYHxQaq3eQ 我和拥有多个.NET 千星开 ...

  6. [编程基础] C++多线程入门6-事件处理的需求

    原始C++标准仅支持单线程编程.新的C++标准(称为C++11或C++0x)于2011年发布.在C++11中,引入了新的线程库.因此运行本文程序需要C++至少符合C++11标准. 文章目录 6 事件处 ...

  7. linux配置本地yum源实现在局域网中在线安装软件包

    安装linux下安装软件需要安装一系列的rpm包,用rpm -ivh xx和yum install xx 如果用rpm安装软件包的时候,需要自己下载rpm安装包,如果rpm包不全总是提示依赖检查失败或 ...

  8. S2-048 CVE-2017-9791 远程命令执行

    漏洞名称 S2-048 CVE-2017-9791 远程命令执行 利用条件 Struts 2.3.x 开启Struts 1 plugin and Struts 1 action插件 漏洞原理 漏洞产生 ...

  9. 迁移学习(MixMatch)《MixMatch: A Holistic Approach to Semi-Supervised Learning》

    论文信息 论文标题:MixMatch: A Holistic Approach to Semi-Supervised Learning论文作者:David Berthelot, Nicholas Ca ...

  10. 最最最常用的Git提交规范以及常用命令总结

    提交规范 为什么要制定提交规范? 便于对提交历史进行追溯,以及快速定位 代码改动的历史更加清晰 格式化的 Commit Message 才可以用于自动化输出 Change log 如何制定提交规范? ...