二次剩余与Cipolla算法

若存在x,使得
x2≡a(modp)x^2\equiv a \pmod{p}x2≡a(modp)
成立且a不是p的倍数,则称a为模p的二次剩余。
下文只讨论p为奇素数的情况。

1、模p二次剩余的个数
对于一个素数p,p的二次剩余有(p-1)/2个,非二次剩余有(p-1)/2个。
因为有(p−x)2≡x2(modp)(p-x)^2\equiv x^2 \pmod{p}(p−x)2≡x2(modp),所以在[1,(p-1)/2]范围内即可得到模p的所有二次剩余数,只需要证明在[1,(p-1)/2]范围内x2 两两不相等即可。
假设存在x,y∈[1,p−12]x,y \in[1,\frac{p-1}{2}]x,y∈[1,2p−1​],有x2≡y2(modp)x^2\equiv y^2\pmod{p}x2≡y2(modp),则有
x2−y2≡0(modp)(x+y)(x−y)≡0(modp)x^2-y^2\equiv 0\pmod{p}\newline (x+y)(x-y)\equiv 0\pmod{p}x2−y2≡0(modp)(x+y)(x−y)≡0(modp)
根据x,y的取值范围,显然1<x+y<p1<x+y<p1<x+y<p,又因为x≠y且−p<x−y<px\ne y且-p<x-y<px​=y且−p<x−y<p,所以上述等式不成立。

2、勒让德符号
勒让德符号,或二次特征,是一个由阿德里安-马里·勒让德在1798年尝试证明二次互反律时引入的函数。具体形式为
(np)={1,n为p的二次剩余−1,n不为p的二次剩余0,n为p的倍数\left (\frac{n}{p}\right)= \left\{\begin{matrix} 1,n为p的二次剩余\\ -1,n不为p的二次剩余\\ 0,n为p的倍数 \end{matrix}\right.(pn​)=⎩⎨⎧​1,n为p的二次剩余−1,n不为p的二次剩余0,n为p的倍数​

3、欧拉判别准测
(np)≡np−12(modp)\left (\frac{n}{p} \right )\equiv n^{\frac{p-1}{2}}\pmod{p} (pn​)≡n2p−1​(modp)
n为p的二次剩余当且仅当np−12≡1(modp)n^{\frac{p-1}{2}}\equiv 1\pmod{p}n2p−1​≡1(modp)
n为p的非二次剩余当且仅当np−12≡−1(modp)n^{\frac{p-1}{2}}\equiv -1\pmod{p}n2p−1​≡−1(modp)

证明(基于费马小定理):
xp−1≡1(modp)(xp−12−1)(xp−12+1)≡1(modp)x^{p-1}\equiv 1\pmod{p}\newline (x^{\frac{p-1}{2}}-1)(x^{\frac{p-1}{2}}+1)\equiv1\pmod{p}\newlinexp−1≡1(modp)(x2p−1​−1)(x2p−1​+1)≡1(modp)

所以有xp−12≡1(modp)x^{\frac{p-1}{2}}\equiv 1 \pmod{p}x2p−1​≡1(modp)或xp−12≡−1(modp)x^{\frac{p-1}{2}}\equiv -1 \pmod{p}x2p−1​≡−1(modp),显然两者不能同时成立。
当有xp−12≡1(modp)x^{\frac{p-1}{2}}\equiv 1 \pmod{p}x2p−1​≡1(modp)成立时:
由于p是素数,所以p一定存在一个原根g,使得gt≡x(modp)g^t\equiv x\pmod{p}gt≡x(modp)。
故有gt∗p−12≡1(modp)g^{t*\frac{p-1}{2}}\equiv 1 \pmod{p}gt∗2p−1​≡1(modp),又因为ordp(g)=p−1ord_p(g)=p-1ordp​(g)=p−1,所以有(p−1)∣(t∗p−12)(p-1)|({t*\frac{p-1}{2}})(p−1)∣(t∗2p−1​)。
故t2>=1且2∣t\frac{t}{2}>=1且2|t2t​>=1且2∣t,令i=t/2,则gt≡g2∗i≡x(modp)g^t\equiv g^{2*i}\equiv x\pmod{p}gt≡g2∗i≡x(modp)

证毕。

4、Cipolla算法
该算法可以解决形如x2≡n(modp)x^2\equiv n \pmod{p}x2≡n(modp)之类的方程。

算法流程:
(1)、首先找到一个数a,使得a2-n为模p的一个非二次剩余,即(a2−n)p−12≡−1(modp)(a^2-n)^{\frac{p-1}{2}}\equiv -1\pmod p(a2−n)2p−1​≡−1(modp)。因为模p的非二次剩余与二次剩余均有(p-1)/2个,所以用随机取值的方法根据欧拉判别准则可以很快的找出符合条件的数a。
(2)、构建一个复数域,令i2=a2−ni^2=a^2-ni2=a2−n,那么有ip−1≡−1(modp)i^{p-1}\equiv -1 \pmod pip−1≡−1(modp)。那么方程的其中一个解为(a+i)p+12(a+i)^{\frac{p+1}{2}}(a+i)2p+1​,此过程可以用快速幂去优化。

证明:
(a+i)p+12≡ap+12+ip+12≡(ap+1+ip+1)12≡(a2+i2)12≡n12\begin{aligned}(a+i)^{\frac{p+1}{2}}\ &\equiv a^{\frac{p+1}{2}}+i^{\frac{p+1}{2}}\\ &\equiv(a^{p+1}+i^{p+1})^{\frac{1}{2}}\\&\equiv (a^2+i^2)^{\frac{1}{2}}\\ &\equiv n^{\frac{1}{2}} \end{aligned}(a+i)2p+1​ ​≡a2p+1​+i2p+1​≡(ap+1+ip+1)21​≡(a2+i2)21​≡n21​​
所以有x≡(a+i)p+12≡n12(modp)x\equiv (a+i)^{\frac{p+1}{2}}\equiv n^{\frac{1}{2}}\pmod px≡(a+i)2p+1​≡n21​(modp)

另外一解即为x′=p−xx'=p-xx′=p−x

模板题(Luogu5491)

代码如下:

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
struct Complex{ll a;ll b;Complex(ll x,ll y):a(x),b(y){}
};
ll w;
Complex complex_mul(Complex x,Complex y,ll p)
{Complex ans(0,0);ans.a=((x.a*y.a%p+x.b*y.b%p*w%p)%p+p)%p;ans.b=((x.a*y.b%p+x.b*y.a%p)%p+p)%p;return ans;
}
ll qpow_real(ll a,ll n,ll p)
{ll ans=1;while(n){if(n&1)ans=ans*a%p;a=a*a%p;n>>=1;}return ans;
}
ll qpow_imag(Complex b,ll n,ll p)
{Complex ans(1,0);while(n){if(n&1)ans=complex_mul(ans,b,p);b=complex_mul(b,b,p);n>>=1;}return ans.a%p;
}
ll Cipolla(ll n,ll p)
{n%=p;if(p==2)return n;if(qpow_real(n,(p-1)/2,p)==p-1)return -1;ll a;while(1){a=rand()%p;w=((a*a%p-n)%p+p)%p;if(qpow_real(w,(p-1)/2,p)==p-1)break;}Complex l(a,1);return qpow_imag(l,(p+1)/2,p);
}
int main(void)
{int t;srand(time(NULL));ll n,p;scanf("%d",&t);while(t--){scanf("%lld%lld",&n,&p);if(n==0){printf("0\n");continue;}ll ans=Cipolla(n,p);if(ans==-1)printf("Hola!\n");else{ll t=(p-ans)%p;if(t==ans)printf("%lld\n",ans);else {if(t>ans)printf("%lld %lld\n",ans,t);else printf("%lld %lld\n",t,ans);}}}return 0;
}

二次剩余与Cipolla算法相关推荐

  1. 【算法讲18:二次剩余】勒让德符号 | 欧拉判别法 | Cipolla 算法

    [算法讲18:二次剩余] Source\mathfrak{Source}Source ⌈\lceil⌈二次剩余⌋\rfloor⌋与⌈\lceil⌈二次非剩余⌋\rfloor⌋ ⌈\lceil⌈二次互反 ...

  2. 二次剩余Cipolla算法学习小记

    Preface 今天zz大神给我们讲数论和代数,然后后面讲了几个超级神的算法.CipollaCipolla算是其中一个吧.貌似国内直接查名字还没有什么资料,查二次剩余的算法有ACdreamer简略的介 ...

  3. 【学习笔记】OI模板整理

    CSP2019前夕整理一下模板,顺便供之后使用 1. 数据结构 1.1. 虚树 描述: 给定树上的\(k\)个关键点,构建出一棵虚树,只有关键点和任意两个关键点的LCA会被保留,且原树上的祖先关系和虚 ...

  4. 非素数模下的二次剩余

    非素数模下的二次剩余 InstructionInstructionInstruction 二次剩余定义为,一个数aaa,如果不是ppp的倍数且模ppp同余于某个数的平方,则称 aaa为模ppp的二次剩 ...

  5. jiedai算法模板合集(正在肝2021.8.15)

    文章目录 基础模板 常用板子 数学题常用板子 输出挂 fread快读 高精度 分数类 打表压缩 基数排序 杂项 数据结构 树状数组 一维树状数组 二维树状数组 线段树 主席树 线段树合并/裂开 吉司机 ...

  6. 【更新完毕】《算法竞赛中的初等数论》(ACM / OI / MO)前言、后记、目录索引(十五万字符的数论书)

    整理的算法模板合集: ACM模板 点我看算法全家桶系列!!! 实际上是一个全新的精炼模板整合计划 <算法竞赛中的初等数论>的全部内容的 Portable Document Format 版 ...

  7. 学习笔记第五十节:原根相关与二次剩余

    正题 原根相关 定义 群:非空集合 G 上定义了一种二元运算,满足封闭性.结合 律.单位元.逆元. 环:非空集合 R 上定义了加法和乘法,在加法下构成交换 群,满足乘法结合律.分配律. 域:非零元素都 ...

  8. 数学基础4 Euler函数 二次剩余 米拉质数测试 波拉德的罗 类欧几里得算法 Stern-Brocot树

    主要写于2018.9 欧拉函数 奇偶性 2∣φ(n)⇔n≠22|\varphi(n)\Leftrightarrow n =\not 22∣φ(n)⇔n≠​2 约数拆分 φ(pq)=φ(p)φ(q) ...

  9. 《数论概论》读书笔记 第23章 二次剩余

    什么叫二次剩余,其实就是对于给定的p(p∈P)和np(p∈P)和n,如果有xx满足x2≡n(modp)x^2≡n(\mod p),那么nn在模pp意义下就是二次剩余.其实就是模意义下能否开根号. 我们 ...

最新文章

  1. [CSS3]环形进度条
  2. alm系统的使用流程_840D sl系统授权管理
  3. java中拼写xml
  4. Struts2 Date类型转换问题
  5. python 操作RabbitMQ
  6. Python的虚拟环境virtualenv
  7. RHCE之DHCP配置详解
  8. 软件测试-测试用例的经典例子
  9. java返回语句_Java中return的语句
  10. ftp文件下载工具,三个非常好使的ftp文件下载工具
  11. 解决:Data truncation: Data too long for column ‘XXX‘ at row 1
  12. IText生成PDF 加粗字体的代码例子
  13. 安卓巴士精选Android开发教程
  14. xilinx apu ,rpu特点 及通信
  15. html与jsp、jsp与jsp之间的交互
  16. 清华教授:多年以来,我对我的学生都不太满意
  17. 思科三层交换机开启ipv6路由功能_思科路由器配置 IPv6 和 OSPFv3 路由
  18. 如何使用RSA 对数据加解密和签名验签?一篇文章带你搞定
  19. 6秒了解给kindle传书
  20. mysql 聚簇索引 和聚簇索引 (二级索引)的 那些事

热门文章

  1. kubernetes 之 pod 调度策略(一)
  2. Matlab中对于矩阵数据的读取顺序(即矩阵的维度顺序)
  3. php的ip探针,ip签名探针
  4. signature=e55c5074cb656f0e3d5cfb5e611e9be0,VB AES 字符串和文件加密
  5. 初步使用fiddler
  6. jquery双击事件
  7. 论文参考文献排板小技巧 wordr 插件
  8. 二战风云怎么修改服务器,《二战风云》主城该如何建设 主城区建设技巧详解...
  9. 计算机的影视后期论文,影视后期制作中计算机多媒体技术论文
  10. 74ls192/74ls193中文资料介绍-引脚图-真值表-工作原理