2017-06-25 15 views
1

私はプロジェクトのユーラー問題を解決しています。numpy.sumが期待値を返さない

私は、私は非常に高速だと思うプライムチェッカー構築した

「200万以下の全ての素数の和で検索] - 改善する方法上の任意のアドバイスがあまりにも素晴らしいことだし。

しかし、私が最後に30分間働いたのは、np.sumが正しい値を返さないということです。ここに私のコードは次のとおりです。

import numpy as np 
def isprime(num, primelist): 
    #Give primelist it's first value if none exist 
    if len(primelist) == 0: 
     primelist.append(num) 
     return True 
    for primes in primelist: 
     #Only need to iterate up to square root of num to test primality 
     if primes <= math.sqrt(num): 
      #If any number is evenly divisble (remainder = 0) the num is not prime 
      if num % primes == 0: 
       #print('non-prime') 
       return False 
       break 
     #If we have iterated through all primes <= sqrt of num, num is prime 
     else: 
      primelist.append(num) 
      #print('prime') 
      return True 
      break 

lim = 2000000 
n = 3 
primelist = [2] 

while primelist[-1] <= lim: 
    isprime(n, primelist) 
    n += 1 

if primelist[-1] > lim: primelist = primelist[:-1] 
primearray = np.asarray(primelist) 
print(np.sum(primearray)) 

sum = 0 
for i in primelist: 
    sum = sum + i 
print(sum) 

私はそれはまた、私はnumpyのが返される値をテストするために、元のリストを繰り返してきた作業ではなく、np.sum

されていない可能性がありnp.asarrayと仮定します。

numpyの合計= 1179908154

= 142913828922

100以上の倍の合計を反復します。私は間違ってどこに行ってください!

+0

なぜあなたはnumpyを使用していますか?素数を生成するときに素数を合計するだけです。または 'sum(primelist)'だけです。さて、 'return'ステートメントに続く' break'ステートメントは決して実行されないので、無意味です。 –

+0

リストにはsumで動作しない整数が入力されていますが、単純にasarrayとnumpyで合計するのは簡単でした。あなたは休憩について正しいです:)彼らはコードの以前のバージョンの残り物の少しだった、今それらを削除しました。ありがとう –

答えて

1

私の推測では、Windowsを使用しています。ここで、numpyの整数のデフォルトサイズは32ビットです。 np.sum(primelist)は、32ビットの整数を使用して合計を計算しており、合計がオーバーフローしています。あなたは142913828922 % (2**31)(Pythonの整数で)計算することによってこれを確認することができます

In [18]: s = 142913828922 

In [19]: s % (2**31) 
Out[19]: 1179908154 

あなたはnumpy.sum(primelist)で得た値であること。

あなたは明示的に64ビット符号なし整数の配列にprimelistを変換し、その合計を計算することによって(あるいは、少なくとも64ビット整数オーバーフローまでそれを延期する)問題を回避することができます

np.array(primelist, dtype=np.uint64).sum() 

それともを非常に大きな整数を扱うときはnumpyを使用しないでください。

関連する問題