是否有解决半素数的Python程序?

时间:2016-08-15 21:22:31

标签: python-2.7

所以我有一个公式可以比一遍又一遍地乘以每对素数更快地解决半素数!因此,不必使用长猜和检查(如下所示),而是使用基本分割。

semi prime = 15 ... 2 * 3, 2 * 5, 2 * 7, 3 * 5 ... primes 3 and 5

这是我的方式

semi prime = 15 ... 2 / 15, 3 / 15 ... primes ... primes 3 and 5

它不会在这里改变很多长度,但它会在更大的半素数中改变。但现在我想知道是否有一个python程序可以为我做这个?到目前为止,我不能做一个,但我正在努力。

2 个答案:

答案 0 :(得分:2)

你想要的是对数字进行分解,这里是一个如何

的例子
def prime_generator(n):
    """produce all the prime numbers less or equal to n"""
    #put here the code for this

def prime_factorization(n):
    """return a list of with the all prime factors of n including their multiplicity""" 
    result=[]
    for p in prime_generator(n):
        while n%p==0: #while p divide n...
            result.append(p)
            n = n//p
        if n<=1:
            break
     return result

def is_semi_prime(n):
    factors = prime_factorization(n)   
    if len(factors) == 2:
        print n, "is a semi prime with those prime factors:", factors
    else:
        print n, "is not a semi-prime"

is_semi_prime( input("enter a number: ") )

这里有趣的部分是prime_generator,它可以像使用is_prime函数(例如filter(is_prime,xrange(2,n+1)))过滤数字一样简单,或者更像{{3}更专业的内容}}

修改

以上使用一般方法解决问题可以通过专门的检查进一步改进,因为半素数只有两个因素,然后我们只需要找到第一个,从数字中删除它,如果剩下的是我们找到了它。为此,我们需要一个素数检查函数和素数生成器

def is_prime(n):
    #put here the code for this 


def prime_generator(n):
    #put here the code for this


def is_semi_prime(n):
    p1,p2 = 0,0
    for p1 in prime_generator(n):
        if n%p1==0:
            p2 = n//p1
            break
    if is_prime(p2):
        print n, "is a semi prime with those prime factors:", p1, p2
    else:
        print n, "is not a semi-prime"

is_semi_prime( input("enter a number: ") )

我认为这是您尝试解释的算法,因为您可以看到不需要仅搜索第一个(p2)的第二个素数(p1)而另一个将如果它存在,它会自然出现。

我将这两项功能留作练习。

对于is_prime,您可以像在答案中那样使用简单的试验部门,顺便说一下,无法识别2作为素数,或者像Sieve of Eratostenes更强大的testMiller-Rabin test)(您可以在Deterministic variants)或http://rosettacode.org中找到工作版本。

对于你可以使用的prime_generator,正如我在Eratostenes的Sieve之前提到的,或者使用无限素数发生器。例如,您可以找到以下问题:Baillie-PSW testSieve of eratosthenes finding primes python。后者是我最喜欢的

答案 1 :(得分:1)

从来没有想过,我把它弄清楚了。

import math

running = True

prime_1 = 0
prime_2 = 0
semi_prime = 0

n = 0

semi_prime = input('Enter Semi-Prime: ')

while running:

    if prime_1 * prime_2 == semi_prime:

        print('your 2 primes are')
        print([prime_1])
        print([prime_2])
        running = False

    else:

        n += 1

        def is_prime(number):
              if number < 2:
                    return False
              if number % 2 == 0:
                    return False
              else:
                    for i in range(3, number):
                          if not number % i:
                                return False
                    return True



        #This array stores all the prime numbers found till n
        primes = []

        for i in range(100000):
              if is_prime(i):
                    primes.append(i)
              if len(primes) == n:
                    break

        print("next prime is " + str(primes[n-1]))

        prime_1 = primes[n-1]
        prime_2 = semi_prime / primes[n-1]