web-dev-qa-db-ja.com

素因数分解-リスト

入力として正の整数nを取り、nの素因数分解のすべての数値を含むリストを返す関数primeFac()を実装しようとしています。

私はここまで来ましたが、ここで再帰を使用する方が良いと思います、ここで再帰コードを作成する方法がわかりません、基本ケースは何ですか?で開始する。

私のコード:

def primes(n):
    primfac = []
    d = 2
    while (n > 1):
         if n%d==0:
             primfac.append(d)
    # how do I continue from here... ?
22
Snarre

簡単なトライアル部門:

_def primes(n):
    primfac = []
    d = 2
    while d*d <= n:
        while (n % d) == 0:
            primfac.append(d)  # supposing you want multiple factors repeated
            n //= d
        d += 1
    if n > 1:
       primfac.append(n)
    return primfac
_

O(sqrt(n))の複雑さ(最悪の場合)。特殊なケース2と奇数のdのみをループする(または、より小さな素数を特殊なケースにして、可能な限り少ない除数をループする)ことで簡単に改善できます。

43
Daniel Fischer

primefac module は、数学者が何世紀にもわたって開発したすべての派手な手法で因数分解を行います:

#!python

import primefac
import sys

n = int( sys.argv[1] )
factors = list( primefac.primefac(n) )
print '\n'.join(map(str, factors))
10
brian d foy

これは、試行分割による因子分解の私のバージョンです。これには、Daniel Fischerによって提案された2つと奇数の整数だけで分割する最適化が組み込まれています。

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

2および奇数による試行除算の改善は、wheel factorizationです。部門。ここでは、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
_

したがって、print factors(13290059)は_[3119, 4261]_を出力します。ファクタリングホイールは、通常の試行分割と同じO(sqrt(n))時間の複雑さを持ちますが、実際には2〜3倍高速になります。

私のブログ で素数を使って多くの仕事をしました。気軽に見学してください。

6
user448810

上記のソリューションのほとんどはやや不完全に見えます。素因数分解は、数(e.g. 9 = [3 3])の各素因数を繰り返します。

また、上記のソリューションは、実装の利便性のために遅延関数として記述できます。

sieve Of Eratosthenesを使用してテストする素数を見つけるのが最適ですが、上記の実装では、必要以上のメモリを使用していました。

"wheel factorization"がnの除算テストのために素因数のみを適用するよりも優れているかどうか/どのように確信していません。

これらの解決策は確かに有用ですが、次のことをお勧めします2つの機能-

機能-1:

def primes(n):
    if n < 2: return
    yield 2
    plist = [2]
    for i in range(3,n):
        test = True
        for j in plist:
            if j>n**0.5:
                break
            if i%j==0:
                test = False
                break
        if test:
            plist.append(i)
            yield i

機能2:

def pfactors(n):
    for p in primes(n):
        while n%p==0:
            yield p
            n=n//p
            if n==1: return

list(pfactors(99999))
[3, 3, 41, 271]

3*3*41*271
99999

list(pfactors(13290059))
[3119, 4261]

3119*4261
13290059
3
Mike Lisanke

@ user448810の答えを微調整して、itertoolsのイテレータ(およびpython3.4ですが、バックポータブルにする必要があります)を使用します。ソリューションは約15%高速です。

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

これはリストではなく反復可能なものを返すことに注意してください。必要な場合は、list()でラップします。

3
Chris Cogdon
def get_prime_factors(number):
    """
    Return prime factor list for a given number
        number - an integer number
        Example: get_prime_factors(8) --> [2, 2, 2].
    """
    if number == 1:
        return []

    # We have to begin with 2 instead of 1 or 0
    # to avoid the calls infinite or the division by 0
    for i in xrange(2, number):
        # Get remainder and quotient
        rd, qt = divmod(number, i)
        if not qt: # if equal to zero
            return [i] + get_prime_factors(rd)

    return [number]
1
kadi

数の素因数:

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)

リストを取得します。数の素因数のペアを取得したい場合は、これを試してください: http://pythonplanet.blogspot.in/2015/09/list-of-all-unique-pairs-of-prime.html

0
user5342177
def prime_factors(num, dd=2):
    while dd <= num and num>1:
        if num % dd == 0:
            num //= dd
            yield dd
        dd +=1

上記の多くの答えは、小さな素数では失敗します。 3、5、7。上記は簡潔で、通常の使用に十分な速度です。

リストの印刷(prime_factors(3))

[3]

0
jorjun

ユーザーが入力した数値の素因数を見つけるためのコードを共有したいと思います。

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
vedang_joshi

答えのほとんどは、物事を複雑にしすぎています。できるよ

def prime_factors(n):
    num = []

    #add 2 to list or prime factors and remove all even numbers(like sieve of ertosthenes)
    while(n%2 == 0):
        num.append(2)
        n /= 2

    #divide by odd numbers and remove all of their multiples increment by 2 if no perfectlly devides add it
    for i in xrange(3, int(sqrt(n))+1, 2):
        while (n%i == 0):
            num.append(i)
            n /= i

    #if no is > 2 i.e no is a prime number that is only divisible by itself add it
    if n>2:
        num.append(n)

    print (num)

GeeksforGeeks のアルゴリズム

0
Amit Tripathi