[二次剩余]求解二次剩余
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); }
相关文章推荐
- Timus1132(二次剩余方程求解)
- Timus1132(二次剩余方程求解)
- [求解二次剩余 数论技巧 随机化] Ural 1132 Square Root
- 二次剩余方程求解
- poj1808--二次剩余
- HDU-6128 Inverse of sum(二次剩余/公式)
- 二次剩余学习笔记
- hdu3589 Jacobi symbol(二次剩余 数论题)
- 利用中国剩余定理加速解密算法求解
- [zoj 3774]Power of Fibonacci 数论(二次剩余 拓展欧几里得 等比数列求和)
- [zoj 3774]Power of Fibonacci 数论(二次剩余 拓展欧几里得 等比数列求和)
- POJ 1808 (用欧拉准则计算勒让德符号 ,入门题) (二次剩余)
- 有限域的二次剩余与x^2+y^2=c的解的个数
- 中国剩余定理求解同余线性方程组—(互素和非互素的情况)
- URAL 1132 Square Root 暴力枚举,二次剩余.
- centos6.4 做nat出现tcp二次握手无法正常转译返回问题(icmp,udp可以正常通信)。求解
- POJ 1006 Biorhythms 正规中国剩余定律求解
- 51nod-1014 X^2 Mod P(二次剩余。。求解决)
- 3月12日 二次剩余(shanks解法)
- Strange Way to Express Integers(扩展欧几里得+乘法逆元+中国剩余定理求解非互质的模线性方程组)