2016-05-28 14 views
2

ここでは、数値の素因数を求める2つの関数があります。 クレジット:明らかに第二のコードがたくさんより速く動作しますが、なぜそれがint型ではなくとして出力long型の最大の要因を行い https://stackoverflow.com/a/412942/6211963長整数を表示するPython?

def prime_factors1(n): 
    """Returns all the prime factors of a positive integer""" 
    factors = [] 
    d = 2 
    while n > 1: 
     while n % d == 0: 
      factors.append(d) 
      n /= d 
     d = d + 1 

    return factors 

def prime_factors2(n): 
    """Returns all the prime factors of a positive integer""" 
    factors = [] 
    d = 2 
    while n > 1: 
     while n % d == 0: 
      factors.append(d) 
      n /= d 
     d = d + 1 
     if d*d > n: 
      if n > 1: factors.append(n) 
      break 
    return factors   

トリプティク?

>>> prime_factors1(65126264424) 
[2, 2, 2, 3, 13, 29, 7197863] 

>>> prime_factors2(65126264424) 
[2, 2, 2, 3, 13, 29, 7197863L] 
+1

2番目のバージョンでは、 'n'を追加しています。これは長いです。 – Evert

+0

Linux x86_64でPython 2.7.11でこれを再現することはできません。 – nwk

+0

Linux x86_64でもPython 2.7.11で再現できません –

答えて

5

違いは次のとおりです。 prime_factors1(n)で、最後の要因はここに追加されます:

while n > 1: 
    while n % d == 0: 
     factors.append(d) 

d2で出て始まる(間違いintランタイムに関係なく)、d = d + 1(2 intの追加)を介して成長する - それは次のように追加されたとき因子 - は7197863(それでもなおint)である。

if d*d > n: 
    if n > 1: factors.append(n) 

n65126264424で実施始まり、n /= d経由縮小:

prime_factors2(65126264424)では、しかし、あなたはここで最後の要因を追加します。これは、longnlongであり、dintである場合、結果はまだ小さくてもlongとなります)のタイプを変更すると、nのタイプは変更されません。したがって、質問は次のようになります。65126264424longですか?

答えはあなたのPythonランタイムに依存します:32ビットランタイムで

  1. 、あなたは一般的に65126264424よりも小さい(2**31 - 1)または2147483647で32ビット整数の最大アウトを持っています。
  2. 64ビットのランタイムでは、通常、(2**63 - 1)または9223372036854775807にある最大値が65126264424より大きい64ビット整数を使用します。

sys.maxintの出力を参照してください。65126264424より小さくする必要があります。

関連する問題