Python:使用中学程序查找GCD

Python:使用中学程序查找GCD,python,algorithm,greatest-common-divisor,Python,Algorithm,Greatest Common Divisor,中学程序GCD 第一步找出m的素因子 第二步求n的素因子 步骤3:确定两个素数展开式中的所有公因子 可在步骤1和步骤2中找到。(如果p是发生在pm和 pn times分别在m和n中,它应该在min{pm,pn}重复 时代。) 步骤4:计算所有公因子的乘积,并将其作为 给定数的最大公约数 因此,对于数字60和24,我们得到 60=2。2.3.5 24=2。2.2.3 gcd(60,24)=2。2.3=12。 根据上面的说明,到目前为止我得到的是: import numpy as np #fi

中学程序
GCD

  • 第一步找出m的素因子
  • 第二步求n的素因子
  • 步骤3:确定两个素数展开式中的所有公因子 可在
    步骤1
    步骤2
    中找到。(如果p是发生在pm和 pn times分别在m和n中,它应该在min{pm,pn}重复 时代。)
  • 步骤4:计算所有公因子的乘积,并将其作为 给定数的最大公约数
因此,对于数字60和24,我们得到

60=2。2.3.5

24=2。2.2.3

gcd(60,24)=2。2.3=12。

根据上面的说明,到目前为止我得到的是:

import numpy as np

#find prime factors of m and output it to list fm
def Middle(m,n):
    c = 2
    fm = [ ]  
    while m > 1:
      if m % c == 0:
        fm.append(c)
        m = m/c
      else:
        c = c + 1             
    return fm

#find prime factors of n and output it to list fn
    d = 2
    fn = [ ]  
    while n > 1:
      if n % d == 0:
        fn.append(d)
        n = n/d
      else:
        d = d + 1 
    return fn

#compare fm and fn and multiply common items
#this is the part where I got wrong       
    cf = []
    for f in fm:
        if f in fn:
            cf.append(f) 
    return (np.prod(cf))
我知道最后一部分是错误的,但我不知道如何修复它。说明书上说要把f重复到最低限度,但我不知道。请帮忙。

这是获得所需输出的一种方法:

import functools
def gcd(a,b):
    def factArr(x):
        list = []
        i=2
        while i <= x:
            if (x % i) == 0:
                list.append(i)
                x = x/i
                i = 2
            else:
                i = i+1
        return list
    aArr = factArr(a);
    bArr = factArr(b);
    print("aArr",aArr,"bArr",bArr)
    cArr = []
    for v in aArr:
        if v in bArr:
            cArr.append(v)
            bArr.remove(v)
    print("cArr",cArr)
    return functools.reduce(lambda x, y: x*y, cArr)
gcd(60,24)`
导入工具
def gcd(a、b):
def factArr(x):
列表=[]
i=2
而我

这是获得所需输出的一种方法:

import functools
def gcd(a,b):
    def factArr(x):
        list = []
        i=2
        while i <= x:
            if (x % i) == 0:
                list.append(i)
                x = x/i
                i = 2
            else:
                i = i+1
        return list
    aArr = factArr(a);
    bArr = factArr(b);
    print("aArr",aArr,"bArr",bArr)
    cArr = []
    for v in aArr:
        if v in bArr:
            cArr.append(v)
            bArr.remove(v)
    print("cArr",cArr)
    return functools.reduce(lambda x, y: x*y, cArr)
gcd(60,24)`
导入工具
def gcd(a、b):
def factArr(x):
列表=[]
i=2
而我
或者您也可以在一行中完成:

def Middle(m, n):
    return np.prod(list((prime_factors(m) & prime_factors(n)).elements()))
或者您也可以在一行中完成:

def Middle(m, n):
    return np.prod(list((prime_factors(m) & prime_factors(n)).elements()))

请修复代码的缩进-缩进严重的Python代码对读者和Python解释器来说都是毫无意义的。如果您使用因子的多重性显式地存储因子,会更容易。如果fm中有一个多因子在fn中只有一个,那么它将与cf中fm的多重性一起使用,而它应该只有一个多重性。因为在
fn
中出现的任何因子
f
都可能只被计算一次,所以当找到它时,您只需删除
f
(添加
fn.remove(f))
cf.append(f)
)之后,请修复代码的缩进-缩进严重的Python代码对读者和Python解释器来说都是毫无意义的。如果您显式存储具有多重性的因子,会更容易。如果fm中有一个多因子在fn中只有一个,那么它将与cf中fm的多重性一起使用,而它应该只有一个多重性。因为在
fn
中出现的任何因子
f
都可能只被计算一次,所以当找到它时,您只需删除
f
(添加
fn.remove(f))
cf.append(f)
)@LutzL抱歉,当我从我的源代码将此内容写入SO时引入了一个错误:
factors.append(n)
->
factors.append(I)
@ShineLinThant然后请将其标记为答案,以便将问题标记为solved@LutzL很抱歉,当我从源代码将此内容写入SO时引入了一个错误:
factors.append(n)
->
factors.append(I)
@ShineLinThant然后请将其标记为答案,以便将问题标记为已解决