入力として正の整数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... ?
簡単なトライアル部門:
_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
のみをループする(または、より小さな素数を特殊なケースにして、可能な限り少ない除数をループする)ことで簡単に改善できます。
primefac module は、数学者が何世紀にもわたって開発したすべての派手な手法で因数分解を行います:
#!python
import primefac
import sys
n = int( sys.argv[1] )
factors = list( primefac.primefac(n) )
print '\n'.join(map(str, factors))
これは、試行分割による因子分解の私のバージョンです。これには、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倍高速になります。
私のブログ で素数を使って多くの仕事をしました。気軽に見学してください。
上記のソリューションのほとんどはやや不完全に見えます。素因数分解は、数(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
@ 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()でラップします。
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]
数の素因数:
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
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]
ユーザーが入力した数値の素因数を見つけるためのコードを共有したいと思います。
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)
答えのほとんどは、物事を複雑にしすぎています。できるよ
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 のアルゴリズム