程序将数字分解为两个较小的素数

时间:2011-06-06 15:08:06

标签: python primes

我有一个非常大的数字,我想制作一个程序,找到两个素数,如果相乘则会给出原始数字。

Ex.
Original_number = 299

// The program should get these two numbers:

q = 13
p = 23

程序在开始时运行良好,但在某个时刻,它只是停止,我不确定是什么问题。 代码:

import time
import math

def main():
    time1 = time.clock()
    q  = int(0)
    p = int(0)
    finalnumber = int(377)


    print("in main \n")
    print("q = ", q)
    print("\n p = ", p)

    gotResult = 0

    while(gotResult == 0):

        p = GetNextPrime(p)

        if(p >= finalnumber):
            q = GetNextPrime(q)
            p = q
            p = GetNextPrime(p)

        if(q * p == finalnumber):
            gotResult == 1
            break

    print("q = ", q)
    print("\n p = ", p)
    time2 = time.clock()

    ElapsedTime = time2 - time1
    print("Elapsed time: ", ElapsedTime)


def GetNextPrime(prime):
    print("in GetNextPrime \n")
    isPrime = 0

    while(isPrime == 0):
        prime = prime + 1
        if(IsPrime(prime)== 1):
            isPrime = 1

    return prime

def IsPrime(prime):
    print("in IsPrime \n")
    isPrime = 0
    i = 2

    while(i <= math.sqrt(prime)):
        if(i % 2 == 0):
            i = i+1
        if(prime % i == 0):
            isPrime = 1
            break


    return isPrime

#start of program here
main()

我已经在python中编写了程序,我知道它可能不太好,因为我是python的新手。(我一直在编写C ++,我甚至不擅长它) 但我希望你能帮我找到问题:)

PS。原始号码的最大大小是多少?它可以有多少密码?

5 个答案:

答案 0 :(得分:3)

只是将一个数字分解。您将获得一系列素因子。如果列表中只包含两个数字,并且这些数字适合您的目的,那么您就赢了。否则尝试另一个号码。

但上述方法非常浪费。我宁愿拿一个素数列表,生成所有素数并乘以。结果将是一个数字列表,它们只能被分解为2个素数。像这样:

some_primes = [2, 3, 5, 7, 11] # you can generate a better list
my_numbers = [x*y for x in some_primes for y in some_primes]

答案 1 :(得分:2)

一种简单的方法是试验分裂:

import math
def factors(number):
    return [(x, number / x)  for x in range(int(math.sqrt(number)))[2:] if not number % x]

然后factors(299)返回[(13,23)]

此方法存在大数问题:

  1. 大数字可能超过python整数限制(在sys.maxint中找到)。 64位机器将限制为18位十进制数。

  2. 保理大数字是一个难题,也是一个开放的研究问题。试验分裂就像它来的那样蛮力,但它适用于较小的数字。否则,您将很快需要更复杂的算法。有关讨论,请参阅wikipedia

  3. 如果你要蛮力数字问题,python是错误的语言。相同的算法在C ++等编译语言中运行得更快。

答案 2 :(得分:1)

isPrime错了。当数字时,您返回1。你也永远不会测试这个数字是否可以除以2.我看起来没什么了。

Protip:Python不是C.有True, False,你不需要if, while中的所有括号。

你应该真正测试你编写的每个函数,而不是整个程序 - 它不会告诉你bug的位置。

答案 3 :(得分:1)

除了Jochel Ritzel和DSM的答案之外,main()while循环中的逻辑无法解释当数字不是两个素数的乘积时(然后它将进入无限循环)的情况。

此外,如果您希望计算非常大的数字(例如超过20-30位),您的方法可能太慢了。如果你想获得可接受的结果,你应该至少使用Erastothenes筛子来提前产生足够大的质数列表。

有(非常复杂的)算法可以处理更大的案例,但总的来说,这是一个难题,而且它的解决方案在数字位数上的表现非常糟糕。

答案 4 :(得分:0)

在以下逻辑中:

while(i <= math.sqrt(prime)):
    if(i % 2 == 0):
        i = i+1
    if(prime % i == 0):
        isPrime = 1
        break

如果我是奇数并且素数不能被它整除,那么它将永远循环,并且它会被卡在3上。[已经指出了另一个明显的问题。]