求逆元的方法汇总
来源:互联网 发布:假人挑战是什么软件 编辑:程序博客网 时间:2024/05/22 08:17
求逆元的方法汇总
- 源于PO姐在UOJ群里面的讲课%%%%%
逆元
它是一个可以取消另一给定元素运算的元素。
对于正整数a和m,如果有a⋅x≡1(mod m),那么把这个同余方程中x的最小正整数解叫做a模m的逆元。
前提
求
定理
欧拉定理(费马小定理)
- 欧拉定理:
若a与m互质,那么有aφ(m)≡1(mod m)
方法
1.欧拉定理
根据欧拉定理
所以
时间复杂度
2.exgcd
应用exgcd
我们假设a的逆元是x
用exgcd求出x即为a的逆元
时间复杂度
3.需要线性处理1~n的逆元
更正:本方法需在模数为素数情况下才能使用!!!
我们假设
在将这个式子放在
两边同时乘上
再将
所以我们定义
同时也就得到了一种
由于每次取模,所以每次都相当于折半,复杂度就降到了
最后贴上代码
1.欧拉定理
const maxn=1000;var prime:array[0..maxn]of longint; check:array[0..maxn]of boolean; i,j,k:longint; n,m,tt,len,ans:longint;procedure prepare;begin len:=0; for i:=2 to trunc(sqrt(maxn)) do begin if check[i]=false then begin inc(len); prime[len]:=i; end; for j:=1 to len do begin if prime[j]*i>trunc(sqrt(maxn)) then break; check[i*prime[j]]:=true; if i mod prime[j]=0 then break; end; end;end;function f(a,b,m:longint):longint; {a^b mod m}var t,y:int64;begin t:=1; y:=a; while b<>0 do begin if b and 1<>0 then t:=(t*y)mod m; y:=(y*y)mod m; b:=b>>1; end; exit(t);end;begin prepare; readln(n,m); tt:=m; ans:=m; for i:=1 to len do begin if m=1 then break; if m mod prime[i]=0 then ans:=(ans div prime[i])*(prime[i]-1); while m mod prime[i]=0 do m:=m div prime[i]; end; if m<>1 then ans:=(ans div m)*(m-1); writeln(f(n,ans-1,tt));end.
2.exgcd
var n,m,a,b,c,x,y:longint;procedure exgcd(a,b:longint; var x,y:longint);var c:longint;begin if b=0 then begin x:=1; y:=0; exit; end else exgcd(b,a mod b,x,y); c:=x; x:=y; y:=c-(a div b)*x;end;begin readln(n,m); exgcd(n,m,x,y); x:=(x+((x div m)+1)*m+m)mod m; writeln(x);end.
线性处理1~n
const maxn=1000;var x:array[0..maxn]of longint; i,j,k:longint; n,m:longint;begin readln(n,m); x[1]:=1; for i:=2 to n do x[i]:=(-(m div i)*x[m mod i])mod m; writeln(x[i]);end.
线性处理转求单个
var n,m:longint;function f(a:longint):longint;begin if a=1 then exit(1) else exit((-(m div a)*f(m mod a))mod m);end;begin readln(n,m); writeln(f(n));end.
0 0
- 求逆元的方法汇总
- 求逆元的方法汇总
- 逆元详解 求逆元的方法汇总
- extaspnet 的一些方法汇总
- 冗余切换的方法汇总
- PHP的$_SERVER方法汇总
- textView的代理方法汇总
- JavaScript的document方法汇总
- Bitmap的相关方法汇总
- 求绝对值的方法汇总
- 遍历datatable的方法汇总
- GridView 中取值的方法汇总
- Picasso使用的方法汇总:
- PHP的加密方法汇总
- 图像二值化的方法汇总
- Jquery常用的方法汇总
- 最流行的网站推广方法汇总
- 从GridView 中取值的方法汇总
- Android 资源(resource)学习小结
- 网站开发 新人 建议
- UITableView总结
- IOS 代码块之block的声明、创建、传参的基本使用
- background-image背景图片拉伸平铺
- 求逆元的方法汇总
- php获取某天的上周一日期与时间戳
- Android shell 脚本
- 手机高温警告提示内容不匹配的分析【多次调用PendingIntent.getBroadcast,intent数据不更新】
- 使用Bundle.putSerializable() 在Activity中交换数据
- PHP数组操作
- eclipse中的android布局文件的快捷键Alt+/不起作用的一种解决方法
- UVa--400 Unix ls(格式输出)
- python中的引用