Anzahl der Möglichkeiten eine Zahl als Summe von Primzahlen darzustellen

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
joheu01
User
Beiträge: 4
Registriert: Samstag 13. März 2021, 15:13

Hi, wie ihr im Betreff schon gelesen habt, geht es um ein mathematisches Problem,

ich versuche mich derzeit an einem Problem der Seite https://projecteuler.net und zwar geht es darum, die kleinste Zahl zu finden, die auf über 5000 Möglichkeiten als Summe von Primzahlen darstellbar ist. Dazu habe ich ein Programm geschrieben, das theoretisch diese gesuchte Zahl findet. Leider stürzt es immer aufgrund eines MemoryErrors ab. Könnte da jemand mal drüberschauen und Tipps geben, wie man dieses Programm effizienter gestalten könnte?

Code: Alles auswählen

from itertools import combinations_with_replacement

def isPrime (zahl):
    if zahl < 2:
        return False
    elif zahl == 2:
        return True
    else:
        for i in range(2,int(zahl/2)+1):
            if (zahl % i) == 0:
                return False
        return True

def primesTil(zahl):
    liste = []
    for k in range(zahl+1):
        if isPrime(k):
            liste.append(k)
    return liste


def sums(zahl, kombinationen):
    liste = []
    liste2 = list(combinations_with_replacement(primesTil(zahl),kombinationen))

    for m in liste2:
        ergebnis = 0
        for n in m:
            ergebnis += n
        if ergebnis == zahl:
            liste.append(ergebnis)

    return liste


def anzahl(zahl):
    ergebnis = 0
    for o in range(int(zahl/2)+1):
        ergebnis += len(sums(zahl,o))
    return ergebnis




def anzahlGesucht():
    zahl = 30
    while True:
        print(str(zahl) +": "+ str(anzahl(zahl)))
        if anzahl(zahl) > 5000:
            break
        zahl += 1
    return zahl



print(anzahlGesucht())
joheu01
User
Beiträge: 4
Registriert: Samstag 13. März 2021, 15:13

Ich weiß, dass ich am Ende anzahl(zahl) zweimal aufrufe, das habe ich nur gemacht, um mir das etwas zu visualisieren, eleganter wäre natürlich das einmal aufzurufen und dann in einer Variable zu speichern.
Sirius3
User
Beiträge: 18274
Registriert: Sonntag 21. Oktober 2012, 17:20

Statt int(zahl/2) benutzt man Ganzzahldivision zahl//2.
Du benutzt eine sehr ineffiziente Methode um Primzahlen zu ermitteln und dann ermittelst Du diese Primzahlen auch noch sehr oft, statt einmal.
Du mußt nicht alle Kombinationen in einer Liste speichern, das wird sehr schnell sehr viel und füllt Deinen Speicher.
Für's summieren gibt es sum.
Alle Kombinationen durchzuprobieren, ist auch sehr ineffizient. Effizienter wäre es die Kombinationen systematisch durchzugehen, z.B. per Rekursion.
Benutzeravatar
ThomasL
User
Beiträge: 1379
Registriert: Montag 14. Mai 2018, 14:44
Wohnort: Kreis Unna NRW

Primzahlen braucht man nicht mehr selber bestimmen, die kann man sich hier downloaden. ;-)
https://primes.utm.edu/
Ich bin Pazifist und greife niemanden an, auch nicht mit Worten.
Für alle meine Code Beispiele gilt: "There is always a better way."
https://projecteuler.net/profile/Brotherluii.png
Antworten