python - 大数的素数分解
问题描述
我正在尝试创建一个用于对数字进行素数分解的程序,这是我想出的代码。
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,那么我们将它附加到一个列表中。
我收到超时错误,无法弄清楚如何修复它。
任何帮助表示赞赏
解决方案
i
只有i
不除 n才能增加。此外,您可以只检查直到 的平方根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
素数相除的a j
。由于i
从2
到sqrt(n)
,它会在循环之前遇到。
推荐阅读
- css - 如何测试页面上使用了哪个@font-face unicode-code 版本?
- javascript - 从不同组件切换活动/非活动类角度
- scala - 是否可以在 Spark 阶段重新排序任务
- linux - IP 地址“XX.XX.XX.XX”的 RSA 主机密钥不在已知主机列表中
- android - 按钮在片段中不能立即工作
- java - Spring MVC 视图控制器重定向
- python - Visual Studio IntelliCode 不预测方法和变量
- python - Python按键删除列表中的字典
- mercurial - 是否可以通过 pretxncommit 钩子或任何其他方法将新文件添加到 mercurial 提交?
- indexing - 如何在 Solr/Lucene 中索引类型关系