Seite 1 von 1

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

Verfasst: Mittwoch 17. März 2021, 11:59
von joheu01
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())

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

Verfasst: Mittwoch 17. März 2021, 12:14
von joheu01
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.

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

Verfasst: Mittwoch 17. März 2021, 12:26
von Sirius3
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.

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

Verfasst: Donnerstag 18. März 2021, 07:11
von ThomasL
Primzahlen braucht man nicht mehr selber bestimmen, die kann man sich hier downloaden. ;-)
https://primes.utm.edu/