首页 > 其他分享 >二次剩余

二次剩余

时间:2023-02-09 17:46:11浏览次数:37  
标签:剩余 ch frac 二次 ans equiv

二次剩余

定义

对于同余方程 \(x^2 \equiv n \pmod p\) 有解,则称 \(n\) 为二次剩余,否则 \(n\) 为非二次剩余,其中 \(p\) 为奇素数。

欧拉准则

用于判断一个数 \(n\) 是否为二次剩余。
当 \(n^{\frac{p-1}{2}} \equiv 1\) 时,\(n\) 为二次剩余;否则为非二次剩余。
由费马小得 \(n^{p - 1} \equiv 1\pmod p\),所以 \(n^{\frac{p-1}{2}} \equiv\) \(1\)或\(-1\)。
设 \(n \equiv g^k\),\(g\) 为 \(p\) 的原根,那么 \(g^{k * \frac{p - 1}{2}} \equiv 1\),所以必有\(p-1|k*\frac{p-1}{2}\),所以 \(k\) 为偶数,有\(g^{\frac{k}{2}}\)存在,所以\(n\)为二次剩余。
若\(n\)为二次剩余,那么带入解得\(n^{\frac{p-1}{2}}\equiv (x^2)^{\frac{p-1}{2}} \equiv x^{p-1} \equiv 1\)。
所以二者等价。

Cipolla

用于求解方程,我们找到一个\(x\)使得\(x^2 - n\)是非二次剩余,设 \(i^2 \equiv x^2 - n\),类似于复数的定义。
由定义得 \(i^p\equiv i (i^2)^{\frac{p - 1}{2}}\equiv -i\),\((a+b)^p\equiv a^p + b^p\)
则\((x + i)^{p+1} \equiv (x+i)(x^p + i^p)\equiv x^2 - i^2 \equiv n\)
所以\((x+i)^{\frac{p+1}{2}}\)和其相反数为方程两解。

Code
#include<cstdio>
#include<iostream>
#include<algorithm>
#include<ctime>
#define IN inline
#define LL long long
using namespace std;
int n, P, T; LL C;

IN int read() {
	int t = 0,res = 0; char ch = getchar();
	for (; !isdigit(ch); ch = getchar()) t |= (ch == '-');
	for (; isdigit(ch); ch = getchar()) res = (res << 3) + (res << 1) + (ch ^ 48);
	return t ? -res : res;
}
struct CP{
	LL x, y;
	CP operator * (const CP &z) const{
		return CP{(x * z.x % P + y * z.y % P * C % P) % P, (x * z.y % P + y * z.x % P) % P};
	}
};
LL fpow(int x, CP y) {
	CP res = CP{1, 0};
	for (; x; x >>= 1, y = y * y)
		if (x & 1) res = res * y;
	return res.x;
}
bool check(LL x){return fpow(P - 1 >> 1, CP{x, 0}) == 1;}
int main() {
	srand(time(NULL)), T = read();
	for (; T; T--) {
		n = read(), P = read();
		if (!n){puts("0"); continue;}
		if (!check(n)){puts("Hola!"); continue;}
		LL x = rand() % P;
		while (!x || check((x * x % P - n + P) % P)) x = rand() % P;
		C = (x * x % P - n + P) % P;
		LL ans = fpow(P + 1 >> 1, CP{x, 1});
		if (P - ans < ans) ans = P - ans;
		printf("%lld %lld\n", ans, P - ans);
	}
}

标签:剩余,ch,frac,二次,ans,equiv
From: https://www.cnblogs.com/nibabadeboke/p/17106439.html

相关文章

  • Revit二次开发之获取墙体立面轮廓 (未剪切、连接状态)
    大家都知道,我们从Element.Geometry中获取的都是被剪切、连接之后的几何实体了,那么,如果我们想获取墙体被其他柱、墙、楼板、门窗剪切、连接之前的几何轮廓呢?通过ExporterI......
  • 二次供水远程监测方案
    ​行业现状随着城镇化步伐的加快,用于城市二次供水的无负压供水设备正被居民楼、小区广泛使用。但由于居民楼与小区在各城市中广泛分布,因此,如何实时有效地监控及管理全城甚至......
  • DataX插件二次开发指南
    一、DataX为什么要使用插件机制?从设计之初,DataX就把异构数据源同步作为自身的使命,为了应对不同数据源的差异、同时提供一致的同步原语和扩展能力,DataX自然而然地采用了框......
  • 全流程搞清楚 Kubernetes API 的使用,可进行业务二次开发对接 k8s 调用,详细图文说明以
    全流程搞清楚KubernetesAPI的使用,可进行业务二次开发对接k8s调用,详细图文说明以及常见问题整理。使用CLI(如curl)或GUI(如postman)HTTP客户端调用KubernetesAPI有很多理由......
  • 中国剩余定理
    【模板】中国剩余定理(CRT)/曹冲养猪题目描述自从曹冲搞定了大象以后,曹操就开始捉摸让儿子干些事业,于是派他到中原养猪场养猪,可是曹冲满不高兴,于是在工作中马马虎虎,有一次......
  • 剩余系 与 完全剩余系 与 简化剩余系
    剩余系:由关于模m同余的数的集合,每一个集合叫做关于模mmm同余的剩余系比如模5剩余系:<Mod5=0><Mod_5=0><Mod5=0>:0,5,10,15…<Mod5=1><Mod_5=1><Mod5=1>:1,6,7,1......
  • SQL注入-二次注入
    SQL注入-二次注入-dnslog注入二次注入二次注入一般是用于白盒测试、黑盒测试就算是找到注入也没办法攻击。使用sqlilabs-less24-post登陆框&二次注入演示在原来数据库......
  • SQL注入-二次注入
    SQL注入-二次注入-dnslog注入二次注入二次注入一般是用于白盒测试、黑盒测试就算是找到注入也没办法攻击。使用sqlilabs-less24-post登陆框&二次注入演示在原来数据库......
  • axios二次封装,mock前端模拟后端接口
    axios二次封装封装request,然后不用每次遇到接口就使用axios进行调用接口。封装一个基地址,然后每次调用接口的时候,只用写出来自己的函数方法就好。我们基于脚手架进行封装......
  • DALSA工业相机SDK二次开发(图像采集及保存)C#
    一,首先先配置生成项目,根据官方文档步骤来:这个没啥好说的,一步步照做就是了,就最后一步,开始我没重视,最后代码写完测试的时候还真的遇到问题了,一直出这样的错: 查了官方文......