二次剩余
二次剩余
若方程
先提出几个关键的定理(下面的
定理 1:若
证明:若
-
若
,则 ,与 是 次非剩余矛盾。 -
若
,则 ( 为奇质数, 一定存在)。这与 是 次非剩余矛盾。
定理 2:在模
证明:设
于是得出
发现
即
这说明若
于是
定理 3:模
证明:设
勒让德符号
勒让德符号可以方便我们研究二次剩余:
定义(勒让德符号):
根据 定理 3 可以得出,
Euler 判别条件
判定二次剩余只需要求出对应的勒让德符号的值,接下来引入 Euler 判别条件,用于求解
利用二次互反律的方法在 Competive Programming 中不优于 Euler 判别条件,故不作介绍。
定理 5(Euler 判别条件):设
证明:若
若
若
于是
Cipolla 算法
Cipolla 算法可以求解
- 随机寻找一个
,满足 是模 的二次非剩余。 - 令
,这里由于 是模 的二次非剩余,需要扩域计算(类似复数)。 - 求出
即为方程的一个解。
通过证明以下引理来证明算法的时间复杂度和正确性:
引理 1:第一步期望
证明:列出关于
移项可得
由于
在模
不难发现,一个使方程有正整数解的
当
引理 2:
证明:拆开:
对前面一项用二项式定理展开,注意到
由于
于是
引理 3:
证明:若存在一个
把“实部”和“虚部”分别放到两边:
这和算法第一步要求的
于是 Cipolla 算法可以在期望
实现
#include <bits/stdc++.h>
using namespace std;
struct Complex {
Complex() {r=i=0;};
Complex(int v) {r=v;i=0;}
Complex(int r,int i):r(r),i(i) {}
int r,i;
};
int sq,mod;
mt19937 rng(random_device{}());
Complex operator+(const Complex &a,const Complex &b) {return Complex((a.r+b.r)%mod,(a.i+b.i)%mod);}
Complex operator*(const Complex &a,const Complex &b) {
return Complex((1ll*a.r*b.r%mod+1ll*a.i*b.i%mod*sq%mod)%mod,(1ll*a.r*b.i%mod+1ll*a.i*b.r%mod)%mod);
}
Complex qpow(Complex a,int b) {
Complex res=1;
for(;b;b>>=1,a=a*a) {
if(b&1) res=res*a;
}
return res;
}
int qpow(int a,int b,int mod) {
int res=1;
for(;b;b>>=1,a=1ll*a*a%mod) if(b&1) res=1ll*res*a%mod;
return res;
}
bool check(int n,int p) {return n?qpow(n,(p-1)/2,p)==1:true;}
int Cipolla(int n,int p) {
mod=p; n%=mod;
if(n==0) return 0;
uniform_int_distribution<int> gen(0,p-1);
int a=gen(rng);
while(check((1ll*a*a%mod+mod-n)%mod,p)) a=gen(rng);
sq=(1ll*a*a%mod+mod-n)%mod;
return qpow(Complex(a,1),(p+1)/2).r;
}
int main() {
ios::sync_with_stdio(false);
cin.tie(nullptr); cout.tie(nullptr);
int T=0; cin>>T;
while(T--) {
int n,p; cin>>n>>p;
if(!check(n,p)) cout<<"Hola!"<<"\n";
else {
int res=Cipolla(n,p);
if(res>p-res) res=p-res;
cout<<res;
if(res) cout<<" "<<p-res;
cout<<"\n";
}
}
return 0;
}
本文作者:Transparent
本文链接:https://www.cnblogs.com/xzmxzm/p/cipolla.html
版权声明:本作品采用知识共享署名-非商业性使用-禁止演绎 2.5 中国大陆许可协议进行许可。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步