精华内容
下载资源
问答
  • greatest common divisor(最大公约数) 1.欧几里得算法 欧几里德算法又称辗转相除法,用于计算两个正整数a,b的最大公约数。 其计算原理依赖于下面的定理: 两个整数的最大公约数等于其中较小的那个数和两数...

    greatest common divisor(最大公约数)

    1.欧几里得算法

    欧几里德算法又称辗转相除法,用于计算两个正整数a,b的最大公约数。

    其计算原理依赖于下面的定理:
    两个整数的最大公约数等于其中较小的那个数和两数相除余数的最大公约数。
    最大公约数(greatest common divisor)缩写为gcd。
    gcd(a,b) = gcd(b,a mod b) (不妨设a>b 且r=a mod b ,r不为0),以此辗转相除得到最终结果。
     
    证明:
    a可以表示成a = kb + r(a,b,k,r皆为正整数,且r<b),则r = a mod b
    假设d是a,b的一个公约数,记作d|a,d|b,即a和b都可以被d整除。
    而r = a - kb,两边同时除以d,r/d=a/d-kb/d=m,等式左边可知m为整数,因此d|r
    因此d也是b,a mod b的公约数
    因此(a,b)和(b,a mod b)的公约数是一样的,其最大公约数也必然相等,得证。
     
    代码实现:
    C++:
    int gcd(int a,int b){
        if (a < b)
            std::swap(a, b);
        return b == 0 ? a : gcd(b, a % b);        
    }

     

    Python:

    函数内递归

    1 def gcd(a, b):
    2     if a < b:
    3         a, b = b, a
    4     while b != 0:
    5         a,b = b,a%b
    6     return a

    函数递归:

    1 def gcd(a, b):
    2     if b == 0:
    3         return a
    4     return gcd(b, a % b)

    2.Stein算法:

    欧几里德算法是计算两个数最大公约数的传统算法,无论从理论还是从实际效率上都是很好的。但是却有一个致命的缺陷,这个缺陷在素数比较小的时候一般是感觉不到的,只有在大素数时才会显现出来。
    一般实际应用中的整数很少会超过64位(当然现在已经允许128位了),对于这样的整数,计算两个数之间的模是很简单的。对于字长为32位的平台,计算两个不超过32位的整数的模,只需要一个指令周期,而计算64位以下的整数模,也不过几个周期而已。但是对于更大的素数,这样的计算过程就不得不由用户来设计,为了计算两个超过64位的整数的模,用户也许不得不采用类似于多位数除法手算过程中的试商法,这个过程不但复杂,而且消耗了很多CPU时间。对于现代密码算法,要求计算128位以上的素数的情况比比皆是,设计这样的程序迫切希望能够抛弃除法和取模。
     
    证明:
    由J. Stein 1961年提出的Stein算法很好的解决了欧几里德算法中的这个缺陷,Stein算法只有整数的移位和加减法,为了说明Stein算法的正确性,首先必须注意到以下结论:
    gcd(a,a)=a,也就是一个数和其自身的公约数仍是其自身。
    gcd(ka,kb)=k gcd(a,b),也就是最大公约数运算和倍乘运算可以交换。特殊地,当k=2时,说明两个偶数的最大公约数必然能被2整除。
    当k与b互为质数,gcd(ka,b)=gcd(a,b),也就是约掉两个数中只有其中一个含有的因子不影响最大公约数。特殊地,当k=2时,说明计算一个偶数和一个奇数的最大公约数时,可以先将偶数除以2。
     
    代码实现:
    Python:
     1 def gcd_Stein(a, b):  
     2     if a < b:
     3         a, b = b, a
     4     if (0 == b):
     5         return a
     6     if a % 2 == 0 and b % 2 == 0:
     7         return 2 * gcd_Stein(a/2, b/2)
     8     if a % 2 == 0:
     9         return gcd_Stein(a / 2, b)
    10     if b % 2 == 0:
    11         return gcd_Stein(a, b / 2)
    12     
    13     return gcd_Stein((a + b) / 2, (a - b) / 2) 

     

     
     
     

    转载于:https://www.cnblogs.com/Dragon5/p/6401596.html

    展开全文
  • 2)默认索引值总是从0开始(当然灵活的Python还支持负数索引) 3)可以通过分片的方法得到一个范围内的元素的集合 4)有很多共同的操作符(重复操作符、拼接操作符、成员关系操作符) 2.迭代,是重复反馈过程的活动...

    1.我们根据列表、元组字符串的共同特点,把它们称为序列,因为他们有以下共同点:

    1)都可以通过索引得到每一个元素
    2)默认索引值总是从0开始(当然灵活的Python还支持负数索引)
    3)可以通过分片的方法得到一个范围内的元素的集合
    4)有很多共同的操作符(重复操作符、拼接操作符、成员关系操作符)

    2.迭代,是重复反馈过程的活动,其目的通常是为了接近并到达所需的目标或结果。每一次对过程的重复被称为一次“迭代”,而每一次迭代得到的结果会被用来作为下一次迭代的初始值

    3.python使用函数有以下好处:

    可以降低代码量
    可以降低维护成本
    使序更容易阅读
    

    4.欧几里得算法求最大公约数,例如 gcd(x, y) 返回值为参数 x 和参数 y 的最大公约数。

    解释:欧几里得算法提供了求解最大公约数的方法,而求解最大公约数是十分有意义的,因为当两个数的最大公约数为1的时候,这两个数就是互质的,即gcd(a,b)=1 等价于 a与b互质,而互质这个性质在数论中则是非常重要。

    欧几里得算法(Eculidean Algorithm)指明:a,b最大公约数(Greatest Common Divisor),就等于b,a%b的最大公约数,

    def gcd(x, y):
        while y:
            t = x % y
            x = y
            y = t 
        return x
        
    print(gcd(4, 6))
    
    1. 函数文档和直接用“#”为函数写注释的区别:

    给函数写文档是为了让别人可以更好的理解你的函数,所以这是一个好习惯,我们看到在函数开头写下的字符串Ta是不会打印出来的,但Ta会作为函数的一部分存储起来,这个我们称之为函数文档字符串,Ta的功能跟注释是一样的。

    6.默认参数和关键字参数表面的区别:

    关键字参数是在函数调用的时候,通过参数名制定需要赋值的参数,这样做就不怕因为搞不清参数的顺序而导致函数调用出错。
    默认参数是在参数定义的过程中,为形参赋初值,当函数调用的时候,不传递实参,则默认使用形参的初始值代替。

    7.如果没有使用 return 语句指定返回值,Python 也不是什么都不返回的,Ta 会返回一个 None 对象,所以我们说 Python 所有的函数都有返回值。

    >>> def hello():
            print('Hello world!')
            
    >>> temp = hello()
    Hello world!
    >>> temp
    >>> print(temp)
    None
    

    8.Python 的 return 语句可以返回多个不同类型的值,默认用逗号隔开,是以元祖的形式返回。

    >>> def myFun():
            return '哈哈哈', 121, 3.14, True
    
    >>> myFun()
    ('哈哈哈', 121, 3.14, True)
    
    展开全文
  • 欧几里得求最大公约数/python

    千次阅读 2015-07-09 13:48:39
    这个个求最大公约数的函数,利用了欧几里得算法。 欧几里得法求最大公约数: 求a和b的最大公约数 记 a mod b=c ,即a=kb+c  设a b的最大公约数为d,则a=m*d b=n*d,m和n互质。 c=a-kb=md-knd=(m-kn)d,m和n...
    这个个求最大公约数的函数,利用了欧几里得算法。

    欧几里得法求最大公约数:
    求a和b的最大公约数
    记 a mod b=c ,即a=kb+c 
    设a b的最大公约数为d,则a=m*d b=n*d,m和n互质。
    c=a-kb=md-knd=(m-kn)d,m和n互质,则n和m-kn互质,c和b的最大公约数也是d
    所以: "a和b(a>b)的最大公约数等于b和a Mode b的最大公约数",递归或迭代计算,直到余数为0,此时除数为最大公约数


    也可以这样理解:
    a=m*d b=n*d,m和n互质,c=a-b=(m-n)*d ,m-n 和 n互质,

    即,"a 、b(a>b)的最大公约数等于 b 和 a-b 的最大公约数。"递归或迭代计算,直到两数相等,此时的值为最大公约数。


    def gcd(big,small):
        remainder = big % small
        if remainder == 0:
            return small
        else:
             gcd(small,remainder) --->这里没有加return ,函数会返回None,因为执行if判断后else默认返回None

    def gcd(big,small):
        remainder = big % small
        if remainder == 0:
            return small
        else:
             return gcd(small,remainder) 
    展开全文
  • python实现用欧几里得算法求得两正整数的最大公约数 欧几里德算法又称辗转相除法,是指用于计算两个非负整数a,b的最大公约数。 假如需要求 1997 和 615 两个正整数的最大公约数,用欧几里德算法,是这样进行的: ...

    python实现用欧几里得算法求得两正整数的最大公约数

    欧几里德算法又称辗转相除法,是指用于计算两个非负整数a,b的最大公约数。

    假如需要求 1997 和 615 两个正整数的最大公约数,用欧几里德算法,是这样进行的:
    1997 / 615 = 3 (余 152)
    615 / 152 = 4(余7)
    152 / 7 = 21(余5)
    7 / 5 = 1 (余2)
    5 / 2 = 2 (余1)
    2 / 1 = 2 (余0)
    至此,最大公约数为1。
    以除数和余数反复做除法运算,当余数为 0 时,取当前算式除数为最大公约数,所以就得出了 1997 和 615 的最大公约数 1。
    用递归实现如下图所示

    def gcd(x, y):
        if y:
            return gcd(y, x%y)
        else:
            return x
        
    print(gcd(4, 6))
    
    

    运行结果:

    D:\pythonProject4\venv\Scripts\python.exe D:/pythonProject4/main.py
    2
    
    Process finished with exit code 0
    
    
    展开全文
  • 主要介绍了使用Python求解最大公约数的实现方法,包括用Python表示欧几里得算法和Stein算法的求解原理,需要的朋友可以参考下
  • python怎么求最大公约数和最小公倍数 一、求最大公约数 用辗转相除法求最大公约数的算法如下: 两个正整数a和b(a>b),它们的最大公约数等于a除以b的余数c和b之间的最大公约数。比如10和25,25除以10商2余5,那么10...
  • #Python3 实例--Python 欧几里德算法:求两个数的最大公约数 #print("Python3 实例--Python 欧几里德算法:求两个数的最大公约数") x = int(input()) y = int(input()) def gy_number(m, n): r = int(m % n) while...
  • 2. 当最小值不为最大公约数时,最大公约数不会大于最小值的1/2;3. 求最大公约数理应从大到小循环递减求最大。实例:def gcd(a, b):if b > a:a, b = b, a # b为最小值if a % b == 0:return b # 判断b...
  • 四种方法求最大公约数(Python)

    万次阅读 多人点赞 2020-05-19 14:11:34
    一、最大公约数 二、解题思路 1、暴力枚举法 2、辗转相除法 3、更相减损术 4、更相减损术与移位相结合 一、最大公约数 题目:写一段代码,求出两个整数的最大公约数,要尽量优化算法性能。 二、解题思路 1、暴力枚举...
  • Python:三种方法计算最大公约数和最小公倍数1.穷举法 题目:求取任意两个非负数的最大公约数和最小公倍数; 参考资料:Python解决求最大...最小公约数欧几里得算法&stein算法) link 1.穷举法 两个非负数的 ...
  • 本博文源于《程序设计竞赛入门》,旨在总结python求最大公约数方法。博文列出方法共三种,分别是1、暴力方法根据数学性质 2、根据迭代法 3、根据库函数。求最大公约数python编程中一个小小的问题之一,但通过这篇...
  • python求最大公约数和最小公倍数

    千次阅读 2019-09-28 11:18:33
    欧几里德算法是用来求两个正整数最大公约数的算法。是由古希腊数学家欧几里德在其著作《The Elements》中最早描述了这种算法,所以被命名为欧几里德算法。 假如需要求 1997 和 615 两个正整数的最大公约数,用欧几里德...
  • 给定n对正整数ai,biai,bi,请你求出每对数的最大公约数。 输入格式 第一行包含整数n。 接下来n行,每行包含一个整数对ai,bi. 输出格式 输出共n行,每行输出一个整数对的最大公约数。 数据范围 1≤n≤10^5 1≤...
  • 欧几里得算法求最大公约数:辗转相除法 具体做法:用较小数除较大数,再用出现的余数(第一余数)去除除数,再用出现的余数(第二余数)去除除数,如此反复,直到最后余数是0为止。如果是求两个数的最大公约数,...
  • def myfun(): num1 = int(input('输入num1')) ... print('最大公约数:',max(list1) ) print('最小公倍数:',num1 * num2 // max(list1)) myfun() 转载于:https://www.cnblogs.com/menxin/p/9887228.html
  • 辗转相除法也称欧几里得算法,是用来求两个正整数的最大公约数的算法。接下来我们用实例来解释一下。假如我们需要求12和21的最大公约数,用辗转相除法是这样实现的: 21 / 12 = 1 (余 9) 12 / 9 = 1(余 3) 9 / 3...
  • Python解决求最大公约数和最小公倍数问题

    万次阅读 多人点赞 2018-09-06 21:06:47
    题目:求两个正整数的最大公约数和最小公倍数。 基本要求:1.程序风格良好(使用自定义注释模板),两种以上算法解决最大公约数问题,提供友好的输入输出。 提高要求:1.三种以上算法解决两个正整数最大公约数问题。...
  • python 最大公约数

    2021-05-27 19:04:49
    三种方法求最大公约数 import time #连续整数检测 def calculation(a,b): x = a % b while (x != 0): a = b b = x x = a % b return b #分解质因数 def primefactor(a,b): i = 2 j = 1 while((i<=a) and...
  •  对于这个问题,求最大 公约数的算法有很多,例如:穷举法,即传进来两个数,选择最小的那个数,作为 最开始的最大公约数,向下穷举,知道都可以被整除为止,但是这种算法太笨拙。还有欧几里得算法,辗转相除。我...
  • 最小公倍数和最大公约数的简单求法
  • 最大公约数python

    千次阅读 2018-06-04 12:23:03
    根据左程云老师的《程序员代码面试宝典》中一行完成最大公约数的讲解。class Solution(object): def permute(self, nums): """ :type nums: List[int] :rtype: List[List[int]] "&...
  • 1. 辗转相除法(while循环实现...(2) temp = 0时,q为最大公约数 (3) temp !=0时,p = q;q = temp注:该循环的是否继续的判断条件就是temp是否为0 def fuc(p, q): temp = p % q while temp!=0: p = q temp = p ...
  • python编程:欧几里得算法又称辗转相除法,用于计算两个非负整数a,b的最大公约数。假如需要求1997和615两个正整数的最大公约数,用欧几里得算法,是这样的 至此,最大公约数为1 以除数和余数反复做除余运算,当余数...
  • 方法一:用函数实现求两个数的最大公约数和最小公倍数。 使用的数学方法是欧几里得算法(辗转求余数法) def gcd(x, y): """ 求最大公约数""" while y % x != 0: x, y = y % x, x return x def lcm(x, y): ...
  • Python实现求最大公约数

    千次阅读 2018-09-25 10:21:14
    #求最大公约数的三种算法 def ewewew(a,b): if a&lt;b: a,b=b,a if b==0: return a if (a%2)0 and (b%2)0: return 2*ewewew(a/2,b/2) if a%20: return ewewew(a/2,b) if b%20: return ewewew(a...
  • 定理:两个数的最大公约数等于小数与这两个数除得余数的最大公约数。 具体计算步骤如下???? C #include <stdio.h> int gcd(int val1, int val2) { if (val1 == 0 || val2 == 0) return 0; do { int r = ...
  • #求最大公约数 def gcd(a,b): if a<b: t=a a=b b=t while a%b!=0: temp=a%b a=b b=temp return b a = int(input()) b = int(input()) r = gcd(a,b) print(r)
  • 1.欧几里得算法简介欧几里德算法又称辗转相除法,是指用于计算两个正整数a,b的最大公约数。应用领域有数学和计算机两个方面。计算公式为:gcd(a,b) = gcd(b,a mod b)。 2.算法思路 1) 令r为a/b所得余数(0≤r<b)...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 914
精华内容 365
关键字:

python欧几里得公约数

python 订阅