代码之家  ›  专栏  ›  技术社区  ›  Maxxx

用python计算素数因子

  •  -1
  • Maxxx  · 技术社区  · 6 年前

    我目前有一个包含数字的列表:

    lst = [3,4,6]
    

    我试图计算列表中数字的素数因子,在这里我得到

    3^1
    2^2
    2^1 x 3^1
    

    以下是我尝试过的:

    def prime_factors(lst):
       for j in range(len(lst)):
           i = 2
           factors = []
           while i*i <= j:
               if j%i:
                   i+=1
               else:
                   j//= i
                   factors.append(i)
           if j > 1:
               factors.append(j)
      return factors
    

    但我得到[2]作为输出。如果能帮上忙,我将不胜感激。

    1 回复  |  直到 6 年前
        1
  •  0
  •   Albin Paul    6 年前

    我从头开始做的,它使用了质数筛算法的修改。

    from math import sqrt
    from collections import Counter
    def prime_factors(lst):
        maximumnumber=max(lst)
        primesieve=[0]*(maximumnumber+1)
        primesieve[0]=1
        primesieve[1]=1
        #DOING PRIME NUMBER SIEVE
        for i in range(2,int(sqrt(maximumnumber))+1):
            if(primesieve[i]==0):
                for j in range(2*i,len(primesieve),i):
                    primesieve[j]=i
    
        for j in range(len(lst)):
            num=lst[j]
            factors=[]
            #take each number(num) and divided it by a prime number (primesieve[num])
            #do it until you find no more prime factors for number
            while(primesieve[num]>0):
    
                factors.append(primesieve[num])
                num=num//primesieve[num]
            factors.append(num)
            yield Counter(factors)
    
    for i in prime_factors([3,4,6]):
        print(i)
    

    输出

    Counter({3: 1})
    Counter({2: 2})
    Counter({2: 1, 3: 1})
    

    我来解释一下我做了什么

    1. 使用素数筛选算法找到列表中0和最大元素之间的素数, Link 对于算法的一部分,我只是修改了算法的一部分,而不是使用素数数组作为布尔值,整数来显示它与哪个数相除
    2. 遍历这些数字,找出所有的素因子