我在这个网站上看到过很多在python中进行整数分解的方法,但是并没有真正理解它们,所以我试着按照自己的方式去做:
def factorisation(n):
fact = []
i = 2
while i<=n:
if n%i==0:
fact.append(i)
n//= i
else:
i+=1
return fact
我认为它有效,但我真的不知道为什么从i到n的while循环...从我的课程中我了解到,如果从2到sqrt(n)我们必须这样做。 我误解了什么吗? 我能改进吗? 谢谢:))
答案 0 :(得分:1)
当整数n
不能被sqrt(n)
之前的任何数字整除时,这足以表明n
是素数。在这种情况下,除了n
本身之外,您将找不到任何其他因素。
所以你可以做的是在sqrt(n)
处停止循环,并将剩余的n
值添加到素数因子列表中。
答案 1 :(得分:1)
您可以使用Pollard's rho integer factorization algorithm。与其他慢得多的算法相比,它是高效且快速的。例如:
from math import gcd
def factorization(n):
factors = []
def get_factor(n):
x_fixed = 2
cycle_size = 2
x = 2
factor = 1
while factor == 1:
for count in range(cycle_size):
if factor > 1: break
x = (x * x + 1) % n
factor = gcd(x - x_fixed, n)
cycle_size *= 2
x_fixed = x
return factor
while n > 1:
next = get_factor(n)
factors.append(next)
n //= next
return factors
数字很小,速度非常快,在这种情况下,只花了0.035
秒。
print(factorization(823767))
~$ time python3 factorization.py
[3, 7, 39227]
real 0m0,035s
user 0m0,031s
sys 0m0,004s
如果我们使用稍大的数字,则计算时间会增加,但是仍然非常快,在这种情况下仅为0.038
秒。
print(factorization(41612032092))
~$ time python3 factorization.py
[3, 4, 37, 1681, 127, 439]
real 0m0,038s
user 0m0,034s
sys 0m0,004s
如果我们使用非常大的数字,则需要花费更多时间,但是考虑到这是一个巨大的数字,这仍然是一个非常合理的时间。在这种情况下,只需28.128
秒。
print(factorization(23756965471926357236576238546))
~$ time python3 factorization.py
[3, 3, 2, 479, 11423, 582677, 413975744296733]
real 0m28,128s
user 0m28,120s
sys 0m0,008s
我希望它能对您有所帮助。问候。
答案 2 :(得分:-2)
如果您正在寻找最小因素(例如在素性测试中),您只需要去楼(sqrt(n))。如果你想要所有因素,那么你应该从0到n / 2进行检查。
简而言之:
素性:
n = int(input('Please input a number: ')
sn = int(sqrt(n))
for x in range(2,sn+1):
if n%x == 0:
print('Not prime. Divisible by: '+str(x))
print(str(n)+' is prime')
因式分解:
n = int(input('Please input a number: ')
n2 = int(n/2)
fn = []
for x in range(2,n2+1):
if n%x == 0:
fn.append(x) #lower member of factor pair
fn.append(n/x) #upper member of factor pair
print('N has the following factors: '+str(fn))
我希望这有助于你理解。