Preface

今天zz大神给我们讲数论和代数,然后后面讲了几个超级神的算法。CipollaCipolla算是其中一个吧。貌似国内直接查名字还没有什么资料,查二次剩余的算法有ACdreamer简略的介绍。今天听讲时算是听懂了大半,回来又搞鼓了整个晚上才算完全弄明白。这个算法真的是从头到尾都是脑洞,太神了!
详细的解释见维基百科。


Paper

首先我们要弄清楚什么叫二次剩余,其实就是对于给定的p(p∈P)p(p\in\mathbb P)和nn,如果有xx满足x2≡n(modp)x^2\equiv n\pmod p,那么nn在模pp意义下就是二次剩余。说白了就是模意义下能否开根号。
我们只讨论pp为奇素数的情况。
我们先定义Fp\mathbb {F}_p,这是一个数域,其实就是00到p−1p-1这pp个数与模pp意义下加减乘除运算构成的集合。

  • 定理1:对于x2≡n(modp)x^2\equiv n\pmod p,总共有p−12\frac{p-1}{2}个的nn能使该方程有解(将n=0n=0情况除去,由于该情况显然有x=0x=0)。
  • 证明:我们只用考虑所有x2x^2。如果存在不同的两个数uu、vv,它们的平方在模pp意义下同余,那么显然有p|(u2−v2)p|(u^2-v^2)。由平方差公式p|(u+v)(u−v)p|(u+v)(u-v)。显然pp不可能整除u−vu-v,因此pp整除u+vu+v,因此u+v≡0(modp)u+v\equiv0\pmod p。这个结论反过来也是成立的,因此共有p−12\frac{p-1}{2}种互不相同的平方,显然对应了所有有解的nn,而且同一个nn还一定存在两个互为相反数的解。

然后我们还要知道一个神奇的东西叫做勒让德符号(Legendre symbolLegendre\ symbol)
它是这样定义的

(ap)=⎧⎩⎨1,−1,0,a在模p意义下是二次剩余a在模p意义下是非二次剩余a≡0(modp)

\left(\frac{a}{p}\right)= \begin{cases} 1,&a\text{在模$p$意义下是二次剩余}\\ -1,&a\text{在模$p$意义下是非二次剩余}\\ 0,&a\equiv0\pmod p \end{cases}
那我们怎么求该符号的值呢?

  • 定理2:(ap)≡ap−12(modp)\left(\frac{a}{p}\right)\equiv a^{\frac{p-1}{2}}\pmod p
  • 证明:
    • 当aa在模pp意义下是二次剩余时,令x2≡a(modp)x^2\equiv a\pmod p,那么就有xp−1≡1(modp)x^{p-1}\equiv1\pmod p,由费马小定理,显然xx存在。
    • 当aa在模pp意义下不是二次剩余时,依旧令x2≡a(modp)x^2\equiv a\pmod p,那么就有xp−1≡−1(modp)x^{p-1}\equiv-1\pmod p,由费马小定理,显然xx不存在。
    • 当a≡0(modp)a\equiv0\pmod p时显然满足。

那么我们就可以通过快速幂计算勒让德符号来判定一个数在模pp意义下是否是二次剩余了。
有了这些理论基础,我们可以开始算法了。
首先我们要明确我们要求x2≡n(modp)x^2\equiv n\pmod p的解xx(假定nn在模pp意义下是二次剩余,由定理1有两个互为相反数的可行解)。
算法一开始的时候我们首先要通过不断地随机(你没有听错,就是随机)出一个数aa,使得(a2−np)\left(\frac{a^2-n}{p}\right)为−1-1,也就是不能开根号。先不要管为什么是a2−na^2-n,我们来算算随机次数的期望。还是由定理1,一共有p−12\frac{p-1}{2}个数满足勒让德记号值为−1-1,因此一次随机得到结果的概率为p−12p\frac{p-1}{2p}。当pp够大的时候,这个概率是趋近于12\frac{1}{2}的。那么列一下期望的树状图,就可以得到期望次数为22。
那么我们得到这个不能开根号的数之后要干什么呢?我们要干一件丧心病狂的事情,那个数不能开根号,我们非要给它一个域Fp2\mathbb{F}_{p^2}让它可以开根号(类比−1−−−√\sqrt{-1}所在的复数域)。我们将a2−n−−−−−√\sqrt{a^2-n}定义为这个域的“虚数单位元”(类比i=−1−−−√i=\sqrt{-1}),设它为ω\omega,那么这个“复数域”Fp2\mathbb{F}_{p^2}的数就一定可以表达为a+bωa+b\omega(类比复数域a+bia+bi,bωb\omega相当于虚部)。
那么我们将复数域的四则运算法则全部类比到Fp2\mathbb F_{p^2}上面,显然它依然满足封闭性、交换律、结合律以及分配律的,还存在加法零元和乘法逆元(貌似符合环的定义)。具体看下图。

那么它就是一个合法的数域。
然后我们定义这个数域有什么用呢?
x≡(a+ω)p+12(modp)x\equiv (a+\omega)^\frac{p+1}{2}\pmod p
啊?就这么简单???
我们首先来证明一些东西:

  • 定理3:ωp≡−ω(modp)\omega^p\equiv -\omega\pmod p
  • 证明:ωp≡ω×ωp−1≡ω×(ω2)p−12≡ω×(a2−n)p−12≡−ω(modp)\omega^p\equiv \omega\times\omega^{p-1}\equiv\omega\times(\omega^2)^{\frac{p-1}{2}}\equiv\omega\times\left(a^2-n\right)^{\frac{p-1}{2}}\equiv-\omega\pmod p
  • 定理4:(a+b)n≡an+bn(modn)(n∈P)(a+b)^n\equiv a^n+b^n\pmod n(n\in P)
  • 证明:使用二项式定理我们能得到
    (a+b)n≡∑i=0nCinaibn−i(modn)

    (a+b)^n\equiv\sum_{i=0}^nC_n^ia^ib^{n-i}\pmod n由于nn是质数,因此当ii不等于00且不等于nn的时候,组合数阶乘公式中的nn是没有办法被消掉的,就会被模成00,因此这些项都是对答案没有贡献的。而i=0i=0或i=ni=n时,我们就分别可以得到ana^n和bnb^n,定理得证。

有了这些定理,我们就可以嘿嘿嘿。

x2≡(a+ω)p+1≡(a+ω)p(a+ω)≡(ap+ωp)(a+ω)≡(a−ω)(a+ω)(注意a是满足费马小定理的,即ap−1≡1(modp))≡a2−ω2≡a2−(a2−n)≡n(modp)

\begin{align} x^2&\equiv(a+\omega)^{p+1}\\ &\equiv(a+\omega)^p(a+\omega)\\ &\equiv(a^p+\omega^p)(a+\omega)\\ &\equiv(a-\omega)(a+\omega)\text{(注意$a$是满足费马小定理的,即$a^{p-1}\equiv1\pmod p$)}\\ &\equiv a^2-\omega^2\\ &\equiv a^2-(a^2-n)\\ &\equiv n\pmod p \end{align}
然后 xx取相反数也是一个解。这时可能有人会问,我们得到的解会在Fp2\mathbb F_{p^2}域上的,但是我们要求的是 Fp\mathbb F_p域的解,也就是说我们所谓的“虚部” ω\omega系数是否可能不为 00。
其实我们不需要担心这个问题,由拉格朗日定理,我们知道在任意一个模p(p∈P)p(p\in\mathbb P)的数域里面,任意一个多项式 f(x)f(x)最多有 deg(f(x))deg(f(x))个根( f(x)≡0(modp)f(x)\equiv0\pmod p的解称为 f(x)f(x)在 Fp\mathbb F_p下的根), degdeg表示多项式的度数,即最大指数。由于 Fp2\mathbb F_{p^2}是对 Fp\mathbb F_p域的扩充, Fp\mathbb F_p域的两根一定在 Fp2\mathbb F_{p^2}内也有效,并且我们知道 x2−nx^2-n在数域 Fp2\mathbb F_{p^2}下的根有两个( x1,x2x_1,x_2),那么 x1,x2x_1,x_2一定也是 Fp\mathbb F_p域下的根,也就是“虚部”系数为 00。
由此问题完美解决,算法时间复杂度貌似是O(log2p)\mathrm O(log_2p)的。


Code

我目前还没有去实现这个算法,我实现了会在这里贴上。


Problems

二次剩余的题目应该不怎么多。这个我会在博客里慢慢更新吧。
zz给我们讲了CodeChef上面一道丧心病狂的BSGSBSGS(离散对数)和CipollaCipolla(二次剩余)连用的题目FN。

二次剩余Cipolla算法学习小记相关推荐

  1. 最小树形图——朱刘算法学习小记

    参考资料: https://www.cnblogs.com/hdu-zsk/p/8167687.html https://www.luogu.com.cn/blog/xiaojiji/solution ...

  2. Berlekamp-Massey算法学习小记

    简介 Berlekamp-Massey算法,简称BM算法,可以在O(N2)O(N^2)O(N2)时间内求解一个数列的最短线性递推式. 教程 一篇讲的很详细的博客 Berlekamp-Massey算法 ...

  3. java 二维卡尔曼滤波_卡尔曼滤波(Kalman filtering)算法学习小记

    动画和视频 一个例子 import numpy as np # 模拟数据 t = np.linspace(1, 100, 100) a = 0.5 position = (a * t ** 2) / ...

  4. 多项式的ln、exp、快速幂和开根学习小记

    不妨又学习了一下多项式的求ln.exp.快速幂和开根操作. 这些操作比之前的求逆更上了一层台阶,应用同样很广. 多项式求逆等知识在我的博客里有讲:多项式的求逆.取模和多点求值学习小记 多项式ln 给出 ...

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

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

  6. 二次剩余与Cipolla算法

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

  7. 积性函数与Dirichlet卷积 学习小记

    前言 首先感谢 XHM 大佬的悉心指导,我懂得了不少~. 链一下他关于这方面的见解.博客--XHM 的Dirichlet卷积 学习小记 一些定义 回归正题,这次我学习了一下狄利克雷卷积方面的知识. 先 ...

  8. python 温度 符号_【火马】Python学习小记01

    Python 学习小记 Life is short,you need Python! 写在前面 自从重新拾起2016年开始注册的公众号"火马编程",我就把TA当作了自己的一块&qu ...

  9. quest3D学习小记2

    quest3D学习小记2 今天主要理解了矩阵变幻关系,以及阴影算法在这里做一个记录. 1.矩阵 主要矩阵要搞清楚的就是自身的坐标系,有世界坐标系,物体坐标系,还有相机坐标系.那么在使用过程中现在主要用 ...

最新文章

  1. 开发者新春回血大礼包助你2021畅行无压力!
  2. react学习(20)---发送参数
  3. C++ opengl 纹理过滤之GL_NEAREST
  4. 1-2 输出N个数的平方和立方值
  5. 深度学习——初识TensorFlow
  6. 【数电】(一) 进制转换编码 原码,反码,补码
  7. 栈的应用c语言计算器思路,请问,用c语言做一个计算器 包括+-*/()的运算 用栈 该怎么做...
  8. php试题多选,php考试题 (选择题).doc
  9. 撩课-Web大前端每天5道面试题-Day4
  10. 与虚拟机和linux的初次接触
  11. pta 计算圆周率(C语言实现)
  12. D盘根目录下的msdia80.dll文件能不能删除?
  13. shader 什么是UV
  14. word怎么设置边距为80磅_word 字体磅数 word怎么设置字体磅数
  15. 农业银行透支卡和信用卡什么关系?2019年农业银行透支卡透支额度?
  16. 无线连接网络找不到计算机组,无线网络连接不见了的4个解决方法!电脑无线网络连接找不到如何解决?...
  17. 《GTA5》揭秘游戏背后的故事
  18. Synctoy2.1通过计划任务备份文件到网络驱动器注销不生效问题
  19. 英文字母间距非常大的问题
  20. IDEA修改Git仓库远端地址,处理服务器ip发生变化的情况

热门文章

  1. Docker 挂载方式启动 Nginx
  2. webSocket介绍及项目实战【在线聊天系统】
  3. ​张雪峰离京:1500万、14年、37岁,北漂生活......
  4. 启动django报错:TypeError: __init__() got an unexpected keyword argument ‘providing_args‘
  5. 华为云主机简介和使用流程
  6. 湖南大学21夏训练四3.相同生日
  7. listagg( )详解
  8. 百度移动生态“头部效应”正在形成
  9. 表达式求值优先级判断
  10. 【已解决】无法初始化设备 PRN