大数的素数分解
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
保持不变。
如果它不能除且ss
(i
可以除的次数)大于 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 < i
将i
与j
分隔为质数。由于i
从2
变为sqrt(n)
,它会在循环之前遇到。
【讨论】:
您能否解释一下代码的工作原理,它如何检查 i 是否为质数? 哪一行检查 i 的主要属性? 和之前的评论一样,不需要检查 i 是否是素数。以上是关于大数的素数分解的主要内容,如果未能解决你的问题,请参考以下文章
数学#素数判定Miller_Rabin+大数因数分解Pollard_rho算法 POJ 1811&2429
Prime Test POJ - 1811(素性检测+大数分解)