素数查找器 - 优化

时间:2015-05-17 16:32:16

标签: python python-2.7

我正在尝试构建一个尽可能快速工作的素数查找器。这是程序中包含的def函数。我在一个细节方面遇到了问题,我在下面的{方括号}中提到了这个细节。我还解释了主要参数。

import math
def is_prime(x):
    c=0      #a simple counter
    a=7      #a (+ k*6)a group of all possible deviders of the number(if 2,3 and 5 are taken away)
    b=11      #the other group
    {r=x**(1/2)}      #root of the number
    {f=math.floor(r)}       #floor of the root
    if x%2!=0 and x%3!=0 and x%5!=0:      #eliminate all multiples of 2,3 and 5
        while (c==0 and {a<f}):         #while loop
                if x%a==0 or x%b==0:
                        c+=1          #if true -> will break
                a+=6        #adding 6 to a and b (numbers that have a potential to devide
                b+=6
        if c==0:       #if a number not divisable by anything, return number
            return x

此功能无法正常工作。如果不是我的数字的平方根,我只需用x / 3替换它就可以了。但问题是我不想在x **(1/2)和x / 3之间检查所有可能的分频器,因为它只会减慢功能,没有别的。所以这是有效的代码:

import math
def is_prime(x):
c=0
a=7
b=11
if x%2!=0 and x%3!=0 and x%5!=0:
        while (c==0 and a<x/3):
                if x%a==0 or x%b==0:
                        c+=1
                a+=6
                b+=6
        if c==0:
            return x

如果有人发现问题,请帮助:D

1 个答案:

答案 0 :(得分:1)

正如上面的评论所指出的,python2执行整数除法,因此1/2 == 0

  • 您可以将根写为:

    x**0.5
    
  • 或使用math.sqrt:

    math.sqrt(x)
    

天真的素性测试可以像这样实现:

def is_prime(n):
    if n<=1: return False
    if n<=3: return True
    if not n%2 or not n%3: return False
    i=5
    while i*i<=n:
        if n%i==0: return False
        i+=2
        if n%i==0: return False
        i+=4
    return True