二次剩余入门

article/2025/10/29 13:43:40

昨天训练的时候遇到一道题怎么也不会做,在网上搜了题解之后第一次听说了二次剩余,看了一天各种dalao的博客,在这里总结一下自己所理解的二次剩余及其用法。


1,什么是二次剩余?



2,二次剩余有什么用?


※说白了就是如果该二次同余方程有解,那么n可以在模p的意义下开根号。


3,二次同余方程如何求解?

这一部分内容参考了这两篇文章:

http://blog.csdn.net/a_crazy_czy/article/details/51959546

http://blog.csdn.net/acdreamers/article/details/10182281 

首先,以下解法有一个前提,就是p必须要是奇素数。


接下来我们引入一个新概念:勒让德符号(legender symbol)

它的定义如下


由此再引出一个定理


接下来是最后一个定理

       

         

有了最后一个定理,我们就可以通过随机选择a的值来找到一个满足条件的解。之前的链接里有详细地解释为何可以随机取a的值,总的来说就是找到正解所需的次数的期望只有2。所以随机取a的值可以很快地找到一个解,代码如下。

#include <iostream>   
#include <ctime>
using namespace std;
typedef long long LL;
#define random(a,b) (rand()%(b-a+1)+a)
LL quick_mod(LL a, LL b, LL c) { LL ans = 1; while (b) { if (b % 2 == 1)ans = (ans*a) % c; b /= 2; a = (a*a) % c; }return ans; }LL p;
LL w;//二次域的D值
bool ok;//是否有解struct QuadraticField//二次域
{LL x, y;QuadraticField operator*(QuadraticField T)//二次域乘法重载{QuadraticField ans;ans.x = (this->x*T.x%p + this->y*T.y%p*w%p) % p;ans.y = (this->x*T.y%p + this->y*T.x%p) % p;return ans;}QuadraticField operator^(LL b)//二次域快速幂{QuadraticField ans;QuadraticField a = *this;ans.x = 1;ans.y = 0;while (b){if (b & 1){ans = ans*a;b--;}b /= 2;a = a*a;}return ans;}
};LL Legender(LL a)//求勒让德符号
{LL ans=quick_mod(a, (p - 1) / 2, p);if (ans + 1 == p)//如果ans的值为-1,%p之后会变成p-1。return -1;elsereturn ans;
}LL Getw(LL n, LL a)//根据随机出来a的值确定对应w的值
{return ((a*a - n) % p + p) % p;//防爆处理
}LL Solve(LL n)
{LL a;if (p == 2)//当p为2的时候,n只会是0或1,然后0和1就是对应的解return n;if (Legender(n) == -1)//无解ok = false;srand((unsigned)time(NULL));while (1)//随机a的值直到有解{a = random(0, p - 1);w = Getw(n, a);if (Legender(w) == -1)break;}QuadraticField ans,res;res.x = a;res.y = 1;//res的值就是a+根号wans = res ^ ((p + 1) / 2);return ans.x;
}int main()
{LL n,ans1,ans2;while (scanf("%lld%lld",&n,&p)!=EOF){ok = true;n %= p;ans1 = Solve(n);ans2 = p - ans1;//一组解的和是pif (!ok){printf("No root\n");continue;}if (ans1 == ans2)printf("%lld\n", ans1);elseprintf("%lld %lld\n", ans1, ans2);}
}




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

相关文章

平方剩余(二次剩余)

平方剩余&#xff1a; 设p是奇素数(即大于2的素数)&#xff0c;如果二次同余式 有解&#xff0c;则a称为模p的平方剩余&#xff0c;否则a称为模p的平方非剩余(二次非剩余)(之所以规定p是大于2的素数&#xff0c;是因为p 2时解上面的二次同余式非常容易。 求出p 5&#xff…

二次剩余--欧拉准则

在 数论中&#xff0c; 二次剩余的 欧拉判别法&#xff08;又称 欧拉准则&#xff09;是用来判定给定的 整数是否是一个 质数的 二次剩余。 目录 1 叙述2 举例 2.1 例子一&#xff1a;对于给定数&#xff0c;寻找其为二次剩余的模数2.2 例子二&#xff1a;对指定的质数p…

二次剩余问题x的求解及代码实现(python)

一、问题引入 二次剩余是数论基本概念之一。它是初等数论中非常重要的结果&#xff0c;不仅可用来判断二次同余式是否有解&#xff0c;还有很多用途。C.F.高斯称它为算术中的宝石&#xff0c;他一人先后给出多个证明。 [1] 研究二次剩余的理论称为二次剩余理论。二次剩余理论…

二次剩余(学习笔记)

就是用来求解 x 2 ≡ n &VeryThinSpace; m o d &VeryThinSpace; p x^2\equiv n \bmod p x2≡nmodp的一个方法 对 p p p进行分类讨论&#xff1a; p 2 p2 p2 &#xff0c;则 x n xn xn p p p为奇素数 勒让德符号&#xff1a; ( a p ) { 1 a 在 模 p 意 义 下 是 二…

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

思路来源 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;可以不选手写等功能安装&…