2017-06-25 4 views
1

Ich arbeite durch Projekt Euler Probleme.numpy.sum nicht erwarteten Wert

‚Finden Sie die Summe aller Primzahlen unter zwei Millionen‘

ich eine erstklassige checker gebaut haben, dass ich denke ziemlich schnell ist - jede Beratung auf, wie groß zu verbessern wäre.

Aber was ich die letzten 30 Minuten ausgearbeitet habe ist, dass np.sum nicht den richtigen Wert zurückgibt. Hier ist mein Code:

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) 

Ich nehme an, es auch die np.asarray sein könnte, das nicht funktioniert, anstatt np.sum

Ich habe durch die ursprüngliche Liste iteriert den Wert numpy zu testen, wird zurückgegeben .

numpy sum = 1179908154

Iterieren sum = 142913828922

über 100-mal größer. Wo liege ich falsch?

+0

Warum benutzen Sie überhaupt "numpy"? Summiere einfach die Primzahlen, während du sie erzeugst. Oder einfach 'sum (Primelist)'. Abgesehen davon werden Ihre 'break'-Anweisungen, die den' return'-Anweisungen folgen, niemals ausgeführt, so dass sie sinnlos sind. –

+0

Die Liste wurde mit Ganzzahlen bevölkert, die nicht mit der Summe arbeiten, schien einfach zu array und summieren sich mit numpy. Sie haben recht mit den Pausen :) Sie waren ein bisschen von einer früheren Version des Codes, entfernt sie jetzt. Vielen Dank –

Antwort

1

Meine Vermutung ist, dass Sie Windows verwenden, wo die Standardgröße einer Ganzzahl in numpy 32 Bits ist. np.sum(primelist) berechnet die Summe mit 32-Bit-Ganzzahlen, und die Summe läuft über. Sie können dies überprüfen, indem die Berechnung (mit Python ganzen Zahlen) 142913828922 % (2**31):

In [18]: s = 142913828922 

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

, dass der Wert, den Sie mit numpy.sum(primelist) bekamen.

Sie das Problem vermeiden können (oder zumindest aufzuschieben, bis der Überlauf 64 Bit-Integer) explizit primelist auf ein Array von 64-Bit-Integer ohne Vorzeichen umzuwandeln und dann ihre Summe Berechnung:

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

Oder einfach Verwenden Sie nicht numpy, wenn Sie mit sehr großen Ganzzahlen arbeiten.

Verwandte Themen