【算法讲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∑p​Cpi​aibp−i=i=0∑p​i!(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​ω)=(a1​a2​+b1​b2​ω2)+(a1​b2​+a2​b1​)ω
    然后用复数快速幂即可。

代码

  • 时间复杂度:O(Tlog⁡n)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 算法相关推荐

  1. 欧拉判别法 欧拉准则

    若是奇质数且不能整除,则: 是模的二次剩余当且仅当: 是模的二次非剩余当且仅当: 以勒让德符号表示,即为:

  2. 模平方剩余(二次剩余)与欧拉判别法

    跳转到页内:欧拉判别法 模平方剩余(二次剩余) 定义   设ppp为奇素数,且(a,p)=1(a, p)=1(a,p)=1,如果二次同余式x2≡a(modp)x^2\equiv a \ (mod \ ...

  3. 【素数问题】整理几种计算素数的算法,包含:两层循环,开根号法,埃氏筛选法,欧拉筛选法

    这篇文章主要介绍素数相关的算法问题,包含:两层循环判断,开根号法,埃氏筛选法,欧拉筛选法. 目录 一.什么是素数 二.素数计算几种方式 2.1.两层循环

  4. 多线程之基于积分法与欧拉恒等式法的圆周率计算及OMP优化

    文章目录 一.问题描述 二.积分法 算法推导 编程实现 OMP优化 三.欧拉恒等式 算法推导 编程实现 前期准备 加法 减法 乘法 除法 算法实现 OMP优化 四.总结 积分法与欧拉恒等式法的对比 O ...

  5. 夜深人静写算法(三十一)- 欧拉函数

    文章目录 一.前言 二.欧拉函数 1.欧拉函数定义 1)素数 2)素数的幂 3)互素数的乘积 4)一般情况 2.欧拉定理 三.欧拉函数的求解 1.素数试除法 1)算法原理 2)算法实现 2.筛选预处理 ...

  6. 【算法讲2:拓展欧几里得(简略讲)】求解 ax+by=c

    拓展欧几里得算法 欧几里得算法简介 拓展欧几里得算法简介 [递归方法:倒序带入法] [递归代码] [递推方法:滚动变量记录法] [递推代码] 应用:如何解 ax+by=c 测试代码 欧几里得算法简介 ...

  7. spoj26246 Strange But Easy(欧拉筛选法求素数)

    用php提交超时,改为c++ #include <cstdio> #include <vector> #include <cstring>using namespa ...

  8. 夜雨数竞笔记-不定积分(4)-换元法-欧拉替换法

  9. 二次剩余--欧拉准则

    在 数论中, 二次剩余的 欧拉判别法(又称 欧拉准则)是用来判定给定的 整数是否是一个 质数的 二次剩余. 目录 1 叙述 2 举例 2.1 例子一:对于给定数,寻找其为二次剩余的模数 2.2 例子二 ...

最新文章

  1. SQLAlchemy简介与入门
  2. 【安富莱原创开源应用第3期】花式玩转网络摄像头之VNC远程桌面版本,稳定运行2年不死机...
  3. 配置lamp+supervisor
  4. Java语言之数组_java语言之数组-----选择排序
  5. ABAP web service schema node的处理
  6. c# 正则表达式 html标签,C#匹配HTML标签,正则表达式谁会?
  7. python视频人脸检测_Python基于OpenCV实现视频的人脸检测
  8. node生成uuid
  9. 题解【luogu2045 方格取数游戏加强版】
  10. C++STL查找,lower_bound()函数和upper_bound()函数的区别
  11. 004 Leaflet 第四个demo 使用自己的图标替换marker图标
  12. PropertyUtils.copyProperties 属性值复制失败
  13. ubuntu使用教程
  14. 卸载xftp7 安装xftp5后,点击xshell中打开xftp快捷按钮,提示“无法打开xftp”
  15. android so strip,用于CMake构建工具链中“strip”命令的Android NDK路径变量
  16. 新华三计算机网络题,1024新华三计算节,以至极之道加速自主创新
  17. 线性可分 线性不可分
  18. 跨境电商必读:什么是社交媒体营销?
  19. 今天,数据库“打工人”告诉你一个秘密
  20. 我们不做看客,只做时代的赋能者—FMI2018人工智能与大数据高峰论坛圆满落幕...

热门文章

  1. js倒计时器可自定义时间和暂停
  2. [含论文+源码等]微信小程序运动减肥+后台管理系统[包运行成功]适合计算机毕业设计Java毕设程序设计
  3. 基于物联网及数字孪生技术的数字农业系统设计与实现
  4. CMMI认证申请简介
  5. 无人值守变电所运维在海南市某住宅区的应用
  6. Fish Li的一些可供下载的资源列表
  7. 1069 微博转发抽奖(20 分) C++
  8. 华为PTN910时钟接口指标
  9. oracle数据库审计os,审计Oracle数据库的使用
  10. 硬盘温度过高烧坏系统无法启动怎么恢复数据