Prime factorization - list

前端 未结 17 864
说谎
说谎 2020-11-27 05:06

I am trying to implement a function primeFac() that takes as input a positive integer n and returns a list containing all the numbers in the prime

17条回答
  •  暗喜
    暗喜 (楼主)
    2020-11-27 05:10

    Here is my version of factorization by trial division, which incorporates the optimization of dividing only by two and the odd integers proposed by Daniel Fischer:

    def factors(n):
        f, fs = 3, []
        while n % 2 == 0:
            fs.append(2)
            n /= 2
        while f * f <= n:
            while n % f == 0:
                fs.append(f)
                n /= f
            f += 2
        if n > 1: fs.append(n)
        return fs
    

    An improvement on trial division by two and the odd numbers is wheel factorization, which uses a cyclic set of gaps between potential primes to greatly reduce the number of trial divisions. Here we use a 2,3,5-wheel:

    def factors(n):
        gaps = [1,2,2,4,2,4,2,4,6,2,6]
        length, cycle = 11, 3
        f, fs, nxt = 2, [], 0
        while f * f <= n:
            while n % f == 0:
                fs.append(f)
                n /= f
            f += gaps[nxt]
            nxt += 1
            if nxt == length:
                nxt = cycle
        if n > 1: fs.append(n)
        return fs
    

    Thus, print factors(13290059) will output [3119, 4261]. Factoring wheels have the same O(sqrt(n)) time complexity as normal trial division, but will be two or three times faster in practice.

    I've done a lot of work with prime numbers at my blog. Please feel free to visit and study.

提交回复
热议问题