二次剩余,二次同余方程
定义:
对于方程x2≡n(mod  p)  ,  nx^2\equiv n (mod \;p)\;,\;nx2≡n(modp),n为p的二次剩余 , x为该二次同余方程的解
就如字面意思一样 , n就是一个二次项%p后的剩余
应用:
求n%p  ,\sqrt{n}\%p\;,n%p,若n为p的二次剩余 , 那么很明显n%p=x%p\sqrt{n}\%p=x\%pn%p=x%p
简单的说 , 如果该二次同余方程有解,那么n可以在模p的意义下开根号。
二次同余方程求解(%奇素数):
勒让德符号(legender symbol)→(np)\to (\dfrac{n}{p})→(pn)
表示n是否为p的二次剩余 , 1和-1表示是与否 , 0表示n为0的情况
定理 1:
(np)=np−12(mod  p)(\dfrac{n}{p})=n^{\frac{p-1}{2}}(mod\;p)(pn)=n2p−1(modp)
也就是说知道了n和p相当于知道了这个符号的值
定理 2:
若找到一个a使 a2−n=w,且(wp)=−1a^2-n=w , 且(\dfrac{w}{p})=-1a2−n=w,且(pw)=−1
则x=(n+w)p+12x=(n+\sqrt w)^{\frac{p+1}{2}}x=(n+w)2p+1为x2≡n(mod  p)x^2\equiv n(mod \;p)x2≡n(modp)的解
定理3可以证明随意找一个a就有50%的几率符合要求
定理 3:
对于二次同余方程x2≡n(mod  p)x^2\equiv n(mod\;p)x2≡n(modp)有p−12+1\frac{p-1}{2}+12p−1+1个n使此方程有解
本篇博客不进行定理的证明 , 因为过程打出来会过于冗长 , 很多初学者都会对这种一大段的证明心生畏惧 .
代码实现:
#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);}
}
二次剩余,二次同余方程相关推荐
- 【TOJ1132】Square Root,二次同余方程
传送门 写在前面:ACdreamer大神太强辣!希望能达到他一半的高度啊! 思路:ACdreamer's blog 裸题调了好久ORZ 注意:关于(a+√w)^((p+1)/2)的求法,我至今都没太想 ...
- matlab二次同余方程,解同余式ax ≡ c(mod m)
将式子变形为 ax-c=my 可以看出原式有解当且仅当线性方程ax-my=c有解 设g = gcd(a, m) 则所有形如ax-my的数都是g的倍数 因此如果g不整除c则原方程无解. 下面假设g整除c ...
- ECC与数论、数论史、代数,二次剩余符号的程序计算,高次剩余,高斯和 2013-03-23 21:52:49
CoCoA 2015-10-9 22:49 Computational Commutative Algebra http://vdisk.weibo.com/s/Fst8dC2oag9yO?categ ...
- 【算法讲18:二次剩余】勒让德符号 | 欧拉判别法 | Cipolla 算法
[算法讲18:二次剩余] Source\mathfrak{Source}Source ⌈\lceil⌈二次剩余⌋\rfloor⌋与⌈\lceil⌈二次非剩余⌋\rfloor⌋ ⌈\lceil⌈二次互反 ...
- 二次剩余推理及其求解过程
定义: \quad给出一个式子x2≡n(modp)x^2≡n(mod p)x2≡n(modp),再给出nnn和ppp,如果能求得一个x满足该式子,即xxx满足x2=n+kp,k∈Zx^2=n+kp,k ...
- 格雷通路 算法 java,Java算法与数据结构教程
北上广容不下肉身, 三四线放不下灵魂, 程序员里没有穷人, 有一种土豪叫 算法工程师. 程序 = 数据结构 + 算法 程序是为了解决实际问题而存在的.然而为了解决问题,必定会使用到某些数据结构以及设计 ...
- kk_想要学习的知识
2018/4/27 计算几何 一.简介 计算几何属于ACM算法中比较冷门的分类,在省赛中只在前几年考察过,这两年还没有考过,而且和高精度计算一样,遇到题目主要靠套模板,因此对题意的理解至关重要,而且往 ...
- 尹成学院区块链 Go 学习大纲-取得大纲试看视频联系微信yinchengak48
网址:http://www.1cxy.net GO技术交流QQ群:254416566 所处阶段 主讲内容 技术要点 学习目标 第一阶段Go语言开发入门实战 1.Go语言介绍及开发环境搭建 1.Go语言 ...
- 巅峰极客2022初赛 部分题解
文章目录 Crypto point-power strange curve Misc easy_Forensic Lost 巅峰极客2022初赛,团队共解决7道题,合计2234分,排名第11位,晋级复 ...
最新文章
- 【新】欢庆网自动搜索请柬console方法,面对多种网站改版的情况
- 人工智能在牙科医疗领域是一片蓝海
- Yolov5身份证检测——C++ OpenCV DNN推理
- 并发基础(七):Thread 类的sleep()、yeild()、join()
- 本周阅读清单:从NeurIPS 2020到EMNLP 2020
- 火焰效果材质实现_利用噪音图制作一个纸张燃烧的效果
- 使用共享网口方式访问BMC管理控制器
- 面向对象-多态的实现
- matlab 3sls,几种常用的计量经济学软件
- 层次分析法原理及计算过程详解
- AI绘画升温、AI写作降温,AIGC玩“变脸”
- matlab中全局变量的作用域,【转载】Matlab的global变量
- 【C#】Winform常用属性和事件笔记大全(入门者参考)
- 【Cubase11】音乐工作站:宿主软件 - 基础入门笔记
- android授权新浪微博 服务端,android应用关于新浪微博授权登陆解决方案
- 捋一捋python日期时间处理(下)
- checkpoint NGFW 实验(一)
- Windows SubSystem for Linux(WSL)设置默认和设置默认登陆用户
- Visual Studio Ultimate 2013 下载地址+序列号
- 华尔街人必读40本金融佳作