正在尝试制作Python3素数生成器

正在尝试制作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

正如标题所示,我正在尝试制作一个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 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()
  • 您希望不断生成整数候选项并测试素性。您应该在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)
    来测试可整除性
  • 小调:通过观察d>5时,素数只能以1、3、7或9结束,您可以轻松地在素数筛上获得60%的性能提升。因此,不要执行
    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%的性能提升,通过观察你的主要筛子为