python中的整数分解

时间:2015-09-30 16:45:26

标签: python

我在这个网站上看到过很多在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)我们必须这样做。 我误解了什么吗? 我能改进吗? 谢谢:))

3 个答案:

答案 0 :(得分:1)

当整数n不能被sqrt(n)之前的任何数字整除时,这足以表明n是素数。在这种情况下,除了n本身之外,您将找不到任何其他因素。

所以你可以做的是在sqrt(n)处停止循环,并将剩余的n值添加到素数因子列表中。

答案 1 :(得分:1)

您可以使用Pollard's rho integer factorization algorithm。与其他慢得多的算法相比,它是高效且快速的。例如:

Python 3:

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

我希望这有助于你理解。