二次剩余(学习笔记)

article/2025/10/29 13:52:18

就是用来求解 x 2 ≡ n   m o d   p x^2\equiv n \bmod p x2nmodp的一个方法

p p p进行分类讨论:

  1. p = 2 p=2 p=2 ,则 x = n x=n x=n
  2. p p p为奇素数
    勒让德符号
    ( a p ) = { 1 a 在 模 p 意 义 下 是 二 次 剩 余 − 1 a 在 模 p 意 义 下 是 非 二 次 剩 余 0 a ≡ 0   m o d   p \begin{pmatrix}\frac{a}{p}\end{pmatrix}=\begin{cases}1&a在模p意义下是二次剩余\\-1&a在模p意义下是非二次剩余\\0&a\equiv 0\bmod p\end{cases} (pa)=110apapa0modp
    有一个定理: ( a p ) ≡ a p − 1 2   m o d   p \begin{pmatrix}\frac{a}{p}\end{pmatrix}\equiv a^{\frac{p-1}{2}}\bmod p (pa)a2p1modp
    证明
    a a a在模 p p p意义下是二次剩余,设 x 2 ≡ a   m o d   p x^2\equiv a\bmod p x2amodp,则有 x p − 1 ≡ 1   m o d   p x^{p-1}\equiv 1\bmod p xp11modp,由费马小定理显然成立
    a a a在模 p p p意义下是非二次剩余,设 x 2 ≡ a   m o d   p x^2\equiv a\bmod p x2amodp,则有 x p − 1 ≡ − 1   m o d   p x^{p-1}\equiv -1\bmod p xp11modp,由费马小定理显然不成立
    a   m o d   p = 0 a\bmod p=0 amodp=0显然成立
    所以可以首先判断是否有解,就用勒让德符号来判断
    第二步需要找到一个 a a a,使得 w = a 2 − n w=a^2-n w=a2n在模 p p p意义下是非二次剩余,
    x = ( a + w ) p + 1 2 x=(a+\sqrt{w})^{\frac{p+1}{2}} x=(a+w )2p+1

    证明
    定理: ( a + b ) p ≡ a p + b p   m o d   p (a+b)^p\equiv a^p+b^p \bmod p (a+b)pap+bpmodp
    证明:(其实可以感性理解 ,可以根据二项式定理展开,在中间的组合数的阶乘中, p p p无法被消掉,因此   m o d   p \bmod p modp一定为 0 0 0,有贡献的只有第一项和最后一项也就是 a p , b p a^p,b^p ap,bp
    证明2:
    在这里插入图片描述
    算法实现:因为大约有一半的数都是非二次剩余,所以可以随机一个 a a a,把 w \sqrt{w} w 当作一个复数单位,定义一个复数运算
    像这样:
struct F{int x,y;F(){}F(const int &xx,const int &yy){x=xx,y=yy;}
};inline F mul(F a,F b,int mod,int w){return F((1LL*a.x*b.x%mod+1LL*a.y*b.y%mod*w%mod)%mod,(1LL*a.x*b.y%mod+1LL*a.y*b.x%mod)%mod);
}

例题:模板题

代码如下:

#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
#include<cmath>
#include<cstdlib>
#include<ctime>
#define LL long long
using namespace std;inline int rd(){int x=0,f=1;char c=getchar();while(c<'0' || c>'9') f=c=='-'?-1:1,c=getchar();while(c<='9' && c>='0') x=x*10+c-'0',c=getchar();return x*f;
}int t,a,n;struct F{int x,y;F(){}F(const int &xx,const int &yy){x=xx,y=yy;}
};inline F mul(F a,F b,int mod,int w){return F((1LL*a.x*b.x%mod+1LL*a.y*b.y%mod*w%mod)%mod,(1LL*a.x*b.y%mod+1LL*a.y*b.x%mod)%mod);
}inline F qpow(F x,int k,int mod,int w){F ret(1,0);while(k){if(k&1) ret=mul(ret,x,mod,w);x=mul(x,x,mod,w); k>>=1;} return ret;
}inline int Qpow(int x,int k,int mod){int ret=1;while(k){if(k&1) ret=1LL*ret*x%mod;x=1LL*x*x%mod; k>>=1;} return ret%mod;
}inline int solve(int n,int mod){if(mod==2) return 1;if(Qpow(n,(mod-1)>>1,mod)==mod-1) return -1;while(1){int a=rand()%mod;int w=(1LL*a*a%mod+mod-n)%mod;if(Qpow(w,(mod-1)>>1,mod)==mod-1){F ans=qpow(F(a,1),(mod+1)>>1,mod,w);return ans.x;}}
}int main(){scanf("%d",&t);while(t--){scanf("%d%d",&a,&n); a%=n;int ans=solve(a,n);if(ans==-1) puts("No root");else{int ans2=n-ans;if(ans>ans2) swap(ans,ans2);if(ans==ans2) printf("%d\n",ans);else printf("%d %d\n",ans,ans2);}}return 0;
}
  1. p p p为奇素数的幂
    这里参考了这个博客
    求解 x 2 ≡ a &VeryThinSpace; m o d &VeryThinSpace; p n x^2\equiv a\bmod p^n x2amodpn g c d ( n , p ) = 1 gcd(n,p)=1 gcd(n,p)=1,下面只介绍方法
    先求出方程 x 2 ≡ a &VeryThinSpace; m o d &VeryThinSpace; p x^2\equiv a\bmod p x2amodp的一个解 r r r,那么进一步有在这里插入图片描述
    我们知道
    在这里插入图片描述
    也就是
    在这里插入图片描述
    可证明 g c d ( t , p ) = 1 , g c d ( u , p ) = 1 gcd(t,p)=1,gcd(u,p)=1 gcd(t,p)=1,gcd(u,p)=1,最终得到
    在这里插入图片描述
    这里由于 p n p^n pn不是素数,所以求逆元用扩展欧几里得算法即可。
  2. p p p为合数
    p p p质因数分解,问题变成了 3 3 3中的内容,然后解出各答案用中国剩余定理合并即可。

http://chatgpt.dhexx.cn/article/sxtC1Zyv.shtml

相关文章

(转载)二次剩余(知识总结+板子整理)

思路来源 https://blog.csdn.net/kele52he/article/details/78897187&#xff08;二次剩余&#xff09; https://blog.csdn.net/stevensonson/article/details/85845334&#xff08;二次剩余&#xff09; https://blog.csdn.net/skywalkert/article/details/52591343?locat…

二次同余方程(二次剩余)

文章目录 一、介绍1.定义2.定理 二、判别1.勒让德符号&#xff08;Legendre Symbol&#xff09;2.欧拉判别准则&#xff08;Eulers criterion&#xff09;(1)内容(2)证明(3)注意 三、 x 2 ≡ n ( m o d x^2≡n(mod x2≡n(mod p ) p) p)——奇波拉算法&#xff08;Cipollas alg…

二次剩余 数论 勒让德

在数论中&#xff0c;特别在同余理论里&#xff0c;一个整数对另一个整数的二次剩余&#xff08;英语&#xff1a;Quadratic residue&#xff09;指的平方除以得到的余数。 当存在某个&#xff0c;式子成立时&#xff0c;称“是模的二次剩余” 当对任意&#xff0c;不成立时&…

二次剩余

title: 二次剩余 date: 2019-08-27 00:10:46 tags: 数论 一、定义&#xff08;Quadratic_residue&#xff09; 一个整数X对另一个整数p的二次剩余 d 注意这边的取模是 X 2 X^2 X2 和 d 都要对p取模噢 eg. 3 2 ≡ 2 ( m o d 7 ) 3^2≡2 (mod\ 7) 32≡2(mod 7),我们称 2是7的…

win10增加美式键盘

仅为做记录 我的系统为win10专业版 1809 首先进入语言首选项 选择添加语言 选择英语&#xff08;美国&#xff09; 之后选择拼写、键入和键盘设置 在输入的最下面选择高级键盘设置 选择语言栏选项 更改按键顺序选项中可以修改切换语言的快捷键 本质上是切换语言种类而不是输…

删除Win10英语国际键盘的方法

按下winR打开运行&#xff0c;键入regedit点击确定打开注册表 在注册表中依次展开&#xff1a;HKEY_CURRENT_USER\Keyboard Layout\Preload 改成下面的样子&#xff1a; 这个表示默认输入法是英语-美式键盘&#xff0c;接下来是中文-美式键盘。 注1&#xff1a;可以右键创…

win10添加美式键盘_戴尔笔记本win10降win7教程

现在大多数人电脑操作系统都是win10&#xff0c;但是很多人由于各种原因&#xff0c;比如部分软件限制&#xff0c;还是不得不继续使用win7操作系统&#xff0c;有些朋友自己安装win7的时候会发现各种问题&#xff0c;始终安装不上&#xff0c;接下来我整理下win10降win7的办法…

超详细window10添加美式键盘

转自https://blog.csdn.net/qq_41139830/article/details/80500841 打开控制面板->添加语言 然后点击图中的添加语言 选择英语 选择英语(美国) 然后回到下图这个界面&#xff0c;就会发现多出了美式键盘 &#xff08;如果美式键盘在上面&#xff0c;就要将其下移&#xff0…

win10切换输入法快捷键_软件快捷键失灵,可能是你没有安装美式键盘

工程类用到的软件&#xff0c;比如Altium designer、keil、ccs、Quartus ii等基本都是老外开发的&#xff0c;他们的工作的键盘模式都是美式键盘&#xff0c;快捷键也相应的是美式键盘下的快捷键&#xff0c;这就导致我们自己在使用这些软件时&#xff0c;要注意选择键盘类型&a…

Win10怎么设置默认输入法为美式英文键盘

默认的输入法就是进入系统后一打字就是你想要的那一种输入法。WIN10的默认输入法是微软拼音输入法&#xff0c;它是一个中文的输入法&#xff0c;用起来不是很方便。 相对来说&#xff0c;大部分人都是习惯输入法默认的状态是英文的。这样可以在输入网址&#xff0c;或是在码字…

win10添加美式键盘_在win10中使用多种键盘布局,你知道如何操作吗

Windows10操作系统允许用户使用多种键盘布局&#xff0c;用户可以在初始设置过程中添加一个或多个键盘布局(也称为“开箱即用”体验(OOBE))。但是&#xff0c;如果你配置了错误的布局&#xff0c;或者以后需要键入不同的语言&#xff0c;则可以随时添加和更改键盘配置。 一般情…

Win10添加美式键盘

为什么80%的码农都做不了架构师&#xff1f;>>> WIN8也可以这实现&#xff01; ###在“中文”内添加美式键盘需要修改注册表。 打开CMD&#xff0c;输入 regedit 打开注册表编辑器&#xff1b; 转到 HKEY_CURRENT_USER/Keyboard Layout/Substitutes&#xff0c; 新…

win10添加美式键盘_WIN10系统必做的6个优化,优化完电脑性能飙升。

现在越来越多的人开始用WIN10系统了&#xff0c;而对于习惯了使用WIN7系统的用户来说&#xff0c;刚刚开始接触WIN10系统&#xff0c;确实会有点不适应&#xff0c;特别是使用过程中一会儿弹出一个对话框&#xff0c;一会儿一个什么通知的&#xff0c;不厌其烦&#xff0c;接下…

win10添加美式键盘_Win10自带的这6款软件,90%的人都不知道,但个个都好用到爆!...

什么&#xff0c;微软还出过我不知道的软件&#xff1f; 你别不信&#xff0c;这篇文章三顿就要给大家分享6个微软官方出品的软件神器&#xff0c;而且全都无需安装无需下载&#xff0c;它们就藏在你的操作系统里&#xff0c;一起来看看吧&#xff01; 微软拼音输入法 一说到输…

win10添加美式键盘_Windows10添加中文美式键盘,传统语言栏,采用ctrl+shift切换输入法...

Windows10添加中文美式键盘&#xff0c;采用ctrlshift切换输入法 用XP和Windows 7习惯后 用Windows 10 发现切换输入法快捷键变了&#xff0c;变成Windows键空格&#xff0c;现在觉得不适应&#xff0c;遂改回来。 而且还有一个很蛋疼的问题&#xff0c;这个在Windows8时代就有…

WIn11多出美式键盘如何删除

一、操作步骤 1.进入设置页 右键点击左边底部的输入法处&#xff0c;点击更多键盘设置 2.进入语言和区域添加语言 进入到如图所示页面&#xff0c;点击添加语言 添加语言后才可以删除键盘 3.安装英语(美国)语言 搜索到以后点击下一步&#xff0c;可以不选手写等功能安装&…

如何彻底删除windows10自带的美式键盘

1.先左键点击右下角的输入法&#xff0c;然后在点击语言首选项 2.进入语言设置&#xff0c;选择添加语言 3.在搜索框中输入english&#xff0c;下拉滚动条选择 英语&#xff08;美国&#xff09;English(United States)选项&#xff0c;然后点击下一页 4.只选择安装语言包即…

win10解决已禁用输入法和隐藏中文简体美式键盘

环境 win10 21h1 win10解决已禁用输入法 设置->时间和语言->语言->拼写、键入和键盘设置->高级键盘设置隐藏中文简体美式键盘 reg add HKEY_CURRENT_USER\SOFTWARE\Microsoft\CTF\HiddenDummyLayouts /v 00000804 /t REG_SZ /d 00000804参考文章 https://soci…

有效删除Win10英语(美式键盘)输入法

原文转载自百度经验&#xff0c;作者ID砸牛顿的苹果&#xff0c;原文链接https://jingyan.baidu.com/article/e4511cf39d7c382b855eaf62.html。 1.进入语言选项以后&#xff0c;默认英文键盘是无法删除的。我们需要添加一个英文语言包才可以删除&#xff0c;点击添加语言。 2…

计算机怎样设置默认美式键盘,完美:如何在win10系统中将默认输入法设置为美式键盘...

我相信朋友在操作计算机系统时会遇到很多问题. 将win10系统的默认输入法设置为美式键盘非常普遍. 我的朋友和我的朋友已经遇到了win10系统. 将美式键盘的默认输入法设置很多次&#xff0c;因此&#xff0c;我编写了一个更简单的设置教程&#xff0c;用于在win10系统中将美式键盘…