【算法讲18:二次剩余】勒让德符号 | 欧拉判别法 | Cipolla 算法
【算法讲18:二次剩余】
- Source\mathfrak{Source}Source
- ⌈\lceil⌈二次剩余⌋\rfloor⌋与⌈\lceil⌈二次非剩余⌋\rfloor⌋
- ⌈\lceil⌈二次互反律⌋\rfloor⌋
- ⌈Cipolla⌋\lceil\mathfrak{Cipolla}\rfloor⌈Cipolla⌋ 算法
- 引入
- CipollaCipollaCipolla 算法
- CipollaCipollaCipolla 算法的证明
- 代码中怎么求 (a+ω)(p+1)/2(a+\omega)^{(p+1)/2}(a+ω)(p+1)/2?
- 代码
Source\mathfrak{Source}Source
- 《初等数论及其应用》第六版第十一章
省略了很多帮助理解的例子和证明。浓缩了一下密集的知识点。
Cipolla算法学习小记 [ 1 ]
⌈\lceil⌈二次剩余⌋\rfloor⌋与⌈\lceil⌈二次非剩余⌋\rfloor⌋
- 定义:
设 mmm 是正整数,aaa 是整数,若 (a,m)=1(a,m)=1(a,m)=1,且同余方程 x2≡a(modm)x^2\equiv a\pmod mx2≡a(modm) 有解,则称 aaa 为 mmm 的二次剩余。
若同余方程 x2≡a(modm)x^2\equiv a\pmod mx2≡a(modm) 无解,则称 aaa 为 mmm 的二次非剩余。 - 引理 11.111.111.1
设 ppp 是奇素数, aaa 是不被 ppp 整除的整数,则同余方程
x2≡a(modp)x^2\equiv a\pmod p x2≡a(modp)
或者无解,或者恰有两个模 ppp 不同余的解。
证明:(1)若该同余方程有解,不妨设 x=x0x=x_0x=x0,易得 x=−x0x=-x_0x=−x0 是不同余的解。
(2)为证不存在多于两个不同余的解,设 x0x_0x0 和 x1x_1x1 都是该同余方程的解。
则有 x02=x12≡a(modp)x_0^2=x_1^2\equiv a\pmod px02=x12≡a(modp),于是 x02−x12=(x0+x1)(x0−x1)≡0(modp)x_0^2-x_1^2=(x_0+x_1)(x_0-x_1)\equiv 0\pmod px02−x12=(x0+x1)(x0−x1)≡0(modp)
因此 p∣(x0+x1)p|(x_0+x_1)p∣(x0+x1) 或 p∣(x0−x1)p|(x_0-x_1)p∣(x0−x1),于是 x1≡−x0(modp)x_1\equiv -x_0\pmod px1≡−x0(modp) 或者 x1≡x0(modp)x_1\equiv x_0\pmod px1≡x0(modp).
因此,若 x2≡a(modp)x_2\equiv a\pmod px2≡a(modp),则只能有两个不同余的解。 - 定理 11.111.111.1
若 ppp 是奇素数,则在整数 1,2,⋯,p−11,2,\cdots,p-11,2,⋯,p−1 中,ppp 的二次剩余恰有 (p−1)/2(p-1)/2(p−1)/2个,二次非剩余恰有 (p−1)/2(p-1)/2(p−1)/2 个。 - 勒让德符号
设 ppp 是奇素数,整数 aaa 不被 ppp 整除,勒让德符号定义为:
(ap)={1若a是p的二次剩余−1若a是p的二次非剩余(\frac{a}{p})= \begin{cases} 1&若 a是p的二次剩余\\ -1&若a是p的二次非剩余\\ \end{cases} (pa)={1−1若a是p的二次剩余若a是p的二次非剩余 - 欧拉判别法
设 ppp 是奇素数,aaa 是不被 ppp 整除的正整数,则
(ap)≡a(p−1)/2(modp)(\frac{a}{p})\equiv a^{(p-1)/2}\pmod p (pa)≡a(p−1)/2(modp)
证明:(1)首先假设 (ap)=1(\frac{a}{p})=1(pa)=1,于是同余方程 xa≡a(modp)x^a\equiv a\pmod pxa≡a(modp) 有解,设为 x=x0x=x_0x=x0
利用费马小定理,可知
a(p−1)/2=(x02)(p−1)/2=x0p−1≡1(modp)a^{(p-1)/2}=(x_0^2)^{(p-1)/2}=x_0^{p-1}\equiv 1\pmod p a(p−1)/2=(x02)(p−1)/2=x0p−1≡1(modp)
因此,若 (ap)=1(\frac{a}{p})=1(pa)=1,则(ap)≡a(p−1)/2(modp)(\frac{a}{p})\equiv a^{(p-1)/2}\pmod p(pa)≡a(p−1)/2(modp)
(2)现在考虑 (ap)=−1(\frac{a}{p})=-1(pa)=−1,此时同余方程 xa≡a(modp)x^a\equiv a\pmod pxa≡a(modp) 无解。
此时对每个满足 (i,p)=1(i,p)=1(i,p)=1 的整数 iii,存在整数 jjj 使得 ij≡a(modp)ij\equiv a\pmod pij≡a(modp),且i≠ji\ne ji=j。
因此,我们可以将整数 1,2,⋯,p−11,2,\cdots,p-11,2,⋯,p−1 分成 (p−1)/2(p-1)/2(p−1)/2 对,每一对的乘积为 aaa,将这些相乘得到
(p−1)!≡a(p−1)/2(modp)(p-1)!\equiv a^{(p-1)/2}\pmod p (p−1)!≡a(p−1)/2(modp)
由威尔逊定理可知 (p−1)!≡−1(modp)(p-1)!\equiv -1\pmod p(p−1)!≡−1(modp)
于是 a(p−1)/2≡−1(modp)a^{(p-1)/2}\equiv -1\pmod pa(p−1)/2≡−1(modp)
于是,我们得到了 (ap)≡a(p−1)/2(modp)(\frac{a}{p})\equiv a^{(p-1)/2}\pmod p(pa)≡a(p−1)/2(modp) - 定理 11.411.411.4
设 ppp 是奇素数,aaa 和 bbb 是不被 ppp 整除的整数,则
(1)若a≡b(modp),则(ap)=(bp)(2)(ap)(bp)=(abp)(3)(a2p)=1\begin{aligned} &(1)若 a\equiv b\pmod p,则 (\frac{a}{p})=(\frac{b}{p})\\ &(2)(\frac{a}{p})(\frac{b}{p})=(\frac{ab}{p})\\ &(3)(\frac{a^2}{p})=1 \end{aligned} (1)若a≡b(modp),则(pa)=(pb)(2)(pa)(pb)=(pab)(3)(pa2)=1 - 高斯引理
设 ppp 是奇素数,aaa 是整数,且 (a,p)=1(a,p)=1(a,p)=1.
若 sss 是整数 a,2a,3a,⋯,(p−12)aa,2a,3a,\cdots,(\frac{p-1}{2})aa,2a,3a,⋯,(2p−1)a 的最小正剩余中大于 p2\frac{p}{2}2p 的个数
则 (ap)=(−1)s(\frac{a}{p})=(-1)^s(pa)=(−1)s
证明略。
⌈\lceil⌈二次互反律⌋\rfloor⌋
- 二次互反律:
设 p,qp,qp,q 是不同的奇素数,则
(pq)(qp)=(−1)p−12⋅q−12(\frac{p}{q})(\frac{q}{p})=(-1)^{\frac{p-1}{2}\cdot\frac{q-1}{2}} (qp)(pq)=(−1)2p−1⋅2q−1
⌈Cipolla⌋\lceil\mathfrak{Cipolla}\rfloor⌈Cipolla⌋ 算法
引入
- 【模板】二次剩余 | 洛谷 P5491
给定 N、pN、pN、p,求解 x2≡N(modp)x^2\equiv N\pmod px2≡N(modp)
其中 ppp 是奇素数。
样例组数 T≤1000T\le 1000T≤1000
N,p≤109+9N,p\le 10^9+9N,p≤109+9
CipollaCipollaCipolla 算法
- 第一步
随机找一个 a∈[0,p)a\in[0,p)a∈[0,p),使得其满足 (a2−n)(p−1)/2≡−1(modp)(a^2-n)^{(p-1)/2}\equiv -1\pmod p(a2−n)(p−1)/2≡−1(modp)
根据定理 11.111.111.1,期望次数为 222 - 第二步
设一个复数 ω=a2−n\omega=\sqrt{a^2-n}ω=a2−n,易得满足 ω2=a2−n\omega^2=a^2-nω2=a2−n - 第三步
最终答案为 x0=(a+ω)(p+1)/2x_0=(a+\omega)^{(p+1)/2}x0=(a+ω)(p+1)/2
根据引理 11.111.111.1,另一个不同余的答案为 x1≡−x0(modp)x_1\equiv -x_0\pmod px1≡−x0(modp)
CipollaCipollaCipolla 算法的证明
- 参考 [ 1 ] 处的博客。
- 引理 111
(a+b)p≡ap+bp(modp)(a+b)^p\equiv a^p+b^p\pmod p (a+b)p≡ap+bp(modp)
证明:展开二项式之后可以得到
(a+b)p=∑i=0pCpiaibp−i=∑i=0pp!i!(p−i!)aibp−i≡ap+bp(modp)(a+b)^p=\sum_{i=0}^pC_p^ia^ib^{p-i}=\sum_{i=0}^p\frac{p!}{i!(p-i!)}a^ib^{p-i}\equiv a^p+b^p\pmod p (a+b)p=i=0∑pCpiaibp−i=i=0∑pi!(p−i!)p!aibp−i≡ap+bp(modp) - 引理 222
ωp≡−ω(modp)\omega^p\equiv -\omega \pmod p ωp≡−ω(modp)
证明:
ωp=ωp−1×ω=(ω2)(p−1)/2×ω=(a2−n)(p−1)/2×ω≡−ω(modp)\begin{aligned} \omega^p&=\omega^{p-1}\times\omega\\ &=(\omega^2)^{(p-1)/2}\times\omega\\ &=(a^2-n)^{(p-1)/2}\times \omega\\ &\equiv -\omega \pmod p \end{aligned} ωp=ωp−1×ω=(ω2)(p−1)/2×ω=(a2−n)(p−1)/2×ω≡−ω(modp) - 引理 333
ap≡a(modp)a^p\equiv a\pmod pap≡a(modp)
证明:根据费马小定理得到 ap−1≡1(modp)a^{p-1}\equiv 1\pmod pap−1≡1(modp) 可得。 - 推导
以下同余式子皆为 (modp)\pmod p(modp) 意义下成立的。
(a+ω)(p+1)/2≡((a+ω)p(a+ω))1/2≡((ap+ωp)(a+ω))1/2根据引理1≡((a−ω)(a+ω))1/2根据引理2和3≡(a2−ω2)1/2≡(a2−a2+n)1/2≡n1/2\begin{aligned} (a+\omega)^{(p+1)/2}&\equiv ((a+\omega)^p(a+\omega))^{1/2}\\ &\equiv ((a^p+\omega^p)(a+\omega))^{1/2}&根据引理1\\ &\equiv ((a-\omega)(a+\omega))^{1/2}&根据引理2和3\\ &\equiv (a^2-\omega^2)^{1/2}\\ &\equiv (a^2-a^2+n)^{1/2}\\ &\equiv n^{1/2} \end{aligned} (a+ω)(p+1)/2≡((a+ω)p(a+ω))1/2≡((ap+ωp)(a+ω))1/2≡((a−ω)(a+ω))1/2≡(a2−ω2)1/2≡(a2−a2+n)1/2≡n1/2根据引理1根据引理2和3
代码中怎么求 (a+ω)(p+1)/2(a+\omega)^{(p+1)/2}(a+ω)(p+1)/2?
- 由于我们已知 ω2=a2−n\omega^2=a^2-nω2=a2−n,我们可以把 ω\omegaω 看成虚部,然后
(a1+b1ω)(a2+b2ω)=(a1a2+b1b2ω2)+(a1b2+a2b1)ω(a_1+b_1\omega)(a_2+b_2\omega)=(a_1a_2+b_1b_2\omega^2)+(a_1b_2+a_2b_1)\omega (a1+b1ω)(a2+b2ω)=(a1a2+b1b2ω2)+(a1b2+a2b1)ω
然后用复数快速幂即可。
代码
- 时间复杂度:O(Tlogn)O(T\log n)O(Tlogn)
const int MAX = 1e6+50;ll qpow(ll a,ll n,ll p){a%=p;ll res = 1LL;while(n){if(n&1)res=res*a%p;a=a*a%p;n>>=1;}return res;}struct comp{ll x,y;comp(ll xx = 0,ll yy = 0){x = xx,y = yy;}
};
ll omega;
comp mul(comp a,comp b,ll p){comp c = {0,0};c.x = a.x * b.x % p + a.y * b.y % p * omega % p;c.y = a.x * b.y % p + a.y * b.x % p;c.x = (c.x % p + p) % p;c.y = (c.y % p + p) % p;return c;
}
ll qpow(comp a,ll n,ll p){comp res = {1,0};while(n){if(n & 1)res = mul(res,a,p);a = mul(a,a,p);n >>= 1;}return res.x;
}bool Eular(ll n,ll p){return qpow(n,(p-1)/2,p) == 1;
}
ll quad_residue(ll n,ll p){n %= p;if(!Eular(n,p))return -1;ll a = 0;while(1){a = rand() % p;omega = ((a * a % p - n) % p + p) % p;if(qpow(omega,(p-1)/2,p) == p-1){break;}}comp I = {a,1};return qpow(I,(p+1)/2,p);
}
int main()
{int T;scanf("%d",&T);while(T--){ll n,p;scanf("%lld%lld",&n,&p);if(n == 0){puts("0");continue;}ll ans1 = quad_residue(n,p);ll ans2 = p - ans1;if(ans1 == -1){puts("Hola!");continue;}if(ans1 > ans2)swap(ans1,ans2);printf("%lld %lld\n",ans1,ans2);}return 0;
}
【算法讲18:二次剩余】勒让德符号 | 欧拉判别法 | Cipolla 算法相关推荐
- 欧拉判别法 欧拉准则
若是奇质数且不能整除,则: 是模的二次剩余当且仅当: 是模的二次非剩余当且仅当: 以勒让德符号表示,即为:
- 模平方剩余(二次剩余)与欧拉判别法
跳转到页内:欧拉判别法 模平方剩余(二次剩余) 定义 设ppp为奇素数,且(a,p)=1(a, p)=1(a,p)=1,如果二次同余式x2≡a(modp)x^2\equiv a \ (mod \ ...
- 【素数问题】整理几种计算素数的算法,包含:两层循环,开根号法,埃氏筛选法,欧拉筛选法
这篇文章主要介绍素数相关的算法问题,包含:两层循环判断,开根号法,埃氏筛选法,欧拉筛选法. 目录 一.什么是素数 二.素数计算几种方式 2.1.两层循环
- 多线程之基于积分法与欧拉恒等式法的圆周率计算及OMP优化
文章目录 一.问题描述 二.积分法 算法推导 编程实现 OMP优化 三.欧拉恒等式 算法推导 编程实现 前期准备 加法 减法 乘法 除法 算法实现 OMP优化 四.总结 积分法与欧拉恒等式法的对比 O ...
- 夜深人静写算法(三十一)- 欧拉函数
文章目录 一.前言 二.欧拉函数 1.欧拉函数定义 1)素数 2)素数的幂 3)互素数的乘积 4)一般情况 2.欧拉定理 三.欧拉函数的求解 1.素数试除法 1)算法原理 2)算法实现 2.筛选预处理 ...
- 【算法讲2:拓展欧几里得(简略讲)】求解 ax+by=c
拓展欧几里得算法 欧几里得算法简介 拓展欧几里得算法简介 [递归方法:倒序带入法] [递归代码] [递推方法:滚动变量记录法] [递推代码] 应用:如何解 ax+by=c 测试代码 欧几里得算法简介 ...
- spoj26246 Strange But Easy(欧拉筛选法求素数)
用php提交超时,改为c++ #include <cstdio> #include <vector> #include <cstring>using namespa ...
- 夜雨数竞笔记-不定积分(4)-换元法-欧拉替换法
- 二次剩余--欧拉准则
在 数论中, 二次剩余的 欧拉判别法(又称 欧拉准则)是用来判定给定的 整数是否是一个 质数的 二次剩余. 目录 1 叙述 2 举例 2.1 例子一:对于给定数,寻找其为二次剩余的模数 2.2 例子二 ...
最新文章
- SQLAlchemy简介与入门
- 【安富莱原创开源应用第3期】花式玩转网络摄像头之VNC远程桌面版本,稳定运行2年不死机...
- 配置lamp+supervisor
- Java语言之数组_java语言之数组-----选择排序
- ABAP web service schema node的处理
- c# 正则表达式 html标签,C#匹配HTML标签,正则表达式谁会?
- python视频人脸检测_Python基于OpenCV实现视频的人脸检测
- node生成uuid
- 题解【luogu2045 方格取数游戏加强版】
- C++STL查找,lower_bound()函数和upper_bound()函数的区别
- 004 Leaflet 第四个demo 使用自己的图标替换marker图标
- PropertyUtils.copyProperties 属性值复制失败
- ubuntu使用教程
- 卸载xftp7 安装xftp5后,点击xshell中打开xftp快捷按钮,提示“无法打开xftp”
- android so strip,用于CMake构建工具链中“strip”命令的Android NDK路径变量
- 新华三计算机网络题,1024新华三计算节,以至极之道加速自主创新
- 线性可分 线性不可分
- 跨境电商必读:什么是社交媒体营销?
- 今天,数据库“打工人”告诉你一个秘密
- 我们不做看客,只做时代的赋能者—FMI2018人工智能与大数据高峰论坛圆满落幕...