【发布时间】:2020-06-28 18:53:45
【问题描述】:
我正在使用 Project Euler 网站上的 problem #69。它涉及欧拉的Totient函数。这个函数的定义可以在here找到。无论如何,问题要求在整数 2 到 1,000,000 上找到 n / Phi(n) 的最大值,其中 Phi 是 Totient 函数。我知道我的代码有效,因为当搜索间隔为 2 到 10 时,它正确地找到了 n=6 作为最大值。但是,它可怕慢 - 使用 1,000 的上限会延长计算时间到大约 30 秒,这意味着使用 1,000,000 的上限大约需要至少 8 小时!在 Project Euler 网站上,它指出在中等功率的计算机上任何一次计算都不应超过一分钟。我的电脑很强大,所以在这方面没有任何不足。也许我正在使用的 Jupyter Notebooks IDE 的编译器效率特别低?我不太确定。对此事的帮助将不胜感激。以下是我的代码:
def FactorsOf(n,include_ends=False): #Returns the factors of a positive integer in an array.
factors = [] #The include_ends param can be set to True if 1 & n are to be
a=0 #included in the returned array.
b=0
if (include_ends):
a=1
b=n+1
else:
a=2
b=n
for k in range(a,b):
if (n%k==0):
factors.append(k)
return factors
def AreRelativelyPrime(a,b):
a_factors=FactorsOf(a,include_ends=True)
b_factors=FactorsOf(b,include_ends=True)
for i in range(1,len(a_factors)): #Searches through both factor arrays to see if there
for j in range(1,len(b_factors)): #are any elements in common. Of course the first element,
if (a_factors[i]==b_factors[j]): # 1, is excluded.
return False
return True
def Totient(n):
totient=1 #The Totient function's minimum value is 1.
n_factors = FactorsOf(n)
for m in range(2,n):
if(AreRelativelyPrime(n,m)): #Increments the Totient function every time we find a
totient+=1 # number relatively prime to n.
return totient
n_over_phi_MAX = 2
maxes = []
for n in range(2,1001):
n_over_phi = n/Totient(n)
if(n_over_phi > n_over_phi_MAX):
n_over_phi_MAX = n_over_phi
maxes.append(n)
print("The maxiumum value of n/phi(n) is " + str(n_over_phi_MAX) + " at a value of " + str(maxes[-1]))
【问题讨论】:
-
请参阅Project Euler 69: Find the value of n ≤ 1,000,000 for which n/φ(n) is a maximum 以获取有效解决此问题的分析和代码。
-
你解决了 Project Euler 问题 1 到 68 吗?需要一些概念来解决前面的一些问题,这些问题在这里对您很有帮助。
标签: python primes compiler-optimization