Python:使用 Middle School Procedure 查找 GCD
Python: Finding GCD using Middle School Procedure
中学程序GCD
- 第 1 步求出 m 的质因数。
- 步骤 2 求 n 的质因数
- 步骤 3 找出两个素数展开式中的所有公因子
在
Step 1
和 Step 2
中找到。 (如果 p 是发生在 pm 和
pn次分别为m和n,应该重复min{pm, pn}
次。)
- 步骤 4 计算所有公因数的乘积 return
给定数字的最大公约数。
因此,对于数字 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)`
import numpy as np
from collections import Counter
# Find the prime factors of a integer
def prime_factors(n):
factors = []
i = 2
while n > 1:
if n % i == 0:
factors.append(i)
n /= i
else:
i += 1
return Counter(factors)
# Find prime factors of m and n and multiply their common ones
def Middle(m, n):
fm = prime_factors(m)
fn = prime_factors(n)
cf = fm & fn
return np.prod(list(cf.elements()))
或者你也可以在一行中完成:
def Middle(m, n):
return np.prod(list((prime_factors(m) & prime_factors(n)).elements()))
中学程序GCD
- 第 1 步求出 m 的质因数。
- 步骤 2 求 n 的质因数
- 步骤 3 找出两个素数展开式中的所有公因子
在
Step 1
和Step 2
中找到。 (如果 p 是发生在 pm 和 pn次分别为m和n,应该重复min{pm, pn} 次。) - 步骤 4 计算所有公因数的乘积 return 给定数字的最大公约数。
因此,对于数字 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)`
import numpy as np
from collections import Counter
# Find the prime factors of a integer
def prime_factors(n):
factors = []
i = 2
while n > 1:
if n % i == 0:
factors.append(i)
n /= i
else:
i += 1
return Counter(factors)
# Find prime factors of m and n and multiply their common ones
def Middle(m, n):
fm = prime_factors(m)
fn = prime_factors(n)
cf = fm & fn
return np.prod(list(cf.elements()))
或者你也可以在一行中完成:
def Middle(m, n):
return np.prod(list((prime_factors(m) & prime_factors(n)).elements()))