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

用python实现欧几里德算法求最大公约数的相关文章

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

预备知识 因子(除数) 如果有整数 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既不是素数,也不是合

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

求最大公约数有暴力法和辗转相除法 时间复杂度 暴力: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

欧几里德算法(最大公约数算法)完整分析

欧几里德算法又称为辗转相除法,用于计算两个非负整数的最大公因数.其伪代码如下: gcd(a, b) //要求保证传入的a>=b if(b == 0) return a return gcd(b, a % b) 首先说明这个函数能返回a与b的最大公因数.但是我们不从代码到原理,我们要从原理返回代码.(下面的出现的所有符号均为非负整数) 在a与b均非0且a>=b的情况下,若c是a和b的最大公因数(c>0),那么就有c|a和c|b的同时成立.显然a=i*c,b=j*c,此处应满足1<=j

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

//说明: //欧几里德算法:计算两个证书的最大公因数(假设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&

浅谈Stein算法求最大公约数(GCD)的原理及简单应用

一.Stein算法过程及其简单证明 1.一般步骤: s1:当两数均为偶数时将其同时除以2至至少一数为奇数为止,记录除掉的所有公因数2的乘积k: s2:如果仍有一数为偶数,连续除以2直至该数为奇数为止: s3:用更相减损法(辗转相减法),即GCD(a,b)=GCD(a-b,b)求出两奇数的最大公约数d: s4:原来两数的最大公约数即为d*k: 2.简单证明: s1:即为求出两数为2的幂次方的最大公因数k: s2:当化简后两数一奇一偶时,显然奇数是不含偶数因子的,那么另一化简后偶数的所有偶数因子都不

[Python] 弗洛伊德(Floyd)算法求图的直径并记录路径

相关概念 对于一个图G=(V, E),求图中两点u, v间最短路径长度,称为图的最短路径问题.最短路径中最长的称为图的直径. 其中,求图中确定的某两点的最短路径算法,称为单源最短路径算法.求图中任意两点间的最短路径算法,称为多源最短路径算法. 常用的路径算法有: Dijkstra算法 SPFA算法\Bellman-Ford算法 Floyd算法\Floyd-Warshall算法 Johnson算法 其中最经典的是Dijkstra算法和Floyd算法.Floyd算法是多源最短路径算法,可以直接求出图

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;

拓展欧几里德算法求逆元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 retu

扩展欧几里德算法求逆元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 }