拓展欧几里德算法求逆元2

 1 void gcd(int a,int b,int &d,int &x,int &y)
 2 {
 3     if(!b)
 4     {
 5         d=a;
 6         x=1;
 7         y=0;
 8     }
 9     else
10     {
11         gcd(b,a%b,y,x);
12         y-=x*(a/b);
13     }
14 }
15
16 //计算模n下a的逆元,如果不存在逆元,返回-1
17 int inv(int a,int n)
18 {
19     int d,x,y;
20     gcd(a,n,d,x,y);
21     return d==1? (x+n)%n: -1;
22 }

公式:

(a/b)%c=((a%c)*b^(-1)%c)

时间: 2024-08-07 08:03:29

拓展欧几里德算法求逆元2的相关文章

扩展欧几里德算法求逆元3

1 int gcd(int x3,int y3) 2 { 3 int x1 = 1,x2 = 0,y1 = 0,y2 = 1; 4 while(1) 5 { 6 if (y3==1) return y2; 7 int q=x3/y3; 8 int t1=x1-q*y1,t2=x2-q*y2,t3=x3-q*y3; 9 x1 = y1,x2 = y2,x3 = y3; 10 y1 = t1,y2 = t2,y3 = t3; 11 } 12 }

如何使用循环而不是递归反推的方式实现拓展欧几里德算法

平常我们使用拓展欧几里德算法求pm + qn = gcd(m, n)这种表示时,一般都会选择递归的方式来实现,因为欧几里得算法的递归深度最多也只有O(lgn), according to lame's theorem,所以这个递归用栈是可以忽略的. 但其实只需要循环就可以求出一组pm + qn = gcd(m, n)的表示,将栈深度保持在O(1),这样的写法在使用函数调用的高级语言中看起来复杂一点但在汇编编程时就显得比较简单. 方法是假设第k次迭代中的两个数分别为 M(k) 和 N(k),我们始

用python实现欧几里德算法求最大公约数

方法1: def gcd(x, y):   while n:       x, y = y, x % y   return x 方法2: def yue(x,y):      if y:              return gcd(y,x%y)      else:            return x 用python实现欧几里德算法求最大公约数,布布扣,bubuko.com

【算法】欧几里德算法--求最大公约数

预备知识 因子(除数) 如果有整数 n,a,b .a和b都不为0 ,且 有 n = a*b ,则说a(或者b,以下省略说明)为n的一个因子,或者说a能整除n. 特别的:任何非0整数都是0的因子,所以一般我们不会去求0的因子. 如:3 的因子有  1, -1 ,  3 ,  -3 .然而我们一般只考虑正数因子,因为负数因子和正数因此没有本质上的区别,只是符号不同而已. 素数:素数(也加叫质数)的定义是,如果整数p的因子 只有 ±1 和   ±p,则它就是素数 .特别的:0 和1既不是素数,也不是合

欧几里德算法(求最大公因数)

//说明: //欧几里德算法:计算两个证书的最大公因数(假设M>N) //输入:M,N //输出:最大公因数 #include<iostream> using namespace std; void main() { cout<<"Input M and N:"<<endl; int M,N; cin>>M>>N; int rem; while(N>0) { rem=M%N; M=N; N=rem; } cout&

POJ1061-青蛙的约会---扩展欧几里德算法求最小整数解

扩展欧几里得算法模板 #include <cstdio> #include <cstring> #define ll long long using namespace std; ll extend_gcd(ll a, ll b, ll &x, ll &y) { if(b == 0) { x = 1, y = 0; return a; } else { ll r = extend_gcd(b, a%b, y, x); y -= x*(a/b); return r;

欧几里德算法求最大公约数

求最大公约数有暴力法和辗转相除法 时间复杂度 暴力:O(N) 辗转相除法:O(2logN) 辗转相除法原理: 设c为A B 的最大公约数 则存在K1 K2 使 A=K1*c B=K2*c; r为A模B r=A - K3*B; r=K1*c-K3*k2*c; r=(K1-K2*K3)*c; 所以A 和 B 的余数一定是最大公约数c的倍数 1 #include <stdio.h> 2 3 int gcd(int a, int b) 4 { 5 int temp, r; 6 if(a<b) 7

求逆元

什么叫乘法逆元? 这里,我们称 x 是 a 关于 m 的乘法逆元 这怎么求?可以等价于这样的表达式: a*x + m*y = 1 怎么求逆元? 1,扩展欧几里德算法求逆元 int ex_gcd(int a,int b,int &x,int &y){ if(!b){ x=1,y=0; return a; } int ans=ex_gcd(b,a%b,y,x); y-=a/b*x; return ans; } int inv(int a,int mod){ int x,y; int ans=e

求逆元的四种算法(拓欧费马小线性推欧拉)

求逆元的四种算法 拓展欧几里得算法求逆元 上一篇博客中已经讲过拓展欧几里得算法,并且讲解了求逆元的原理.这里只列出代码 在要求逆元的数与p互质时使用 代码 //扩展欧几里得定理 int ex_gcd(int a,int b,int& x,int& y) { if(b==0) { x=1; y=0; return a; } int ans = ex_gcd(b,a%b,x,y); int tmp = x; x = y; y = tmp-a/b*y; return ans; } int cal