前言

在有些时候,我们会需要求解这样的问题x2≡a(modp)x^2\equiv a\pmod{p}x2≡a(modp)
给定aaa求是否有xxx满足这个式子,若有r则称a是模p的二次剩余
若没有满足条件的xxx,则称a是模p的非二次剩余
然而在一些题目中,我们既要判定它是否是模p的二次剩余,也要判断其值,本文就对此进行一些探究

对于所有模数

二次剩余数量

我们发现a2≡(p−a)2(modp)a^2\equiv (p-a)^2\pmod pa2≡(p−a)2(modp)
所以满足条件的二次剩余数量不可能超过⌊n2⌋+1\left\lfloor\frac n2\right\rfloor+1⌊2n​⌋+1

不同模数下的二次剩余

模数为偶质数

显然偶质数只有一个,那就是2
显然000和111都是222的二次剩余

模数为奇质数

对于判定模数为奇素数时的情况
我们定义勒让德符号:
(ap)={+1如果a̸≡0(modp)且有整数x满足x2≡a(modp)−1如果没有整数x满足x2≡a(modp)0如果a≡0(modp)\left(\frac ap\right)=\begin{cases}+1&如果a\not\equiv0\pmod p且有整数x满足x^2\equiv a\pmod p\\ -1&如果没有整数x满足x^2\equiv a\pmod p\\ 0&如果a\equiv0\pmod p \end{cases}(pa​)=⎩⎪⎨⎪⎧​+1−10​如果a̸​≡0(modp)且有整数x满足x2≡a(modp)如果没有整数x满足x2≡a(modp)如果a≡0(modp)​

我们先引入欧拉准则
这是一个用来判定的经典准则(其实勒让德符号的定义准确来说就是从这里定义的)
这里规定,当模数为奇素数的时候···(此处省略解释)
直接代入勒让德符号成为
(ap)=ap−12(modp)\left(\frac ap\right)=a^{\frac{p-1}2}\pmod p(pa​)=a2p−1​(modp)


  • 口糊一下证明
    由于模数是奇素数,所以我们就可以使用拉格朗日定理(kkk次多项式至多kkk个根)
    所以对于任意一个aaa,满足x2≡a(modp)x^2\equiv a\pmod px2≡a(modp)的xxx数量至多为222
    现在我们把a=0a=0a=0的情况扔掉,因为a=0a=0a=0显然满足上式
    只考虑a≠0a\neq0a̸​=0的情况
    首先我们有费马小定理ap−1≡1(modp)a^{p-1}\equiv1\pmod pap−1≡1(modp)
    由于ppp是奇数,我们开始推式子
    移项得
    ap−1−1≡0(modp)a^{p-1}-1\equiv0\pmod pap−1−1≡0(modp)
    因式分解得
    (ap−12−1)(ap−12+1)≡0(modp)(a^{\frac{p-1}2}-1)(a^{\frac{p-1}2}+1)\equiv0\pmod p(a2p−1​−1)(a2p−1​+1)≡0(modp)
    我们发现,如果有xxx满足x2≡a(modp)x^2\equiv a\pmod px2≡a(modp),那么根据费马小定理xp−1≡1(modp)x^{p-1}\equiv1\pmod pxp−1≡1(modp)
    将xxx用aaa代替
    ap−12≡1(modp)a^{\frac{p-1}2}\equiv1\pmod pa2p−1​≡1(modp)
    如果没有满足条件的xxx,这说明
    ap−12̸≡1(modp)a^{\frac{p-1}2}\not\equiv1\pmod pa2p−1​̸​≡1(modp)
    则根据上面的方程,两项中至少有一项为000
    则ap−12≡−1(modp)a^{\frac{p-1}2}\equiv-1\pmod pa2p−1​≡−1(modp)
    证毕

现在我们已经会如何判定了,然而OI中更多的是要求这个值(大雾)
假设我们现在已经判定完了,发现aaa是模ppp的二次剩余
我们现在要求x2≡a(modp)x^2\equiv a\pmod px2≡a(modp)
移项得a−1x2≡1(modp)a^{-1}x^2\equiv 1\pmod pa−1x2≡1(modp)
设xix_ixi​满足(a−1xi2)2i≡1(modp)(a^{-1}x_i^2)^{2^i}\equiv 1\pmod p(a−1xi2​)2i≡1(modp)
我们发现x0x_0x0​就是我们要求的值
我们提出p−1p-1p−1所有的222因子:p−1=2tsp-1=2^tsp−1=2ts
我们得到一个已知的解了:xt−1=as+12x_{t-1}=a^{\frac{s+1}2}xt−1​=a2s+1​
为什么?
代入(a−1xt−12)2t−1≡(a−1as+1)2t−1≡a2t−1s≡ap−12≡1(modp)(a^{-1}x_{t-1}^2)^{2^{t-1}}\equiv(a^{-1}a^{s+1})^{2^{t-1}}\equiv a^{2^{t-1}s}\equiv a^\frac{p-1}2\equiv1\pmod p(a−1xt−12​)2t−1≡(a−1as+1)2t−1≡a2t−1s≡a2p−1​≡1(modp)
如果我们现在能够递推,那就能求答案了
首先我们发现a−1xi2a^{-1}x_i^2a−1xi2​是模ppp意义下的2t2^t2t阶单位根
设a−1xi2=ωia^{-1}x_i^2=\omega_ia−1xi2​=ωi​
我们现在已知xix_ixi​要递推求xi−1x_{i-1}xi−1​
由于ωi2i≡1(modp)\omega_i^{2^i}\equiv1\pmod pωi2i​≡1(modp)
所以ωi2i−1≡±1(modp)\omega_i^{2^{i-1}}\equiv\pm1\pmod pωi2i−1​≡±1(modp)

  • 如果ωi2i−1≡1(modp)\omega_i^{2^{i-1}}\equiv1\pmod pωi2i−1​≡1(modp)
    那么可以进行赋值xi−1=xix_{i-1}=x_ixi−1​=xi​
    *如果ωi2i−1≡−1(modp)\omega_i^{2^{i-1}}\equiv-1\pmod pωi2i−1​≡−1(modp)
    我们现在要找一个λ\lambdaλ使得xi−1=λxix_{i-1}=\lambda x_ixi−1​=λxi​并且满足条件(a−1(λxi)2)2i−1≡1(modp)(a^{-1}(\lambda x_i)^2)^{2^{i-1}}\equiv 1\pmod p(a−1(λxi​)2)2i−1≡1(modp)
    与式子(a−1xi2)2i−1≡−1(modp)(a^{-1}x_i^2)^{2^{i-1}}\equiv -1\pmod p(a−1xi2​)2i−1≡−1(modp)进行联立
    得到λ2i≡−1(modp)\lambda^{2^i}\equiv-1\pmod pλ2i≡−1(modp)
    我们发现等于−1-1−1这个条件非常熟悉
    对于一个非二次剩余bbb,bp−12≡−1(modp)b^{\frac{p-1}2}\equiv-1\pmod pb2p−1​≡−1(modp)
    化一下式子成−1≡bp−12≡b2t−1s≡(b2t−i−1s)2i-1\equiv b^{\frac{p-1}2}\equiv b^{2^{t-1}s}\equiv (b^{2^{t-i-1}s})2^i−1≡b2p−1​≡b2t−1s≡(b2t−i−1s)2i
    所以我们可以直接λ=b2t−i−1smod  p\lambda=b^{2^{t-i-1}s}\mod pλ=b2t−i−1smodp
    至于怎么找这个bbb也非常简单,直接rand即可,由于非二次剩余占比为一半,即T=1+T2T=1+\frac T2T=1+2T​即T=2T=2T=2,所以是O(1)\mathcal O(1)O(1)的
    该算法的总复杂度为O(log2p)\mathcal O(log^2p)O(log2p)
    贴出代码
const int mod=998244353;
template<typename T>
inline int pow(int x,T y)
{rg int res=1;x%=mod;for(;y;y>>=1,x=(ll)x*x%mod)if(y&1)res=(ll)res*x%mod;return res;
}
inline int Quadratic_residue(const int a)
{if(a==0)return 0;int b=(rand()<<14^rand())%mod;while(pow(b,(mod-1)>>1)!=mod-1)b=(rand()<<14^rand())%mod;int s=mod-1,t=0,x,inv=pow(a,mod-2),f=1;while(!(s&1))s>>=1,t++,f<<=1;t--,x=pow(a,(s+1)>>1),f>>=1;while(t){f>>=1;if(pow((int)((ll)inv*x%mod*x%mod),f)!=1)x=(ll)x*pow(b,s)%mod;t--,s<<=1;}return min(x,mod-x);
}

先咕咕咕了,奇质数的比较常用,其它模数没用到所以暂时不写
贴个非常不错的博客的链接
我写这篇博客是因为我看不懂有些他写的内容+没有代码
很详细,感兴趣的可以点击看看


二次剩余及其计算方法相关推荐

  1. Lucas定理:线性求所有逆元的方法

    Miskcoo's Space,版权所有丨如未注明,均为原创 转载请注明转自:http://blog.miskcoo.com/2014/09/linear-find-all-invert 主要绕过费马 ...

  2. ECC与数论、数论史、代数,二次剩余符号的程序计算,高次剩余,高斯和 2013-03-23 21:52:49

    CoCoA 2015-10-9 22:49 Computational Commutative Algebra http://vdisk.weibo.com/s/Fst8dC2oag9yO?categ ...

  3. 信息安全数学基础 Chapter 4——二次剩余与方根

    定义4.1 设m为正整数,若同余式x2≡a(modm),(a,m)=1x^2\equiv a(\mod m),(a,m)=1x2≡a(modm),(a,m)=1,有解,则a称为模m的二次剩余,否则称为 ...

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

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

  5. java 根据圆心计算圆弧上点的经纬度_冲压件展开计算方法(二),转发给每一位冲压人...

     点击↑模具达人教你成模具达人 点击阅读?牛人做了一把实用的夹具,夹的够紧... 接昨天的冲压件展开计算方法,转发给每一位冲压人 4  Z轧展开 4.1两次Z轧成形 图中t为材料厚度,H为Z轧折弯高度 ...

  6. 【合并单元格】纵向合并单元格之前对数组处理【针对饿了么element的table的span-method合并行或列的计算方法】

    <template><el-table :span-method="spanMethod"><el-table-column label=" ...

  7. 自然语言处理(NLP)之gensim中的TF-IDF的计算方法

    自然语言处理(NLP)之gensim中的TF-IDF的计算方法 step 1.  去掉所有文本中都会出现的词 texts = [['这是', '一个', '文本'], ['这是', '第二个', '文 ...

  8. CCD工业相机、镜头倍率及相关参数计算方法

    点击上方"小白学视觉",选择加"星标"或"置顶" 重磅干货,第一时间送达 随着自动化的日益剧增,CCD相机.镜头倍率被提上日程,许多小伙伴们 ...

  9. 核苷酸pi值计算方法

    核苷酸pi值计算方法 哈喽,今天小编给大家分享的是核苷酸pi值计算方法,主要是介绍序列比对(MEGA和MZAFFT版的两种方法)计算pi值(dnasp)的两个步骤,有兴趣大家可以瞅瞅. 一.序列比对 ...

最新文章

  1. elasticsearch简单操作(二)
  2. 处理Http请求Gzip格式响应
  3. LeetCode:二叉树相关应用
  4. List 集合转换为String
  5. Perl文件读写操作
  6. 国内IDC成立SOC安全运营中心
  7. fcn网络训练代码_FCN网络训练 菜鸟版
  8. 程序员在工作中如何快速成长和学习?
  9. SVN报Previous operation has not finished; run 'cleanup'
  10. 最新!2021全球Top 1000计算机科学家h指数发布,中国53人上榜!Bengio总榜第二,韩家炜居华人首位...
  11. 精益创业实战 - 第1章 基本理念
  12. 个人笔记应用 - 思源笔记
  13. [声纹识别]基于MFCC的声纹识别算法
  14. Android新浪微博授权提示:文件不存在 C8998 的终极解决方法
  15. linux下安装hadoop步骤
  16. debian的几个lib源_Linux各个文件夹的主要作用 (源地址
  17. [CF1131F] Asya And Kittens
  18. 关于读书的一些方法--摘自李笑来《人人都能用英语》
  19. Removal【套路DP】
  20. IIS无法下载wgt apk文件问题

热门文章

  1. php中表单输出成绩,js内置对象处理_打印学生成绩单的简单实现
  2. java项目1DVD管理器
  3. 进程调度之8:nanosleep与内核定时器
  4. aardio名字空间库的扩展方法(一)
  5. Android混合开发-(Android与Web的交互)
  6. ZPiE: Zero-knowledge Proofs in Embedded systems
  7. 几个贼吓人的公众号,各个硬核
  8. 实验报告---SAMBA服务器配置
  9. 苏宁安全架构演进及实践——阅读心得
  10. PPT2007无法输入中文