Prime factorization - list

前端 未结 17 782
说谎
说谎 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

    I've tweaked @user448810's answer to use iterators from itertools (and python3.4, but it should be back-portable). The solution is about 15% faster.

    import itertools
    
    def factors(n):
        f = 2
        increments = itertools.chain([1,2,2], itertools.cycle([4,2,4,2,4,6,2,6]))
        for incr in increments:
            if f*f > n:
                break
            while n % f == 0:
                yield f
                n //= f
            f += incr
        if n > 1:
            yield n
    

    Note that this returns an iterable, not a list. Wrap it in list() if that's what you want.

    0 讨论(0)
  • 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.

    0 讨论(0)
  • 2020-11-27 05:10

    prime factors of a number:

    def primefactors(x):
        factorlist=[]
        loop=2
        while loop<=x:
            if x%loop==0:
                x//=loop
                factorlist.append(loop)
            else:
                loop+=1
        return factorlist
    
    x = int(input())
    alist=primefactors(x)
    print(alist)
    

    You'll get the list. If you want to get the pairs of prime factors of a number try this: http://pythonplanet.blogspot.in/2015/09/list-of-all-unique-pairs-of-prime.html

    0 讨论(0)
  • 2020-11-27 05:17

    This is the code I made. It works fine for numbers with small primes, but it takes a while for numbers with primes in the millions.

    def pfactor(num):
    div = 2
    pflist = []
    while div <= num:
        if num % div == 0:
            pflist.append(div)
            num /= div
        else:
            div += 1
    # The stuff afterwards is just to convert the list of primes into an expression
    pfex = ''
    for item in list(set(pflist)):
        pfex += str(item) + '^' + str(pflist.count(item)) + ' * '
    pfex = pfex[0:-3]
    return pfex
    
    0 讨论(0)
  • 2020-11-27 05:19

    I would like to share my code for finding the prime factors of number given input by the user:

    a = int(input("Enter a number: "))
    
    def prime(a):
        b = list()
        i = 1
        while i<=a:
            if a%i ==0 and i!=1 and i!=a:
                b.append(i)
            i+=1
        return b
    
    c = list()
    for x in prime(a):
        if len(prime(x)) == 0:
            c.append(x)
    
    print(c)
    
    0 讨论(0)
  • 2020-11-27 05:20
        from sets import Set
        # this function generates all the possible factors of a required number x
        def factors_mult(X):
            L = []
            [L.append(i) for i in range(2,X) if X % i == 0]
            return L
    
        # this function generates list containing prime numbers upto the required number x 
        def prime_range(X):
            l = [2]
            for i in range(3,X+1):
                for j in range(2,i):
                   if i % j == 0:
                   break
                else:    
                   l.append(i)
            return l
    
        # This function computes the intersection of the two lists by invoking Set from the sets module
        def prime_factors(X):
            y = Set(prime_range(X))
            z = Set(factors_mult(X))
            k = list(y & z)
            k = sorted(k)
    
            print "The prime factors of " + str(X) + " is ", k
    
        # for eg
        prime_factors(356)
    
    0 讨论(0)
提交回复
热议问题