二次剩余(学习笔记)
就是用来求解x2≡n mod px^2\equiv n \bmod px2≡nmodp的一个方法
对ppp进行分类讨论:
- p=2p=2p=2 ,则x=nx=nx=n
- 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−10a在模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−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,由费马小定理显然成立
若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;
}
- ppp为奇素数的幂
这里参考了这个博客
求解x2≡a mod pnx^2\equiv a\bmod p^nx2≡amodpn,gcd(n,p)=1gcd(n,p)=1gcd(n,p)=1,下面只介绍方法
先求出方程x2≡a mod 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不是素数,所以求逆元用扩展欧几里得算法即可。 - ppp为合数
将ppp质因数分解,问题变成了333中的内容,然后解出各答案用中国剩余定理合并即可。
二次剩余(学习笔记)相关推荐
- 多项式相关操作学习笔记
多项式相关操作学习笔记 标签: 多项式 说在前边 记录一下相关的多项式操作,顺便存个模板.(多点求值之后的部分,有点写不动了...留坑留坑 多项式 定义 给定一个环\(R\)(\(R\)通常是交换环, ...
- PyTorch 学习笔记(六):PyTorch hook 和关于 PyTorch backward 过程的理解 call
您的位置 首页 PyTorch 学习笔记系列 PyTorch 学习笔记(六):PyTorch hook 和关于 PyTorch backward 过程的理解 发布: 2017年8月4日 7,195阅读 ...
- 容器云原生DevOps学习笔记——第三期:从零搭建CI/CD系统标准化交付流程
暑期实习期间,所在的技术中台-效能研发团队规划设计并结合公司开源协同实现符合DevOps理念的研发工具平台,实现研发过程自动化.标准化: 实习期间对DevOps的理解一直懵懵懂懂,最近观看了阿里专家带 ...
- 容器云原生DevOps学习笔记——第二期:如何快速高质量的应用容器化迁移
暑期实习期间,所在的技术中台-效能研发团队规划设计并结合公司开源协同实现符合DevOps理念的研发工具平台,实现研发过程自动化.标准化: 实习期间对DevOps的理解一直懵懵懂懂,最近观看了阿里专家带 ...
- 2020年Yann Lecun深度学习笔记(下)
2020年Yann Lecun深度学习笔记(下)
- 2020年Yann Lecun深度学习笔记(上)
2020年Yann Lecun深度学习笔记(上)
- 知识图谱学习笔记(1)
知识图谱学习笔记第一部分,包含RDF介绍,以及Jena RDF API使用 知识图谱的基石:RDF RDF(Resource Description Framework),即资源描述框架,其本质是一个 ...
- 计算机基础知识第十讲,计算机文化基础(第十讲)学习笔记
计算机文化基础(第十讲)学习笔记 采样和量化PictureElement Pixel(像素)(链接: 采样的实质就是要用多少点(这个点我们叫像素)来描述一张图像,比如,一幅420x570的图像,就表示 ...
- 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 ...
- MongoDB学习笔记(入门)
MongoDB学习笔记(入门) 一.文档的注意事项: 1. 键值对是有序的,如:{ "name" : "stephen", "genda" ...
最新文章
- vue脚手架项目技术集合
- opencv机器学习线性回归_机器学习入门1---简单线性回归
- Uchome的登录验证机制
- 贪吃蛇原型实现基本思路
- 数字货币交易所源码_(数字货币交易所科普)开发数字货币交易所应该注意哪些问题...
- 百合数c语言360问答,百合花的朵数代表的意义???
- matlab试用版的user id,免费试用MATLAB
- img标签设置display:block,宽度无法100%
- 关于浙大考研878历年试卷的说明
- 游标sql server_了解游标并将其替换为SQL Server中的JOIN
- python知识点总结一
- Oracle 数据库用户表大小分析
- ext2文件系统详解
- 无线网络稳定性测试方案
- ios 高德挪动地图获取经纬度_iOS 高德地图 根据经纬度解析成位置
- ASP.NET 即时通信,WebSocket服务端实例
- 用html作小米官网首页效果,html+css实现小米商城首页静态页面
- 理解最大回撤及Python实现
- 微信小程序毕业设计开题报告医院预约挂号小程序+后台管理系统|前后分离VUE.js
- Qt:图标刷新自动旋转