URAL 1132 二次剩餘

2021-07-07 04:14:40 字數 2267 閱讀 8827

題意:

對於方程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 的偶數次冪顯然都是二次...