大数的素数分解

Posted

技术标签:

【中文标题】大数的素数分解【英文标题】:Prime factorization of a big number 【发布时间】:2020-01-29 05:45:40 【问题描述】:

我正在尝试创建一个用于对数字进行素数分解的程序,这是我想出的代码。

def primeFactors(n):
    l=[]
    ss=0
    for i in range(2,n,1):
    #checking for prime
        t=0
        for j in range(2,i):
            if(i==2):
                continue
            if(i%j==0):
                t=t+1   
        if(t>0):
            continue
        else:
            if(n==0):
                break
            else:
                print(i)
                if(n%i==0):
                    n=n//i
                    ss=ss+1
                    i=i-1
                if(n%i!=0 and ss>0):
                    l.append(i)
                    l.append(ss)
                    ss=0
                else:
                    continue
    q=""
    for i in range(0,len(l),2):
        q=q+"("+str(l[i])+"**"+str(l[i+1])+")"
    return q

代码的工作原理如下:

    它检查外循环中的数字是否为素数。 如果它是素数,则继续检查用n 除数是否会产生余数 0,如果是,则除以。 增加ss,这是在整个因式分解中使用素数的次数。另外,减少i 的值,这样当它在循环结束时递增时,再次检查i 是否可以除以n 保持不变。 如果它不能除且ssi 可以除的次数)大于 0,那么我们将其附加到列表中。

我遇到了超时错误,无法弄清楚如何解决它。

感谢任何帮助

【问题讨论】:

这可能是因为您检查了直到n 的所有除数。最多检查 n 的平方根就足够了。 我试试 它可以工作,但输出完全关闭 For (4 * * 3)(10 * *2)(16 * * 1) 应该等于 '(2 * *2)(3 * *3) (5)(7)(11 * * 2)(17) 有什么方法可以通过其他方式防止增量,以便我可以再次检查同一个素数的可分性 我的代码运行,但它仍然增加 i 的值,即使使用 i-1 行,它也不会再次检查可分性 【参考方案1】:

只有当i不除n时,你才能增加i。 此外,您可以一直检查直到n 的平方根,因为如果i 除以n,则i <= sqrt(n)

例子:

import math

def prime_factors(n):

    i, factors = 2, []

    while n > 1 and i <= int(math.sqrt(n)):
        if n%i == 0:
            n/=i
            factors.append(i)
        else:
            i+=1

    if n > 1:
        factors.append(int(n))

    return factors


>>> prime_factors(64)
[2, 2, 2, 2, 2, 2]
>>> prime_factors(28)
[2, 2, 7]
>>> prime_factors(31)
[31]

注意。您无需检查 i 是否为质数。 i 不能不是质数,因为如果i 不是质数,那么将存在一个j &lt; iij 分隔为质数。由于i2 变为sqrt(n),它会在循环之前遇到。

【讨论】:

您能否解释一下代码的工作原理,它如何检查 i 是否为质数? 哪一行检查 i 的主要属性? 和之前的评论一样,不需要检查 i 是否是素数。

以上是关于大数的素数分解的主要内容,如果未能解决你的问题,请参考以下文章

数学#素数判定Miller_Rabin+大数因数分解Pollard_rho算法 POJ 1811&2429

Prime Test POJ - 1811(素性检测+大数分解)

大素数判断和素因子分解(miller-rabin,Pollard_rho算法) 玄学快

Java中带指数的素数分解

具有素数列表的高效素数分解算法

蛮力,单线程素数分解