您的位置:首页 > 其它

[二次剩余]求解二次剩余

2017-08-01 10:44 651 查看

Description

求解x2≡n(modp)。p是一个奇质数。

Solution

由费马小定理np−1≡1(modp)所以np−12≡±1(modp)由欧拉准则(np)≡np−12(modp)其中(np)为勒让德符号。因为x≡n12(modp),所以有xp−1≡np−12≡1(modp)。即(np)=⎧⎩⎨⎪⎪1−10n在模p意义下是二次剩余n在模p意义下不是二次剩余n≡0(modp)设k=a2−n,ω=k√则该方程的解为x≡(a+ω)p+12(modp)证明:若k是该模意义下的非二次剩余,则wp−1=np−12=−1同时:(a+b)p≡ap+bp(modp)则x21≡≡≡≡≡≡≡≡(a+ω)p+1(a+ω)p(a+ω)(ap+ωp)(a+ω)(ap−1a+ωp−1ω)(a+ω)(a−ω)(a+ω)a2−ω2a2−(a2−n)n(modp)另一解为x2≡−x1(modp)

如何找到这个k呢。因为非二次剩余的个数大约有一半,随机几次即可。

后面去实现了一下,发现要重新定义一个复数域Fp2,然后就好啦。

struct Complex {
ll r, i;
Complex(ll _r = 0, ll _i = 0):r(_r), i(_i) {}
inline Complex operator +(ll x) {
return Complex((x + r) % P, i);
}
inline Complex operator *(Complex a) {
ll rr = (a.r * r % P + w * a.i % P * i % P + P * 3) % P,
ii = (a.i * r % P + a.r * i % P) % P;
return Complex(rr, ii);
}
};

inline ll Qr(ll x, ll p) {
if (Pow(x, (P - 1) / 2) == P - 1) return -1;
if (Pow(x, (P - 1) / 2) == 0) return 0;
ll a;
Complex k(0, 1);
while (true) {
a = rand();
if (Pow((a * a - x + P) % P, (P - 1) / 2) == P - 1) break;
}
w = (a * a - x + P) % P;
return Pow(k + a, (P + 1) / 2);
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: