URAL 1132 Square Root <二次剩余 + 数论>
2016-08-02 21:17
309 查看
传送门:http://acm.timus.ru/problem.aspx?space=1&num=1132
题意:给你在1~p之间取x使得满足x^2 n(%p),若存在,输出x的值,否则输出No root
分析:
今天要讨论的问题是解方程
![](http://img.blog.csdn.net/20140615164612468)
,其中
![](http://img.blog.csdn.net/20140615162956218)
是奇质数。
引理:
![](http://img.blog.csdn.net/20140615164654203)
证明:由费马小定理,
![](http://img.blog.csdn.net/20140615164737984)
引理:方程有解当且仅当
![](http://img.blog.csdn.net/20140615164810250)
定理:设
![](http://img.blog.csdn.net/20140615165057328)
满足
![](http://img.blog.csdn.net/20140615165131578)
不是模
![](http://img.blog.csdn.net/20140615162956218)
的二次剩余,即
![](http://img.blog.csdn.net/20140615165225187)
无解,那么
![](http://img.blog.csdn.net/20140615165513109)
是二次
剩余方程
![](http://img.blog.csdn.net/20140615164612468)
的解。
证明:由
![](http://img.blog.csdn.net/20140615170153953)
,前面的等号用二项式定理和
![](http://img.blog.csdn.net/20140615170441625)
,后面的等
号用了费马小定理和
![](http://img.blog.csdn.net/20140615170551718)
是模
![](http://img.blog.csdn.net/20140615162956218)
的二次非剩余。然后
![](http://img.blog.csdn.net/20140615171356312)
在算法实现的时候,对
![](http://img.blog.csdn.net/20140615171457078)
的选择可以随机,因为大约有一半数是模
![](http://img.blog.csdn.net/20140615162956218)
的二次非剩余,然后快速幂即可。
************************************************************************************
升级:
接下来我们来解另一个二次同余方程
![](http://img.blog.csdn.net/20140615191703765)
的解,其中
![](http://img.blog.csdn.net/20140615191747625)
,并且
![](http://img.blog.csdn.net/20140615191805843)
是奇质数。方法如下
先求出方程
![](http://img.blog.csdn.net/20140615192413437)
的一个解
![](http://img.blog.csdn.net/20140615192512937)
,那么进一步有
![](http://img.blog.csdn.net/20140615192653546)
我们知道
![](http://img.blog.csdn.net/20140615193036609)
那么也就是说
![](http://img.blog.csdn.net/20140615193131718)
可以证明
![](http://img.blog.csdn.net/20140615193447156)
和
![](http://img.blog.csdn.net/20140615193521640)
,那么最终得到
![](http://img.blog.csdn.net/20140615193622703)
这里由于
![](http://img.blog.csdn.net/20140615193714234)
不是素数,所以求逆元用扩展欧几里得算法即可。
例如:求方程
![](http://img.blog.csdn.net/20140615194033937)
的解
分析:利用上述方法求得
![](http://img.blog.csdn.net/20140615194143468)
,最终解得
![](http://img.blog.csdn.net/20140615194218500)
。
code:
题意:给你在1~p之间取x使得满足x^2 n(%p),若存在,输出x的值,否则输出No root
分析:
今天要讨论的问题是解方程
,其中
是奇质数。
引理:
证明:由费马小定理,
引理:方程有解当且仅当
定理:设
满足
不是模
的二次剩余,即
无解,那么
是二次
剩余方程
的解。
证明:由
,前面的等号用二项式定理和
,后面的等
号用了费马小定理和
是模
的二次非剩余。然后
在算法实现的时候,对
的选择可以随机,因为大约有一半数是模
的二次非剩余,然后快速幂即可。
************************************************************************************
升级:
接下来我们来解另一个二次同余方程
的解,其中
,并且
是奇质数。方法如下
先求出方程
的一个解
,那么进一步有
我们知道
那么也就是说
可以证明
和
,那么最终得到
这里由于
不是素数,所以求逆元用扩展欧几里得算法即可。
例如:求方程
的解
分析:利用上述方法求得
,最终解得
。
code:
#include <iostream> #include <cstdio> using namespace std; #define LL long long LL quick_mod(LL a,LL b,LL p)//快速幂 { LL ans = 1; a%=p; while(b) { if(b&1) { ans = ans * a%p; b--; } b>>=1; a = a*a%p; } return (ans+p)%p; } LL Legendre(LL a,LL p)//求勒让得符号(-1,0,1)这里-1返回p-1 { return quick_mod(a,(p-1)>>1,p); } struct T //二次域 { LL p,d; }; LL w; //二次域第二个单位参数 LL mod(LL t, LL p) { t %=p; if(t<0) t+=p; return t; } T multi_er(T a,T b, LL p)//二次域乘法 { T ans; ans.p = (a.p*b.p%p+ a.d*b.d%p*w%p)%p; ans.d = (a.p*b.d%p +a.d*b.p%p)%p; return ans; } T pow_er(T a,LL b,LL p)//二次域上的快速幂 { T ans; ans.p=1; ans.d =0; while(b) { if(b&1) { ans = multi_er(ans, a, p); b--; } b>>=1; a = multi_er(a, a, p); } return ans; } int solve(int n,int p) { if(p==2) return 1; if(Legendre(n,p)+1 == p) return -1; // printf("solve ...\n"); LL a = -1,t; while(true) { a = rand()%p; t = a*a -n; w = mod(t,p); if(Legendre(w,p)+1==p) break; } T tmp; tmp.p = a; tmp.d = 1; T ans = pow_er(tmp,(p+1)>>1,p); return ans.p; } int main() { int cas; scanf("%d",&cas); while(cas--) { int n,p; scanf("%d %d",&n,&p); n %=p; int a = solve(n,p); if(a == -1) { puts("No root"); continue; } else { int b = p - a; if(a==b) { printf("%d\n",a); } else { if(a>b) swap(a,b); printf("%d %d\n",a,b); } } } return 0; }
相关文章推荐
- [求解二次剩余 数论技巧 随机化] Ural 1132 Square Root
- URAL 1132 Square Root 暴力枚举,二次剩余.
- URAL1132 Square Root 二次剩余模版题
- [Ural 1132] Square Root (二次剩余方程)
- URAL 1132 Square Root(二次剩余)
- URAL 1132 二次剩余
- URAL - 1132 Square Root 二次剩余
- Ural 1132. Square Root 二次剩余
- URAL 1132 二次剩余
- hdu3589 Jacobi symbol(二次剩余 数论题)
- URAL 1123 Square Root(计算二次剩余)
- [数论 && 二次剩余 && BSGS] Codechef FN. FIBNACCI NUMBER
- [zoj 3774]Power of Fibonacci 数论(二次剩余 拓展欧几里得 等比数列求和)
- Timus1132(二次剩余方程求解)
- hdu3589 Jacobi symbol(二次剩余 数论题)
- timus 1132 Square Root (二次剩余)
- 【数论】【二次剩余】【map】hdu6128 Inverse of sum
- ECC与数论、数论史、代数,二次剩余符号的程序计算,高次剩余,高斯和 2013-03-23 21:52:49
- HDU 4794 Arnold ACM/ICPC 2013 Changsha(二次剩余+数论)
- [数论][二次剩余][BSGS] CodeChef FN