正在尝试制作Python3素数生成器
正如标题所示,我正在尝试制作一个Python 3功能的素数生成器,但我无法让它工作 代码如下:正在尝试制作Python3素数生成器,python,python-3.x,primes,Python,Python 3.x,Primes,正如标题所示,我正在尝试制作一个Python 3功能的素数生成器,但我无法让它工作 代码如下: import random def main(): d=1 x=random.randint while True: d=d+1 if isinstance(x/d, int)==True: print (x) else: main() main() 错误是: Traceback (most recent
import random
def main():
d=1
x=random.randint
while True:
d=d+1
if isinstance(x/d, int)==True:
print (x)
else: main()
main()
错误是:
Traceback (most recent call last):
File "/media/mint/casper-rw/ProjectsOrWork/Python/PrimeIdle.py", line 10, in <module>
main()
File "/media/mint/casper-rw/ProjectsOrWork/Python/PrimeIdle.py", line 7, in main
if isinstance(x/d, int)==True:
TypeError: unsupported operand type(s) for /: 'method' and 'int'
回溯(最近一次呼叫最后一次):
文件“/media/mint/casper-rw/ProjectsOrWork/Python/PrimeIdle.py”,第10行,在
main()
文件“/media/mint/casper-rw/ProjectsOrWork/Python/PrimeIdle.py”,第7行,在main中
如果isinstance(x/d,int)=真:
TypeError:/:“method”和“int”的操作数类型不受支持
不会将随机整数分配给x
,而是分配randint
函数。你应该做:
x = random.randint(min, max)
然而,这是你的问题中最小的一个——你的素数测试不起作用,它实际上不是一个生成器函数,你在每次递归调用中选择一个新的随机数
不会将随机整数分配给x
,而是分配randint
函数。你应该做:
x = random.randint(min, max)
然而,这是你的问题中最小的一个——你的素数测试不起作用,它实际上不是一个生成器函数,你在每次递归调用中选择一个新的随机数
不会将随机整数分配给x
,而是分配randint
函数。你应该做:
x = random.randint(min, max)
然而,这是你的问题中最小的一个——你的素数测试不起作用,它实际上不是一个生成器函数,你在每次递归调用中选择一个新的随机数
不会将随机整数分配给x
,而是分配randint
函数。你应该做:
x = random.randint(min, max)
然而,这是你的问题中最小的一个——你的基本测试不起作用,它实际上不是一个生成器函数,你在每次递归调用时都会选择一个新的随机数。代码在底部,但试着根据以下建议编写你自己的代码,这对你更有教育意义:
x=random.randint
实际上没有调用randint()
main()
。这将导致堆栈无限增长并最终溢出。(如果您知道自己不会返回,请不要进行递归调用)。而且,您不能从非常深的递归链中轻松地返回。。。使用print(x)
来回避这一点,你是在偷懒
generate\u divisior()
的生成器和一个谓词函数is\u prime()
(返回True/False)is_prime()
将遍历并返回True如果(isinstance(x/d,int)==True)
不好,请注意大x/d上的截断错误,使用如果(x%d==0)
来测试可整除性d=d+1
(或d+=1
),您将生成大量的复合因子并减少少量素数。(事实上,您正在生成大量的复合除数,如27或51,然后用这些除数测试可除性,这完全是浪费时间,因为您已经测试了3和17的可除性。)随机导入
从数学导入sqrt,楼层
def generate_prime_candidate():
“”“用于生成随机素数候选项的生成器”“”
生成random.randint()#可能会生成randint(2,2**32-1)。由你决定。
def find_random_prime():
x=生成素数候选项()
而不是_素数(x):
x=生成素数候选项()
#找到一个!
打印(x)
返回x
def是素数(x):#通常我们称之为整数n,浮点数x,但不管怎样。。。
对于生成因子中的d(floor(sqrt(x)):#只搜索到sqrt(x)
如果x%d==0:
返回False#x是复合的-d是除数
返回真值#x为素数
def生成除数(dmax):
“”“生成除数,上限为。我们排除了容易被认为是复合数的数字:余数0,2,4,5,6,8模10”“”
收益率2
收益率3
产量5#现在对于d>5,按残基排除它们
d=7
虽然d代码位于底部,但请尝试根据以下建议编写自己的代码,这对您更有教育意义:
x=random.randint
实际上没有调用randint()
您希望不断生成整数候选项并测试素性。您应该在while循环中执行此操作,而不是每次候选者测试组合时都递归到main()
。这将导致堆栈无限增长并最终溢出。(如果您知道自己不会返回,请不要进行递归调用)。而且,您不能从非常深的递归链中轻松地返回。。。使用print(x)
来回避这一点,你是在偷懒
出于所有这些原因,以及良好的分解,将其划分为一个名为generate\u divisior()
的生成器和一个谓词函数is\u prime()
(返回True/False)
您的主循环:下面介绍如何使其非递归,并将其转换为while循环。对于任何整数x,您只需要测试由(素数)除数到下限(sqrt(x))的可除性。如果它不能被这些除数中的任何一个除数整除,那么它就是素数,因此is_prime()
将遍历并返回True
您的可整除性测试:如果(isinstance(x/d,int)==True)
不好,请注意大x/d上的截断错误,使用如果(x%d==0)
来测试可整除性
小调:你可以很容易地得到60%的性能提升,通过观察你的主要筛子为