就是用来求解x2≡n mod px^2\equiv n \bmod px2≡nmodp的一个方法

对ppp进行分类讨论:

  1. p=2p=2p=2 ,则x=nx=nx=n
  2. ppp为奇素数
    勒让德符号
    (ap)={1a在模p意义下是二次剩余−1a在模p意义下是非二次剩余0a≡0 mod p\begin{pmatrix}\frac{a}{p}\end{pmatrix}=\begin{cases}1&a在模p意义下是二次剩余\\-1&a在模p意义下是非二次剩余\\0&a\equiv 0\bmod p\end{cases}(pa​​)=⎩⎪⎨⎪⎧​1−10​a在模p意义下是二次剩余a在模p意义下是非二次剩余a≡0modp​
    有一个定理:(ap)≡ap−12 mod p\begin{pmatrix}\frac{a}{p}\end{pmatrix}\equiv a^{\frac{p-1}{2}}\bmod p(pa​​)≡a2p−1​modp
    证明
    若aaa在模ppp意义下是二次剩余,设x2≡a mod px^2\equiv a\bmod px2≡amodp,则有xp−1≡1 mod px^{p-1}\equiv 1\bmod pxp−1≡1modp,由费马小定理显然成立
    若aaa在模ppp意义下是非二次剩余,设x2≡a mod px^2\equiv a\bmod px2≡amodp,则有xp−1≡−1 mod px^{p-1}\equiv -1\bmod pxp−1≡−1modp,由费马小定理显然不成立
    若a mod p=0a\bmod p=0amodp=0显然成立
    所以可以首先判断是否有解,就用勒让德符号来判断
    第二步需要找到一个aaa,使得w=a2−nw=a^2-nw=a2−n在模ppp意义下是非二次剩余,
    则x=(a+w)p+12x=(a+\sqrt{w})^{\frac{p+1}{2}}x=(a+w​)2p+1​

    证明
    定理:(a+b)p≡ap+bp mod p(a+b)^p\equiv a^p+b^p \bmod p(a+b)p≡ap+bpmodp
    证明:(其实可以感性理解 ,可以根据二项式定理展开,在中间的组合数的阶乘中,ppp无法被消掉,因此 mod p\bmod pmodp一定为000,有贡献的只有第一项和最后一项也就是ap,bpa^p,b^pap,bp
    证明2:

    算法实现:因为大约有一半的数都是非二次剩余,所以可以随机一个aaa,把w\sqrt{w}w​当作一个复数单位,定义一个复数运算
    像这样:
struct F{int x,y;F(){}F(const int &xx,const int &yy){x=xx,y=yy;}
};inline F mul(F a,F b,int mod,int w){return F((1LL*a.x*b.x%mod+1LL*a.y*b.y%mod*w%mod)%mod,(1LL*a.x*b.y%mod+1LL*a.y*b.x%mod)%mod);
}

例题:模板题

代码如下:

#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
#include<cmath>
#include<cstdlib>
#include<ctime>
#define LL long long
using namespace std;inline int rd(){int x=0,f=1;char c=getchar();while(c<'0' || c>'9') f=c=='-'?-1:1,c=getchar();while(c<='9' && c>='0') x=x*10+c-'0',c=getchar();return x*f;
}int t,a,n;struct F{int x,y;F(){}F(const int &xx,const int &yy){x=xx,y=yy;}
};inline F mul(F a,F b,int mod,int w){return F((1LL*a.x*b.x%mod+1LL*a.y*b.y%mod*w%mod)%mod,(1LL*a.x*b.y%mod+1LL*a.y*b.x%mod)%mod);
}inline F qpow(F x,int k,int mod,int w){F ret(1,0);while(k){if(k&1) ret=mul(ret,x,mod,w);x=mul(x,x,mod,w); k>>=1;} return ret;
}inline int Qpow(int x,int k,int mod){int ret=1;while(k){if(k&1) ret=1LL*ret*x%mod;x=1LL*x*x%mod; k>>=1;} return ret%mod;
}inline int solve(int n,int mod){if(mod==2) return 1;if(Qpow(n,(mod-1)>>1,mod)==mod-1) return -1;while(1){int a=rand()%mod;int w=(1LL*a*a%mod+mod-n)%mod;if(Qpow(w,(mod-1)>>1,mod)==mod-1){F ans=qpow(F(a,1),(mod+1)>>1,mod,w);return ans.x;}}
}int main(){scanf("%d",&t);while(t--){scanf("%d%d",&a,&n); a%=n;int ans=solve(a,n);if(ans==-1) puts("No root");else{int ans2=n-ans;if(ans>ans2) swap(ans,ans2);if(ans==ans2) printf("%d\n",ans);else printf("%d %d\n",ans,ans2);}}return 0;
}
  1. ppp为奇素数的幂
    这里参考了这个博客
    求解x2≡a&VeryThinSpace;mod&VeryThinSpace;pnx^2\equiv a\bmod p^nx2≡amodpn,gcd(n,p)=1gcd(n,p)=1gcd(n,p)=1,下面只介绍方法
    先求出方程x2≡a&VeryThinSpace;mod&VeryThinSpace;px^2\equiv a\bmod px2≡amodp的一个解rrr,那么进一步有
    我们知道

    也就是

    可证明gcd(t,p)=1,gcd(u,p)=1gcd(t,p)=1,gcd(u,p)=1gcd(t,p)=1,gcd(u,p)=1,最终得到

    这里由于pnp^npn不是素数,所以求逆元用扩展欧几里得算法即可。
  2. ppp为合数
    将ppp质因数分解,问题变成了333中的内容,然后解出各答案用中国剩余定理合并即可。

二次剩余(学习笔记)相关推荐

  1. 多项式相关操作学习笔记

    多项式相关操作学习笔记 标签: 多项式 说在前边 记录一下相关的多项式操作,顺便存个模板.(多点求值之后的部分,有点写不动了...留坑留坑 多项式 定义 给定一个环\(R\)(\(R\)通常是交换环, ...

  2. PyTorch 学习笔记(六):PyTorch hook 和关于 PyTorch backward 过程的理解 call

    您的位置 首页 PyTorch 学习笔记系列 PyTorch 学习笔记(六):PyTorch hook 和关于 PyTorch backward 过程的理解 发布: 2017年8月4日 7,195阅读 ...

  3. 容器云原生DevOps学习笔记——第三期:从零搭建CI/CD系统标准化交付流程

    暑期实习期间,所在的技术中台-效能研发团队规划设计并结合公司开源协同实现符合DevOps理念的研发工具平台,实现研发过程自动化.标准化: 实习期间对DevOps的理解一直懵懵懂懂,最近观看了阿里专家带 ...

  4. 容器云原生DevOps学习笔记——第二期:如何快速高质量的应用容器化迁移

    暑期实习期间,所在的技术中台-效能研发团队规划设计并结合公司开源协同实现符合DevOps理念的研发工具平台,实现研发过程自动化.标准化: 实习期间对DevOps的理解一直懵懵懂懂,最近观看了阿里专家带 ...

  5. 2020年Yann Lecun深度学习笔记(下)

    2020年Yann Lecun深度学习笔记(下)

  6. 2020年Yann Lecun深度学习笔记(上)

    2020年Yann Lecun深度学习笔记(上)

  7. 知识图谱学习笔记(1)

    知识图谱学习笔记第一部分,包含RDF介绍,以及Jena RDF API使用 知识图谱的基石:RDF RDF(Resource Description Framework),即资源描述框架,其本质是一个 ...

  8. 计算机基础知识第十讲,计算机文化基础(第十讲)学习笔记

    计算机文化基础(第十讲)学习笔记 采样和量化PictureElement Pixel(像素)(链接: 采样的实质就是要用多少点(这个点我们叫像素)来描述一张图像,比如,一幅420x570的图像,就表示 ...

  9. Go 学习推荐 —(Go by example 中文版、Go 构建 Web 应用、Go 学习笔记、Golang常见错误、Go 语言四十二章经、Go 语言高级编程)

    Go by example 中文版 Go 构建 Web 应用 Go 学习笔记:无痕 Go 标准库中文文档 Golang开发新手常犯的50个错误 50 Shades of Go: Traps, Gotc ...

  10. MongoDB学习笔记(入门)

    MongoDB学习笔记(入门) 一.文档的注意事项: 1.  键值对是有序的,如:{ "name" : "stephen", "genda" ...

最新文章

  1. vue脚手架项目技术集合
  2. opencv机器学习线性回归_机器学习入门1---简单线性回归
  3. Uchome的登录验证机制
  4. 贪吃蛇原型实现基本思路
  5. 数字货币交易所源码_(数字货币交易所科普)开发数字货币交易所应该注意哪些问题...
  6. 百合数c语言360问答,百合花的朵数代表的意义???
  7. matlab试用版的user id,免费试用MATLAB
  8. img标签设置display:block,宽度无法100%
  9. 关于浙大考研878历年试卷的说明
  10. 游标sql server_了解游标并将其替换为SQL Server中的JOIN
  11. python知识点总结一
  12. Oracle 数据库用户表大小分析
  13. ext2文件系统详解
  14. 无线网络稳定性测试方案
  15. ios 高德挪动地图获取经纬度_iOS 高德地图 根据经纬度解析成位置
  16. ASP.NET 即时通信,WebSocket服务端实例
  17. 用html作小米官网首页效果,html+css实现小米商城首页静态页面
  18. 理解最大回撤及Python实现
  19. 微信小程序毕业设计开题报告医院预约挂号小程序+后台管理系统|前后分离VUE.js
  20. Qt:图标刷新自动旋转

热门文章

  1. 想起了就加一句#-_-
  2. DapaSnap简介
  3. SSRF(服务器请求伪造)
  4. 如何更好地打印9页PPT
  5. c语言分治法实验报告,分治法实验报告范文
  6. c#脚本实现-CS-ScriP,支持脚本调用第三方dll文件,增加程序框架的强壮性
  7. 软件:快速共享win10文件夹
  8. SpringBoot集成SocketIO
  9. 2019自学考试c语言程序设计答案,2017年考研英语二真题及答案解析完整版(附大作文真题范文)...
  10. 【软件相关】文献管理工具——EndNote与NoteExpress