P5491 【模板】二次剩余
\(\text{Summary}\)
实际上是做法的归纳
一切皆是结论性的,没有证明!
模 \(p\) 意义下的二次剩余有 \(\frac{p-1}2\) 个,二次非剩余也恰有那么多
考虑解关于 \(x\) 的同余方程
\]
当 \(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\)
有
\]
证明的话,有
\(\text{Lemma 1}\)
\]
\(\text{Lemma 2}\)
\]
然后
(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 【模板】二次剩余的更多相关文章
- 【模板】【数论】二次剩余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 ...
- [zoj 3774]Power of Fibonacci 数论(二次剩余 拓展欧几里得 等比数列求和)
Power of Fibonacci Time Limit: 5 Seconds Memory Limit: 65536 KB In mathematics, Fibonacci numbe ...
- 【learning】多项式开根详解+模板
概述 多项式开跟是一个非常重要的知识点,许多多项式题目都要用到这一算法. 用快速数论变换,多项式求逆元和倍增法可以在$O(n log n)$的时间复杂度下求出一个$n$次多项式的开根. 前置技能 快速 ...
- 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 ...
- [长期更新]模板&算法学习情况
这里仅作为自我检查用,模板代码请移步其他博文 标+的表示已学完,标?的表示需要进一步学习,标-的表示有计划但未开始学习,标*的表示暂时没有计划学习 数学 ?BSGS +FFT&NTT ?Luc ...
- 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: 全部部分都要 ...
- 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} ...
- 二次剩余定理及Cipolla算法入门到自闭
二次剩余定义: 在维基百科中,是这样说的:如果q等于一个数的平方模 n,则q为模 n 意义下的二次剩余.例如:x2≡n(mod p).否则,则q为模n意义下的二次非剩余. Cipolla算法:一个解决 ...
- 【学习笔记】OI模板整理
CSP2019前夕整理一下模板,顺便供之后使用 0. 非算法内容 0.1. 读入优化 描述: 使用getchar()实现的读入优化. 代码: inline int read() { int x=0; ...
- ACM模板_axiomofchoice
目录 语法 c++ java 动态规划 多重背包 最长不下降子序列 计算几何 向量(结构体) 平面集合基本操作 二维凸包 旋转卡壳 最大空矩形 | 扫描法 平面最近点对 | 分治 最小圆覆盖 | 随机 ...
随机推荐
- JS逆向实战9——cookies DES加密混淆
cookie加密 DES 混淆 目标网站:aHR0cHM6Ly90bGNoZW1zaG9wLnlvdXpoaWNhaS5jb20vbWFpbi90ZW5kP05vdGljZUNhdGVJZD0xJk5 ...
- ArcObjects SDK开发 003 宏观角度看ArcObjects SDK
1.为什么要宏观上看ArcObjects SDK ArcObjects SDK库是一个非常庞大复杂COM组件集合,ArcGIS10.0有1000多个枚举.90多个结构体.5000多个接口以及4000多 ...
- java并发数据结构之CopyOnWriteArrayList
CopyOnWriteArrayList是一个线程安全的List实现,其在对对象进行读操作时,由于对象没有发生改变,因此不需要加锁,反之在对象进行增删等修改操作时,它会先复制一个对象副本,然后对副本进 ...
- JAVA里Map的一些常用方法
Map的常用方法 案例1 场景:一张建行用户体验金信息大表(百万级别),里面存在一个字段对多条数据,需要统计某个字段的多条数据累加值以供于别的服务调用. 优化前解决:直接查出来一个大list给到另一个 ...
- C++四舍五入并且保留7为小数
问题描述给定圆的半径r,求圆的面积.输入格式输入包含一个整数r,表示圆的半径.输出格式输出一行,包含一个实数,四舍五入保留小数点后7位,表示圆的面积.说明:在本题中,输入是一个整数,但是输出是一个实数 ...
- JavaScript入门⑨-异步编程●异世界之旅
JavaScript入门系列目录 JavaScript入门①-基础知识筑基 JavaScript入门②-函数(1)基础{浅出} JavaScript入门③-函数(2)原理{深入}执行上下文 JavaS ...
- 《HTTP权威指南》– 2.HTTP报文与URL资源
URL与资源: 大多数URL方案的URL语法都建立在这个由9部分构成的通用格式上. 方案: 访问服务器以获取资源要使用哪种协议 用户: 某些方案访问资源时需要的用户名 密码: 用户名后面可能包含的密码 ...
- python 之定时任务(schedule)
import schedule import time def job(): print("定时通报...") # 定义一个叫job的函数,函数的功能是打印'定时通报...' sc ...
- 关于Git在Visual studio及Git Bush中的日常操作教程,有图有说明,会一直更新本页内容... (Git相对SVN具有更加安全的分布式存储, 分支版本之间切换秒级速度, 分支版本强大灵活等特点)
>安装命令行和TortoiseGit UI程序. <git bash的安装> https://git-scm.com/downloads <windows可视化工具 Torto ...
- [OpenCV实战]21 使用OpenCV的Eigenface
目录 1 PCA 1.1 方差是什么 1.2 什么是PCA 1.3 什么是矩阵的特征向量和特征值? 1.4 如何计算PCA 2 什么是EigenFaces? 2.1 将图像作为向量 2.2 如何计算如 ...