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

Python 将一个数分解为两个较小素数的程序,python,primes,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)

我有一个非常大的数字,我想做一个程序,找到两个素数,如果相乘,就会得到原始的数字

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()
导入时间
输入数学
def main():
time1=time.clock()
q=int(0)
p=int(0)
最终编号=整数(377)
打印(“主\n中”)
打印(“q=”,q)
打印(“\n p=”,p)
结果=0
而(gotResult==0):
p=GetNextTime(p)
如果(p>=最终编号):
q=GetNextTime(q)
p=q
p=GetNextTime(p)
如果(q*p==最终编号):
gotResult==1
打破
打印(“q=”,q)
打印(“\n p=”,p)
time2=time.clock()
ElapsedTime=time2-time1
打印(“运行时间:”,ElapsedTime)
def GetNextTime(主):
打印(“在GetNextTime中\n”)
isPrime=0
而(isPrime==0):
素数=素数+1
如果(IsPrime(prime)==1):
isPrime=1
返回素数
def iPrime(基本):
打印(“在iPrime中\n”)
isPrime=0
i=2

while(i只需对一个数字进行因式分解。您将得到一个素数因子列表。如果该列表正好包含两个数字,并且这些数字符合您的目的,则您获胜。否则,请尝试另一个数字

但是上面的方法是非常浪费的。我宁愿得到一个素数列表,生成它的所有对并相乘。结果将是一个数字列表,它只能分解为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]

只需对一个数字进行因式分解。您将得到一个素因子列表。如果该列表正好包含两个数字,并且这些数字符合您的目的,则您获胜。否则,请尝试另一个数字

但是上面的方法是非常浪费的。我宁愿得到一个素数列表,生成它的所有对并相乘。结果将是一个数字列表,它只能分解为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]

isPrime
是错误的。当数字是而不是prime时,你返回1。而且你从来没有测试过这个数字是否可以除以2。我没有看得更远

Protip:Python不是C。有
真、假
,并且不需要
if、while
中的所有括号


你应该真正测试你编写的每一个函数,而不是整个程序-这不会告诉你错误在哪里。

isPrime
是错误的。当数字是而不是prime时,你会返回1。而且,你从来不会测试这个数字是否可以除以2。我没有看得更远

Protip:Python不是C。有
真、假
,并且不需要
if、while
中的所有括号


您应该真正测试您编写的每一个函数,而不是整个程序-这不会告诉您错误在哪里。

按照以下逻辑:

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

while(i在以下逻辑中:

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

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

此外,如果你想计算出非常大的数字(比如超过20-30位),那么你的方法可能太慢了。如果你想得到可接受的结果,你至少应该使用Erastothenes筛来提前生成足够大的素数列表


有(相当复杂的)算法来处理更大的情况,但一般来说,这是一个困难的问题,解决方案的位数伸缩性非常差。

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

此外,如果你想计算出非常大的数字(比如超过20-30位),那么你的方法可能太慢了。如果你想得到可接受的结果,你至少应该使用Erastothenes筛来提前生成足够大的素数列表


有(相当复杂的)算法来处理较大的案例,但一般来说,这是一个困难的问题,其解决方案在数字数量上的伸缩性非常差。

一种简单的方法是试算法:

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)]

此方法在处理大量数据时存在问题:

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

  • 分解大数是一个困难的问题,也是一个开放的研究问题。尝试除法是一个非常残酷的问题,但它适用于较小的数。否则,您将很快需要一个更复杂的算法。有关讨论,请参阅

  • <> > P>如果您要使用蛮力数值问题,Python是错误的语言。相同的算法在编译语言如C++中运行得更快。


    一个简单的方法是试办:

    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)]

    此方法在处理大量数据时存在问题:

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

  • 分解大数是一个困难的问题,也是一个开放的研究问题。尝试除法是一个非常残酷的问题,但它适用于较小的数。否则,您将很快需要一个更复杂的算法。有关讨论,请参阅

  • <> > P>如果您要使用蛮力数值问题,Python是错误的语言。相同的算法在编译语言如C++中运行得更快。


    请注意一个素数不能是两个素数的乘积。你是说相对素数吗?
    gotreult==1
    compa