最大公约数

由区块链引发的密码技术讨论(三)一些数学问题

老子叫甜甜 提交于 2019-12-11 07:44:00
第三章 一些数学问题 在上一章复习了计算机基础中的编码和进制问题后,我们开始讨论一下密码技术中的数学。数学博大精深,本文作者水平有限,没有什么循序渐进的知识逻辑可言,只是零散地介绍一些现代密码技术常用的数学概念,且都是点到即止,尽量能够让你阅读后“知其然而不知其所以然”,因人而异,可能有趣,也可能烧脑。 3.1 质数 又称素数。一个大于1的自然数,除了1和它自身外,不能被其他自然数整除的数叫做质数;否则称为合数。如: 2 3 5 7 11 13 17 19 23 29 31 37 41 43 47 53 59 61 67 71 3.2 最小公倍数和最大公约数 最小公倍数: 指在两个或两个以上的自然数中,如果它们有相同的倍数,这些倍数就是它们的公倍数,其中除0以外最小的一个公倍数,叫做这几个数的最小公倍数。 最大公约数: 也称最大公约数、最大公因子,指两个或多个整数共有约数中最大的一个。 3.3 互质 公约数只有1的两个整数,叫做互质整数。若N个整数的最大公因数是1,则称这N个整数互质。 例如: 8,10的最大公因数是2,不是1,因此不是整数互质。 7,11,13的最大公因数是1,因此这是整数互质。 5和5不互质,因为5和5的公因数有1、5。 1和任何数都成倍数关系,但和任何数都互质。 3.4 mod运算 mod运算,叫模运算,即求余运算,是在整数运算中求一个整数 x

计算两个数的最大公约数

混江龙づ霸主 提交于 2019-12-11 07:09:36
#计算两个数的最大公约数 def Common_divisor(num1, num2): min = num1 if num1 < num2 else num2 i, final_num = 1, 1 while i <= min: if num1 % i == 0 and num2 % i == 0: final_num = i i += 1 return final_num num1, num2 = input('请输入第一个数字'), input('请输入第二个数字') final_ = Common_divisor(int(num1), int(num2)) print(final_) #数学类实现 import math m = math.gcd(int(num1), int(num2)) print(m) 来源: CSDN 作者: MonCasper 链接: https://blog.csdn.net/qq_43036676/article/details/103458121

最大公约数和最小公倍数

家住魔仙堡 提交于 2019-12-11 03:07:37
题目描述 给你2个正整数x和y(均不大于1000),计算出x和y的最大公约数和最小公倍数 输入 多组测试数据,每组输入2个整数x和y 输出 对于每组数据输出一行,分别是最大公约数和最小公倍数,中间用空格隔开 样例输入 12 18 3 9 样例输出 6 36 3 9 #include<stdio.h> int main() { int x,y,i,j,m,n,t,p; while(scanf("%d%d",&x,&y)!=EOF) { for(i=1;i<=x;i++) { if(x%i==0&&y%i==0) t=i; } for(j=x*y;j>=y;j--) { if(j%x==0&&j%y==0) p=j; } printf("%d %d\n",t,p); } return 0; } 来源: CSDN 作者: hqm793899006 链接: https://blog.csdn.net/hqm793899006/article/details/103480813

最大公约数问题

≡放荡痞女 提交于 2019-12-11 02:13:51
应用递推法求解最大公约数问题。 在数学中,求最大公约数有一个很有名的方法叫辗转相除法。辗转相除法体现了递推法的基本思想。 设m,n为两个正整数,且n不为零,辗转相除法的过程是: 将问题转化为数学公式:r=m%n,r为m除以n的余数; 若r=0,则n为所求的最大公约数,输出n; 若r!=0,则令m=n,n=r,继续递推,再重复前面的(1)、(2)步骤。其中第(3)步为递推部分。 求解最大公约数可以用辗转相除法是因为若A、B都是N的倍数,则A-B仍然是N的倍数。也就是把两个数相减,不会使约数消失。那么可以用互相减的办法,把数字化小,直到一个数是另一个数的倍数。 来源: CSDN 作者: AI就是爱 链接: https://blog.csdn.net/qq_37388085/article/details/103477349

辗转相除法求最大公约数

99封情书 提交于 2019-12-09 16:45:35
辗转相除法求最大公约数 约数 如果数 a 能被数 b 整除,a 就叫做 b 的倍数,b 就叫做 a 的 约数 。 最大公约数 最大公约数就是两个数中,大家都能相约且最大的数。 辗转相除法 辗转相除法 又名欧几里得算法(Euclidean algorithm),目的是求出两个正整数的最大公约数。它是已知最古老的算法,其可追溯至公元前300年前。 这条算法基于一个定理:两个正整数 a 和 b(a 大于 b),它们的最大公约数等于 a 除以 b 的余数 c 和 较小数 b 之间的最大公约数。 算法计算过程是这样的: 2个数相除,得出余数 如果余数不为0,则拿较小的数与余数继续相除,判断新的余数是否为0 如果余数为0,则最大公约数就是本次相除中较小的数。 比如数字 25 和 10 ,使用辗转相除法求最大公约数过程如下: 25 除以 10 商 2 余 5 根据辗转相除法可以得出,25 和 10 的最大公约数等于 5 和 10 之间的最大公约数 10 除以 5 商 2 余 0, 所以 5 和 10 之间的最大公约数为 5,因此25 和 10 的最大公约数为 5 题目要求 完善函数 gcd 的功能。函数 gcd 会计算并返回传入的两个正整数参数之间最大的公约数 如下所示: gcd(30,3); // 返回结果为 3 gcd(12, 24); // 返回结果为 12 gcd(111, 11); /

C语言 递归实现辗转相除法

萝らか妹 提交于 2019-12-06 16:37:16
辗转相除法可以用来计算两个数之间的最大公约数,也成为欧几里得算法 算法大致: 在B等于0之前,交换AB位置让V等于上一轮A求余B的结果,当B为0时,A就是最大公约数 代码实现 int gcd(int a, int b){ if (b == 0) { return a; } gcd(b, a % b); } int main() { printf("%d", gcd(12, 18)); return 0; } 打印输出 6 每轮数字变化 12 18 18 12 12 6 6 0 此时,B == 0, 于是结果为A的值6 来源: https://www.cnblogs.com/esrevinud/p/11994701.html

算法:辗转相除法求最大公约数(C语言实现)

守給你的承諾、 提交于 2019-12-06 13:16:33
辗转相除法,一种求最大公约数的算法 已知:A / B = C ······ R (A、B、C、R皆是整数) 假设:D是A的余数,D也是B的余数,那么D就是A和B的公约数 D是A和B的约数,则A和B是D的倍数,B * C也是D的倍数 既然A与B*C都是D的倍数,那么A与B*C的 差 也是D的倍数 A - B*C = R 所以R也是D的倍数 如果D是A或B的公约数,那么D也是B和R的公约数 故:(A,B)= (B,R) 由以上证明则可以求出最大的公约数 例如:求72和28的最大公约数 72 / 28 = 2 ······ 16 ↓ ↓ ↓ ↓ 28 / 16 = 1 ······ 12 ↓ ↓ ↓ ↓ 16 / 12 = 1 ······ 4 ↓ ↓ ↓ ↓ 12 / 4 = 3 ······ 0 现在可以知道 72与28的最大公约数是4 1 #include <stdio.h> 2 int main(){ 3 int a; // 除数 4 int b; // 被除数 5 int r=1;  // 余数,赋初值为1 6 printf("输入除数与被除数(空格分开):"); 7 scanf("%d %d",&a,&b); 8 while(r!=0){ // 如果a<b,亦无需颠倒ab,在计算中商0余除数本身,在下次运算中自可颠倒回来 9 r = a % b; 10 a = b; 11 b

java - 算法 - 求最大公约数

大兔子大兔子 提交于 2019-12-06 12:54:12
= =看李永乐的视频想到的算法。。。。。。觉得不错所以记录一下 原理: 欧几里得的反转相除法 104 和 40的最大公约数: 104 ÷ 40 = 2 。。。 24 40 ÷ 24 = 1 。。。 16 24 ÷ 16 = 1 。。。 8 16 ÷ 8 = 2 没有余数,则8就是最大公约数 reference: https://www.bilibili.com/video/av77974575 代码: public class Gcd { public static void main(String[] main){ int a = 150; int b = 24; //求最大公约数 while(true){ int y = a % b; if(y == 0){ System.out.println(b); break; } a = b; b = y; } } } 来源: https://www.cnblogs.com/clamp7724/p/11985265.html

最大公约数和最小公倍数算法

那年仲夏 提交于 2019-12-06 06:30:37
// 最大公约数算法 // 1. a % b 进行取余运算 // 2. 将被取余数与余数进行再次取余运算 // 3. 直到a % b为0时停止取余运算 // 4. 将取余为0时的被取余数返回即是最大公约数 function gcd(a, b) { if (b === 0) { return a; } return gcd(b, a % b); } //最小公倍数算法 //a * b 得到的结果 / gcd(a,b) 得到最小公倍数 function lcm(a, b) { return a * b / gcd(a,b) } 来源: https://www.cnblogs.com/pluslius/p/11965587.html

欧几里得算法

不羁岁月 提交于 2019-12-05 05:29:33
一、背景及介绍   在数学中, 辗转相除法 ,又称 欧几里得算法 (英语: Euclidean algorithm),是求 最大公约数 的算法。两个 整数 的 最大公约数 是能够 同时整除 它们的 最大的正整数 。辗转相除法基于如下原理:两个 整数 的 最大公约数 等于 其中较小的数 和 两数相除余数 的最大公约数。例如,252和105的最大公约数是21(252 = 21 × 12;105 = 21 × 5 );因为 252 − 105 = 21 × (12 − 5) = 147 ,所以147和105的最大公约数也是21。 二、递归与非递归实现 1 /** 2 * 递归实现 3 * @param m 4 * @param n 5 * @return 6 */ 7 public static int gcdRecu(int m, int n) { 8 if (n == 0) { 9 return m; 10 } else { 11 return gcdRecu(n, m%n); 12 } 13 } 14 15 /** 16 * 迭代法 17 * @param m 18 * @param n 19 * @return 20 */ 21 public static int gcdIter(int m, int n) { 22 int t = 1; 23 while (t != 0) {