二次剩余求解问题

二次剩余求解问题

x 2 a ( m o d p ) x^2\equiv a\pmod p 对应 x x 的解。

应用:可以用 x x 表示 a ( m o d p ) \sqrt{a}\pmod p 下的值。

先上个代码,有时间再开坑。

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N=1e3+5,M=2e4+5,inf=0x3f3f3f3f,mod=1e9+9;
#define mst(a) memset(a,0,sizeof a)
#define lx x<<1
#define rx x<<1|1
#define reg register
#define PII pair<int,int>
#define fi first
#define se second
#define pb push_back
ll ksm(ll a,ll n){
	ll ans=1;
	while(n){
		if(n&1) ans=ans*a%mod;
		a=a*a%mod;
		n>>=1; 
	}
	return ans;
}
ll Qres(ll a){	//求解a模p下的二次剩余对应的x的解. 
	if(!a) return 0;
	ll b=(rand()<<14^rand())%mod;//随机模p下的二次非剩余 
	while(ksm(b,(mod-1)/2)!=mod-1) b=(rand()<<14^rand())%mod;
	ll s=mod-1,t=0,inv=ksm(a,mod-2),f=1;
	while(s%2==0) s>>=1,t++,f<<=1;
	ll x=ksm(a,(s+1)/2);t--,f>>=1;
	while(t){
		f>>=1;
		if(ksm(x*x%mod*inv%mod,f)!=1) x=x*ksm(b,s)%mod;
		t--,s<<=1;
	}
	return min(x,mod-x);
}
int main(){
	printf("%lld\n",Qres(5));
	return 0;
}

猜你喜欢

转载自blog.csdn.net/weixin_45750972/article/details/107555923