同余问题之模方程模板
2014-08-23 17:16
190 查看
最近看大白书,总结下模板:
快速幂取模
求逆元
方法1(欧几里得)
方法2(欧拉定理)
a的逆为pow_mod(a,phi(n)-1,n);
线性同余方程
线性同余方程组
离散对数:
快速幂取模
LL pow_mod(LL x,LL a,LL mod) { if(a==0)return 1; LL ans=pow_mod(x,a>>1,mod); ans=ans*ans%mod; if(a&1)ans=ans*x%mod; return ans; }
求逆元
方法1(欧几里得)
int rev(int a,int n) { int x,y,d; exgcd(a,n,d,x,y); return d==1?(x+n)%n:-1; }
方法2(欧拉定理)
a的逆为pow_mod(a,phi(n)-1,n);
线性同余方程
//形如ax=b(mod n) int mod_equ(int a,int b,int n) { int d=rev(a,n);//求逆元 if(d==-1)return -1; return d*b; }
线性同余方程组
int liner_equs(int n) { int x=0,m=1; for(int i=0;i<n;i++) { int a=A[i]*m,b=B[i]-A[i]*x,d=gcd(a,M[i]); if(b%d)return -1; a/=d;b/=d;int cur_m=M[i]/d; int t=b*inv(a,cur_m)%cur_m; x+=m*t;m*=cur_m; x%=m; } return x; }
离散对数:
int log_mod(int a,int b,int n) //a^x=b(mod n)无解返回-1 { int e=1; int m=sqrt(n+0.5); int v=rev(pow_mod(a,m,n),n);//a^(-m) map<int,int>x; x[1]=0; for(int i=1;i<m;i++) { e=mul_mod(e,a,n); if(!x.count(e))x[e]=i; } for(int i=0;i<m;i++) { if(x.count(b))return i*m+x[b]; b=mul_mod(b,v,n); } return -1; }
相关文章推荐
- java语言实现:数论经典问题 除法表达 ,无平方因子数 ,直线上的点,同余与模算术 大整数取模 幂取模,模线性方程
- 高斯消元同余线性方程的模板
- 转贴:关于C++模板和重载的小问题
- 一个关于xslt的模板匹配规则的问题
- C++对模板的分离式编译问题
- 关于Windows SharePonit Services 3.0 的模板问题
- 困扰了我N天的模板问题,NND,总算找到答案了!
- 解决了把Web DataGrid 模板列中"按钮列"中的按钮样式改成PushButton后不激发事件的问题
- GCC 在模板继承中不可理解的地方(编译器问题)
- Cache 和 模板的问题
- 疑难杂症:解决由早期版本的Web应用项目模板造成的VS 2005 SP1 Beta的问题
- 关于后台生成的模板列的数据绑定问题
- Struts+Hibernate模板开发笔记---解决汉字编码问题
- DetailsView中模板列的一个问题:ViewState异常 "Failed to load viewstate"
- 一个XSLT的变量、参数和模板调用的问题
- 关于C++模板的连接问题
- 关于C++模板和重载的小问题
- CArray 模板使用时应注意的问题.
- 关于动态生成列的DATAGRID不能出发模板列的时间问题
- 关于模板控件如何实现多数据源绑定的问题