Python 如何改进project Euler 580解决方案

Python 如何改进project Euler 580解决方案,python,Python,以下是问题文本: 希尔伯特数是形式为4k+14k+1的任意正整数,表示整数k≥0k≥0我们将无平方希尔伯特数定义为一个希尔伯特数,它不能被除一之外的任何希尔伯特数的平方整除。例如,117117是无平方希尔伯特数,等于9×139×13。然而,62376237是一个希尔伯特数,在这个意义上不是平方自由的,因为它可以被9292整除。数字39693969也不是无平方的,因为它可以被9292和212212整除 107107以下有23271922327192个无平方希尔伯特数。 10161016以下有多少个

以下是问题文本:

希尔伯特数是形式为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
aka
pow(10,7)
需要多长时间。现在想象一下数到战俘(10,16)需要什么。 这只是i循环时
中的计数-这不包括调用
if_squrefree()

在我的箱子上。从1->1000000开始计数需要1.4秒。所以通过数学
从1->1000000000000开始计算需要约45年时间。因此,这种方法不起作用。

如果您的代码正在运行,并且您希望对其进行优化,那么您应该尝试