題意:
對於方程x * x = n (mod p)是否有解,p是素數且與n互素
思路:
二次剩餘版題。
感謝acdreamer大神
關於二次剩餘:
概念:x * x = n(mod p),存在解時,x為n關於p的二次剩餘(p是奇素數)
相關定理:
1)n ^ ((p - 1) / 2) = +-1mod(p)
a)費馬小定理知,然後用完全平方差因式分解
2)方程有解當且僅當n ^ (p-1) / 2 = 1mod(p)
a) 3)對於a >= 0 && a < p,若w = a * a - n滿足w關於p沒有二次剩餘,則(a+sqrt(w))^((1+p)/2)為方程的乙個解。
4)方程至多兩個解,且滿足x1 + x2 = p.
演算法步驟:
1)判斷x * x = n (mod p)是否有解
2)列舉a求出合法的w
3)(難理解的地方)由於方程(a+sqrt(w))^((1+p)/2)出現根號,所以要用類似複數乘法的二元域計算乘法,詳見**。
4)二元域的第一項為解,求出另乙個解。
本題有坑點就是a不一定小於n,所以a>n時直接特判n==2 && a==1會wa。
原始碼:
亂版:
#include
#include
#include
#include
#include
#include
#include
using
namespace
std;
#define ll long long
struct twice
twice(ll _t1, ll _t2, ll _t3, ll p)
twice operator * (twice a)const
};twice power(twice a, ll x, ll p)
return ans;
}ll ppow(ll a, ll x, ll p)
return res;
}ll legendre(ll a, ll p)
ll solve(ll a, ll p)
}// printf("t1 = %i64d, t2 = %i64d\n", t1, t2);
twice u = twice(t1, 1, t2, p);
u = power(u, (p + 1) / 2, p);
return u.t1;
}int main()
if(res == -1)
// printf("res = %i64d\n", res);
ll b = n - res;
if(res > b) swap(res, b);
if(res != b) cout
<< res << " "
<< b << endl;
else
cout
<< res << endl;
}return
0;}
精簡版:
#include
#include
#include
#include
#include
#include
#include using namespace std;
#define ll long long ll n, p; ll a, w; struct twice
twice(ll _a, ll _b)
twice operator * (twice rbs)const }; ll ppow(ll a, ll x)
return res; } twice ppow(twice a, ll x)
return res; } ll legendre(ll a, ll x) ll solve(ll n, ll p)
twice ans = ppow(twice(a, 1), (p + 1) / 2);
return ans.a; } int main()
ll a = solve(n, p);
if(a == -1)
ll b = p - a;
if(a > b) swap(a, b);
printf("%i64d %i64d\n", a, b);
}return
0; }
二次剩餘小結
對於模數 n 和整數 a 若存在整數 x 滿足 x 2 equiv a mod n 則稱 x 是模 n 意義下的二次剩餘,否則是非二次剩餘 注 這裡討論的 x 滿足 x in 1,n 尤拉判別法 對於奇素數 p a 是模 p 意義下的二次剩餘當且僅當 a equiv 1 mod p 類似的,若 a ...
二次剩餘小記
看 text 的部落格看到的,發現似乎並沒有想象中的那麼難,就學了一下,過了板題,這裡記錄一下,暫時還是只會二次剩餘,n 次剩餘暫時先放一下。下文的 p 即是模數。我們稱 n 為模 p 意義下的二次剩餘當且僅當存在 x 使得 x 2 equiv n pmod p,x in mathbb 下文的 ma...
二次剩餘雜記
參考資料一 參考資料二 對於 x 和 p 如果存在 a in 0,p 滿足 a 2 equiv x pmod p 則稱x為模 p 的二次剩餘。在這裡,我們暫時只討論 p 為奇素數的情況。有乙個性質,二次剩餘與非二次剩餘的個數均為 frac 2 如果 p 的原根為 g 那麼 g 的偶數次冪顯然都是二次...