二次剩余与Cipolla算法

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

二次剩余与Cipolla算法

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

1、模p二次剩余的个数
对于一个素数p,p的二次剩余有(p-1)/2个,非二次剩余有(p-1)/2个。
因为有 ( p − x ) 2 ≡ x 2 ( m o d p ) (p-x)^2\equiv x^2 \pmod{p} (p−x)2≡x2(modp),所以在[1,(p-1)/2]范围内即可得到模p的所有二次剩余数,只需要证明在[1,(p-1)/2]范围内x2 两两不相等即可。
假设存在 x , y ∈ [ 1 , p − 1 2 ] x,y \in[1,\frac{p-1}{2}] x,y∈[1,2p−1​],有 x 2 ≡ y 2 ( m o d p ) x^2\equiv y^2\pmod{p} x2≡y2(modp),则有
x 2 − y 2 ≡ 0 ( m o d p ) ( x + y ) ( x − y ) ≡ 0 ( m o d p ) x^2-y^2\equiv 0\pmod{p}\newline (x+y)(x-y)\equiv 0\pmod{p} x2−y2≡0(modp)(x+y)(x−y)≡0(modp)
根据x,y的取值范围,显然 1 < x + y < p 1<x+y<p 1<x+y<p,又因为 x ≠ y 且 − p < x − y < p x\ne y且-p<x-y<p x​=y且−p<x−y<p,所以上述等式不成立。

2、勒让德符号
勒让德符号,或二次特征,是一个由阿德里安-马里·勒让德在1798年尝试证明二次互反律时引入的函数。具体形式为
( n p ) = { 1 , n 为 p 的 二 次 剩 余 − 1 , n 不 为 p 的 二 次 剩 余 0 , n 为 p 的 倍 数 \left (\frac{n}{p}\right)= \left\{\begin{matrix} 1,n为p的二次剩余\\ -1,n不为p的二次剩余\\ 0,n为p的倍数 \end{matrix}\right. (pn​)=⎩⎨⎧​1,n为p的二次剩余−1,n不为p的二次剩余0,n为p的倍数​

3、欧拉判别准测
( n p ) ≡ n p − 1 2 ( m o d p ) \left (\frac{n}{p} \right )\equiv n^{\frac{p-1}{2}}\pmod{p} (pn​)≡n2p−1​(modp)
n为p的二次剩余当且仅当 n p − 1 2 ≡ 1 ( m o d p ) n^{\frac{p-1}{2}}\equiv 1\pmod{p} n2p−1​≡1(modp)
n为p的非二次剩余当且仅当 n p − 1 2 ≡ − 1 ( m o d p ) n^{\frac{p-1}{2}}\equiv -1\pmod{p} n2p−1​≡−1(modp)

证明(基于费马小定理):
x p − 1 ≡ 1 ( m o d p ) ( x p − 1 2 − 1 ) ( x p − 1 2 + 1 ) ≡ 1 ( m o d p ) x^{p-1}\equiv 1\pmod{p}\newline (x^{\frac{p-1}{2}}-1)(x^{\frac{p-1}{2}}+1)\equiv1\pmod{p}\newline xp−1≡1(modp)(x2p−1​−1)(x2p−1​+1)≡1(modp)

所以有 x p − 1 2 ≡ 1 ( m o d p ) x^{\frac{p-1}{2}}\equiv 1 \pmod{p} x2p−1​≡1(modp)或 x p − 1 2 ≡ − 1 ( m o d p ) x^{\frac{p-1}{2}}\equiv -1 \pmod{p} x2p−1​≡−1(modp),显然两者不能同时成立。
当有 x p − 1 2 ≡ 1 ( m o d p ) x^{\frac{p-1}{2}}\equiv 1 \pmod{p} x2p−1​≡1(modp)成立时:
由于p是素数,所以p一定存在一个原根g,使得 g t ≡ x ( m o d p ) g^t\equiv x\pmod{p} gt≡x(modp)。
故有 g t ∗ p − 1 2 ≡ 1 ( m o d p ) g^{t*\frac{p-1}{2}}\equiv 1 \pmod{p} gt∗2p−1​≡1(modp),又因为 o r d p ( g ) = p − 1 ord_p(g)=p-1 ordp​(g)=p−1,所以有 ( p − 1 ) ∣ ( t ∗ p − 1 2 ) (p-1)|({t*\frac{p-1}{2}}) (p−1)∣(t∗2p−1​)。
故 t 2 > = 1 且 2 ∣ t \frac{t}{2}>=1且2|t 2t​>=1且2∣t,令i=t/2,则 g t ≡ g 2 ∗ i ≡ x ( m o d p ) g^t\equiv g^{2*i}\equiv x\pmod{p} gt≡g2∗i≡x(modp)

证毕。

4、Cipolla算法
该算法可以解决形如 x 2 ≡ n ( m o d p ) x^2\equiv n \pmod{p} x2≡n(modp)之类的方程。

算法流程:
(1)、首先找到一个数a,使得a2-n为模p的一个非二次剩余,即 ( a 2 − n ) p − 1 2 ≡ − 1 ( m o d p ) (a^2-n)^{\frac{p-1}{2}}\equiv -1\pmod p (a2−n)2p−1​≡−1(modp)。因为模p的非二次剩余与二次剩余均有(p-1)/2个,所以用随机取值的方法根据欧拉判别准则可以很快的找出符合条件的数a。
(2)、构建一个复数域,令 i 2 = a 2 − n i^2=a^2-n i2=a2−n,那么有 i p − 1 ≡ − 1 ( m o d p ) i^{p-1}\equiv -1 \pmod p ip−1≡−1(modp)。那么方程的其中一个解为 ( a + i ) p + 1 2 (a+i)^{\frac{p+1}{2}} (a+i)2p+1​,此过程可以用快速幂去优化。

证明:
( a + i ) p + 1 2   ≡ a p + 1 2 + i p + 1 2 ≡ ( a p + 1 + i p + 1 ) 1 2 ≡ ( a 2 + i 2 ) 1 2 ≡ n 1 2 \begin{aligned}(a+i)^{\frac{p+1}{2}}\ &\equiv a^{\frac{p+1}{2}}+i^{\frac{p+1}{2}}\\ &\equiv(a^{p+1}+i^{p+1})^{\frac{1}{2}}\\&\equiv (a^2+i^2)^{\frac{1}{2}}\\ &\equiv n^{\frac{1}{2}} \end{aligned} (a+i)2p+1​ ​≡a2p+1​+i2p+1​≡(ap+1+ip+1)21​≡(a2+i2)21​≡n21​​
所以有 x ≡ ( a + i ) p + 1 2 ≡ n 1 2 ( m o d p ) x\equiv (a+i)^{\frac{p+1}{2}}\equiv n^{\frac{1}{2}}\pmod p x≡(a+i)2p+1​≡n21​(modp)

另外一解即为 x ′ = p − x x'=p-x x′=p−x

模板题(Luogu5491)

代码如下:

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
struct Complex{
	ll a;
	ll b;
	Complex(ll x,ll y):a(x),b(y){}
};
ll w;
Complex complex_mul(Complex x,Complex y,ll p)
{
	Complex ans(0,0);
	ans.a=((x.a*y.a%p+x.b*y.b%p*w%p)%p+p)%p;
	ans.b=((x.a*y.b%p+x.b*y.a%p)%p+p)%p;
	return ans;
}
ll qpow_real(ll a,ll n,ll p)
{
	ll ans=1;
	while(n)
	{
		if(n&1)ans=ans*a%p;
		a=a*a%p;
		n>>=1;
	}
	return ans;
}
ll qpow_imag(Complex b,ll n,ll p)
{
	Complex ans(1,0);
	while(n)
	{
		if(n&1)ans=complex_mul(ans,b,p);
		b=complex_mul(b,b,p);
		n>>=1;
	}
	return ans.a%p;
}
ll Cipolla(ll n,ll p)
{
	n%=p;
	if(p==2)return n;
	if(qpow_real(n,(p-1)/2,p)==p-1)return -1;
	ll a;
	while(1)
	{
		a=rand()%p;
		w=((a*a%p-n)%p+p)%p;
		if(qpow_real(w,(p-1)/2,p)==p-1)break;
	}
	Complex l(a,1);
	return qpow_imag(l,(p+1)/2,p);
}
int main(void)
{
	int t;
	srand(time(NULL));
	ll n,p;
	scanf("%d",&t);
	while(t--)
	{
		scanf("%lld%lld",&n,&p);
		if(n==0){
			printf("0\n");
			continue;
		}
		ll ans=Cipolla(n,p);
		if(ans==-1)printf("Hola!\n");
		else{
			ll t=(p-ans)%p;
			if(t==ans)printf("%lld\n",ans);
			else {
				if(t>ans)printf("%lld %lld\n",ans,t);
				else printf("%lld %lld\n",t,ans);
			}
		}
	}
	return 0;
}
GNSS接收机性能测试指标详解:TTFF、位置精度、灵敏度等关键参数如何评估 本文详细解析了GNSS接收机性能测试的关键指标,包括首次定位时间(TTFF)、位置精度、灵敏度等,帮助工程师系统评估接收机性能。通过多频段协同定位和载波相位测试等技术,提升定位精度至亚米级。同时,介绍了灵敏度测试的极限挑战和授时精度的专业测试方案,为GNSS接收机的性能优化提供实用指导。 阅读详情

相关推荐

CXL Virtual Hierarchy (VH) Enumeration理解

在 CXL 3.0 协议中,CXL Virtual Hierarchy (VH) Enumeration 是一种针对 CXL 虚拟层级(Virtual Hierarchy) 设计的设备枚举机制,它允许软件将物理连接的 CXL 设备抽象为多个逻辑层级(虚拟层级),从而实现更灵活的资源管理和拓扑扩展。与传统的 PCIe 枚举相比,CXL VH 枚举在协议特性、拓扑抽象和资源分配机制上有显著差异。本质:VH 是一个逻辑上的设备层级结构,可能与物理连接拓扑不同。

Summer的博客 1002

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

信数第四章

CoLin的pwn小屋 937

数仓项目6.0(一)

数据同步工具种类繁多,大致可分为两类,一类是以DataX、Sqoop为代表的基于Select查询的离线、批量同步工具,另一类是以Maxwell、Canal为代表的基于数据库数据变更日志(例如MySQL的binlog,其会实时记录所有的insert、update以及delete操作)的实时流式同步工具。DataX的使用,用户只需根据数据的数据源和目的地选择相应的Reader和Writer,并将Reader和Writer的信息配置在一个json文件中,然后执行如下命令提交数据同步任务即可。

qq_58551342的博客 2847

二次剩余及其计算方法

前言 在有些时候,我们会需要求解这样的问题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...

zhouyuheng2003的博客 1万+

STM32F103C8T6 + GY-906红外测温:手把手教你用CubeMX和HAL库搞定IIC驱动(附完整工程)

本文详细介绍了如何使用STM32F103C8T6和GY-906红外测温传感器(基于MLX90614芯片)实现非接触式温度测量。从STM32CubeMX工程创建、HAL库驱动适配到温度数据采集与处理,提供完整的开发流程和常见问题解决方案,帮助开发者快速掌握红外测温技术。

weixin_29188043的博客 254

VoLTE吞字断续优化方案

网络侧通过各节点探针的数据采集,能够进行RTP和RTCP包的分析,确定各节点的上行或下行丢包情况。1.基于测试语音分析,每2秒中大约8个字,每个字约10个RTP语音包。通话过程中,语音有短暂停顿,收音段听语音中会出现“吞字/断续现象”2.连续丢3~5个RTP以上就可能会出现吞字断续的感觉。下行评价的丢包问题,很难有效指导定界定位分析,无从下手。2.部分终端可能存在RTCP不反馈,导致无法获取丢包。1.语音包为UDP包,无反馈,终端无法判定是否丢包。终端可依据自身的调度反馈或弃包进行上行丢包判决。

m0_73503557的博客 1512

知识点 - 二次剩余

知识点 - 二次剩余 解决问题类型: 求模意义下的平方根 一些公式推导有用 定义 q被称作模n的二次剩余quadratic residue 当且仅当存在x使得: x2=q(mod n) x^2=q(mod\ n) x2=q(mod n) 否则q被称作二次非剩余quadratic nonresidue 性质 两个二次剩余的乘积还是二次剩余 模n的二次剩余的数量不会超过n/2 + ...

qq_41848675的博客 4338

SAP公司间外协业务流程以及配置说明

SAP公司间外协业务流程以及配置说明

竹大的博客 7168

二次剩余

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

Nismilesucc的学习札记 3552

[特殊字符] RK3588 平台上基于 Panfrost 的 Mesa 驱动编译全过程

摘要: 本文详细记录了在RK3588平台(Ubuntu 20.04 aarch64)上编译基于Panfrost的Mesa驱动的全过程。内容包括:1)系统依赖安装;2)libdrm编译;3)Mesa配置参数优化;4)LLVM 15与SPIRV工具链的安装方法;5)SPIRV-Tools版本问题的解决方案;6)最终编译命令及常见错误处理。关键点在于正确设置工具链路径(PKG_CONFIG_PATH)和版本匹配(LLVM 15对应SPIRV-LLVM-Translator v15.0.0),推荐将组件安装在/op

梁俊星的博客 941

Python爬虫实战:使用最新技术爬取路透社新闻数据

网络爬虫(Web Crawler)是一种自动获取网页内容的程序,是搜索引擎的重要组成部分。随着大数据和人工智能技术的发展,爬虫技术在数据采集、市场分析、舆情监控等领域发挥着越来越重要的作用。requests:同步HTTP请求库aiohttp:异步HTTP请求库:HTML解析库lxml:高效的HTML/XML解析库selenium:浏览器自动化工具playwright:现代浏览器自动化工具pandas:数据处理和分析库scrapy:专业的爬虫框架:生成随机User-Agentredis:缓存和分布式爬虫支持。

2201_76125261的博客 1204

二次剩余学习笔记

若∃x\exists x∃x,使得x2≡nmodpx2≡nmodp,则称nnn为二次剩余,否则为二次非剩余。

qq_43041641的博客 712

乐鑫科技 EchoEar 喵伴修改自定义唤醒词的方法 EchoEar喵伴、唤醒词修改、ESP32、AI萌宠、智能音箱、开发者指南

标签:乐鑫科技、EchoEar喵伴、唤醒词修改、ESP32、AI萌宠、智能音箱、开发者指南大家好,我是一名前端开发工程师,最近在玩乐鑫科技推出的时,发现它不仅萌趣十足,还能进行全双工语音交互、多模态识别,甚至能识别你的情绪和与你互动。EchoEar 喵伴是由乐鑫科技和火山引擎扣子大模型团队合作开发的,它使用乐鑫的芯片方案(ESP32 系列)+ 火山引擎扣子大模型,支持 WiFi 连接和本地处理,长记忆能力可以让它记住用户的偏好与习惯。

代码简单说 Vue、JAVA、PHP、Node.js 熟练运用,接口、架构、性能全搞定。 1887

二次剩余的判定及Cipolla算法

二次剩余 ppp是奇素数。所有的运算都是在群Zp∗Z_{p}^{*}Zp∗​中的运算。方程x2=a≠0x^2=a \neq 0x2=a̸​=0问是否有解,以及解是什么?若有解,aaa就是模ppp的二次剩余;若无解,则aaa就是模ppp的非二次剩余。 a=0a=0a=0,显然只有唯一解x=0x=0x=0. a≠0a\neq 0a̸​=0,有解等价于ap−12=1a^{\frac{p-1}{2...

稻云麦花的博客 1599

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

二次剩余之 Cipolla 算法学习笔记

文章目录前言二次剩余问题一些定理定理 1定理 2定理 3定理 4(欧拉判定准则)Cipolla 算法与其正确性证明 前言 曾经,在数个月以前,我学过一波二次剩余…… 只不过当时是被 SaInT7 所胁迫,而且时间仓促,精神不集中,最终只解得皮毛。 现在我重新学了一遍,略作总结。 二次剩余问题 已知同余方程 x2≡n(modp)x^2 \equiv n \pmod px2≡n(modp),给定 n,...

smarthehe的博客 776

efm32 入门.pdf

本PDF共计22页,介绍的是操作驱动API,下载与否自己斟酌。

二次剩余Cipolla算法

欧拉准则 欧拉准则:设p为奇素数,则 ap−12≡(ap)(mod&nbsp;p) a^{\frac{p-1}{2}}\equiv (\frac{a}{p})(mod\ p) a2p−1​≡(pa​)(mod&nbsp;p) 其中ap\frac{a}{p}pa​为勒让德符号 证明:假设a为二次剩余,如a≡b2(mod&nbsp;p)a\equiv b^2(mod\ p)a≡b2(mod&nbsp;...

FLY_WHITE的博客 1275

lwip-2.0.3

lwip是瑞典计算机科学院(SICS)的Adam Dunkels 开发的一个小型开源的TCP/IP协议栈。实现的重点是在保持TCP协议主要功能的基础上减少对RAM 的占用。

二次剩余定理及Cipolla算法入门到自闭

二次剩余定义: 在维基百科中,是这样说的:如果q等于一个数的平方模 n,则q为模 n 意义下的二次剩余。例如:x2≡n(modp)。否则,则q为模n意义下的二次非剩余。 Cipolla算法:一个解决二次剩余强有力的工具,用来求得上式的x的一个算法。 需要学习的数论及数学基础:勒让德符号、欧拉判别准则和复数运算。 勒让德符号:判断n是否为p的二次剩余,p为奇质数。 欧拉定...

apple50052014的博客 622

二次剩余Cipolla算法学习笔记

\(Cipolla\)好像是个很厉害的东西……虽然我觉得这东西直接用离散对数+\(bsgs\)艹过去也可以…… 如无特殊说明,以下均默认\(p\)为模数,且\(p\)为奇素数 如无特殊说明,以下均认为运算在\(\mathbb{F}_p\)下进行(元素为\(0\)到\(p-1\)这\(p\)个元素,运算为模\(p\)意义下的加减乘除) 定义 二次剩余 对于\(P,n\),若存在\(x\),满足 \[...

weixin_33941350的博客 270

【学习笔记】二次剩余& Cipolla 算法

cipolla算法实现

m0_73601603的博客 784

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

【算法讲18:二次剩余】Source\mathfrak{Source}Source⌈\lceil⌈二次剩余⌋\rfloor⌋与⌈\lceil⌈二次非剩余⌋\rfloor⌋⌈\lceil⌈二次互反律⌋\rfloor⌋⌈Cipolla⌋\lceil\mathfrak{Cipolla}\rfloor⌈Cipolla⌋ 算法引入CipollaCipollaCipolla 算法CipollaCipollaCipolla 算法的证明代码中怎么求 (a+ω)(p+1)/2(a+\omega)^{(p+1)/2}(a+ω)

溢流眼泪的博客 2946

二次剩余 Cipolla算法

欧拉准则 \(a\)是\(p\)的二次剩余等价于\(a^{\frac{p-1}{2}}\equiv 1\pmod p\),\(a\)不是\(p\)的二次剩余等价于\(a^{\frac{p-1}{2}}\equiv -1\pmod p\)。 Cipolla 若\(a^2-n\)不是\(p\)的二次剩余,则\(p\)的二次剩余为\((a+\sqrt{a^2-n})^\frac{p+1}{2}...

ailiumai1945的博客 359

【模板】【数论】二次剩余Cipolla算法,离散对数BSGS 算法

Cipolla LL ksm(LL k,LL n) { LL s=1; for(;n;n>>=1,k=k*k%mo) if(n&1) s=s*k%mo; return s; } namespace number { LL D; struct Z { LL x,y; Z(LL _x=0,LL _y=...

weixin_33726318的博客 220
上一篇: 关于BSGS算法
下一篇: 扩展中国剩余定理(EXCRT)
WedsonLin
博客等级 码龄7年 1粉丝 49原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值