Ural 1132. Square Root 二次剩余
2013-08-19 17:43
465 查看
1132. Square Root
Time limit: 1.0 secondMemory limit: 64 MB
The number x is called a square root of a modulo n (root(a,n)) if x*x = a (mod n). Write the program to find the square
root of number a by given modulo n.
Input
One number K in the first line is an amount of tests (K ≤ 100000). Each next line represents separate test, which contains integers a and n (1 ≤ a, n ≤32767, n is prime, a and n are relatively prime).
Output
For each input test the program must evaluate all possible values root(a,n) in the range from 1 to n− 1 and output them in increasing order in one separate line using spaces.If there is no square root for current test, the program must print in separate line: ‘No root’.
Sample
input | output |
---|---|
5 4 17 3 7 2 7 14 31 10007 20011 | 2 15 No root 3 4 13 18 5382 14629 |
题意:x^2=a(mod n)(gcd(a,n)=1,n为素数)(有解x升序输出,无解输出"No root"(不包含双引号))。
在数论中,二次剩余的欧拉判别法(又称欧拉准则)是用来判定给定的整数是否是一个质数的二次剩余。
若
![](http://upload.wikimedia.org/math/8/3/8/83878c91171338902e0fe0fb97a8c47a.png)
是奇质数且
![](http://upload.wikimedia.org/math/8/3/8/83878c91171338902e0fe0fb97a8c47a.png)
不能整除
![](http://upload.wikimedia.org/math/8/2/7/8277e0910d750195b448797616e091ad.png)
,则:
![](http://upload.wikimedia.org/math/8/2/7/8277e0910d750195b448797616e091ad.png)
是模
![](http://upload.wikimedia.org/math/8/3/8/83878c91171338902e0fe0fb97a8c47a.png)
的二次剩余当且仅当:
![](http://upload.wikimedia.org/math/3/0/6/30639ced88196e622123772a1bef30c8.png)
![](http://upload.wikimedia.org/math/8/2/7/8277e0910d750195b448797616e091ad.png)
是模
![](http://upload.wikimedia.org/math/8/3/8/83878c91171338902e0fe0fb97a8c47a.png)
的非二次剩余当且仅当:
![](http://upload.wikimedia.org/math/6/1/6/616f275c59d1729a95d0af9d2f24d261.png)
以勒让德符号表示,即为:
![](http://upload.wikimedia.org/math/6/e/1/6e1855d86bf1add7ee9bda2b4cdea2be.png)
费马小定理是数论中的一个定理:假如a是一个整数,p是一个质数,那么
![](http://upload.wikimedia.org/math/f/f/f/fffa0c17e48659e90dc1073c0d679f5c.png)
是p的倍数,可以表示为
![](http://upload.wikimedia.org/math/9/3/2/932d312464b299b86f5e760c1ad0d1ec.png)
如果a不是p的倍数,这个定理也可以写成
![](http://upload.wikimedia.org/math/6/5/a/65a9d7295e7bd6db0a8ec7b6cd74ae58.png)
当n不整除a,n为奇素数时,方程x^2=a(mod n)有解<==>a^((n-1)/2)=1(mod n),此时a称之为n的二次剩余类。相反无解<==>a^((n-1)/2)=-1(或者用n-1表示)(mod n)(欧拉准则),此时称a为n的非二次剩余类。
参考资料:
1.Wikipedia
2.http://blog.csdn.net/jsun_moon/article/details/9860829
3.http://www.cnblogs.com/vongang/archive/2012/11/01/2749871.html
#include <iostream> #include <cstdio> #include <cstdlib> using namespace std; long long pow_mod(long long a,long long b,long long p) { long long res=1; while(b>0) { if(b&1)res=(res*a)%p; a=(a*a)%p; b>>=1; } return res; } long long solve(long long a,long long p) { long long q=p-1,s=0; while(q%2==0) { s++; q>>=1; } if(s==1)return pow_mod(a,(p+1)/4,p); long long z; while(1) { z = 1 + rand()%(p - 1); if(pow_mod(z, (p - 1)/2,p) != 1) break; } long long c = pow_mod(z, q , p); long long r = pow_mod(a, (q + 1)/2, p); long long t = pow_mod(a, q, p); long long m = s, b,i; while(1) { if(t%p==1)break; for(i=1; i<m; i++)if(pow_mod(t,1<<i,p)==1)break; b=pow_mod(c,1<<(m-i-1),p); r=(r*b)%p; c=(b*b)%p; t=(t*c)%p; m=i; } return r; } int main() { long long a,p,i; int t; scanf("%d",&t); while(t--) { scanf("%I64d%I64d",&a,&p); if(p==2) { if(a%p==1)printf("1\n"); else printf("No root\n"); continue; } if(pow_mod(a, (p-1)/2,p) != 1) { puts("No root"); continue; } i=solve(a,p); if(p-i==i)printf("%I64d\n",i); else printf("%I64d %I64d\n",min(i,p-i),max(i,p-i)); } return 0; }
相关文章推荐
- URAL - 1132 Square Root 二次剩余
- [Ural 1132] Square Root (二次剩余方程)
- URAL1132 Square Root 二次剩余模版题
- URAL 1132 Square Root(二次剩余)
- URAL 1132 Square Root 暴力枚举,二次剩余.
- URAL 1123 Square Root(计算二次剩余)
- timus 1132 Square Root (二次剩余)
- [ural1132]Square Root(cipolla算法)
- URAL 1132 二次剩余
- URAL1132_Square Root
- URAL 1132 二次剩余
- 【TOJ1132】Square Root,二次同余方程
- URAL 1132 Square Root <二次剩余 + 数论>
- ural 1132. Square Root
- 【Timus Online Judge 1132】 Square Root
- Timus1132(二次剩余方程求解)
- [求解二次剩余 数论技巧 随机化] Ural 1132 Square Root
- Timus1132(二次剩余方程求解)
- 【TOJ1132】Square Root
- codeforces round#372(div2 C) C. Plus and Square Root