Python 如何改进project Euler 580解决方案
以下是问题文本: 希尔伯特数是形式为4k+14k+1的任意正整数,表示整数k≥0k≥0我们将无平方希尔伯特数定义为一个希尔伯特数,它不能被除一之外的任何希尔伯特数的平方整除。例如,117117是无平方希尔伯特数,等于9×139×13。然而,62376237是一个希尔伯特数,在这个意义上不是平方自由的,因为它可以被9292整除。数字39693969也不是无平方的,因为它可以被9292和212212整除 107107以下有23271922327192个无平方希尔伯特数。 10161016以下有多少个无平方希尔伯特数 下面是我的代码。我怎样才能使它更快Python 如何改进project Euler 580解决方案,python,Python,以下是问题文本: 希尔伯特数是形式为4k+14k+1的任意正整数,表示整数k≥0k≥0我们将无平方希尔伯特数定义为一个希尔伯特数,它不能被除一之外的任何希尔伯特数的平方整除。例如,117117是无平方希尔伯特数,等于9×139×13。然而,62376237是一个希尔伯特数,在这个意义上不是平方自由的,因为它可以被9292整除。数字39693969也不是无平方的,因为它可以被9292和212212整除 107107以下有23271922327192个无平方希尔伯特数。 10161016以下有多少个
from math import sqrt
def if_squarefree(x):
i = 1
maybe = 0
while maybe < int(sqrt(x)) + 1 :
tmp = 4 * i + 1
maybe = tmp * tmp
if x % maybe == 0 :
return False
i = i + 1
return True
def find_squarefree() :
end = pow(10,16)
i = pow(10,7)
cnt = 0
while i < end :
print i
tmp = 4 * i + 1
if if_squarefree(tmp) :
cnt = cnt + 1
i = i + 1
return cnt
find_squarefree()
从数学导入sqrt
def如果_平方自由(x):
i=1
可能=0
而可能
谢谢:)我认为你做得不对。尝试运行此程序:
from __future__ import absolute_import, division, print_function
from datetime import datetime
start = datetime.utcnow()
i = 0
while True:
i += 1
if i % 10**7 == 0:
print(i)
print((datetime.utcnow() - start ).total_seconds())
注意计数到10**7
akapow(10,7)
需要多长时间。现在想象一下数到战俘(10,16)需要什么。
这只是i中的计数-这不包括调用if_squrefree()
在我的箱子上。从1->1000000开始计数需要1.4秒。所以通过数学
从1->1000000000000开始计算需要约45年时间。因此,这种方法不起作用。如果您的代码正在运行,并且您希望对其进行优化,那么您应该尝试