Python: dynamisch Container/Listen von Primzahlketten bilden
Bekell
Aktiv Dabei seit: 05.09.2008 Mitteilungen: 2152
Themenstart: 2020-11-23
Hallo
Ich habe jetzt ein Tool geschrieben, welches innerhalb der voreingestellten Grenzen jede Zahl einer arithm. Reihe bildet, nachsieht, ob sie PZ oder ZZ, und dann auch nachsieht, ob die nächste wieder PZ oder ZZ, u.s.w. Es zählt praktisch die Ketten.
Ich möchte jetzt, daß das Tool
1. auch die Anzahl der Ketten, nach Länge sortiert, speichert, das er also am Ende noch eine solche Zeile ausgibt: "Im Abschnitt von x bis y befinden sich z.B x 4 1-er Ketten, 8 2-er Ketten, 22 dreier Ketten usw. usf.
2. Und dann soll er noch zu jeder Kettenlängen die Startpunkte in eine extra Liste schreiben, die ich auch mir in Excel wiedergebe lasse am Ende. Das kriege ich aber selber hin, ist nicht das Problem.
Das Problem ist, daß ich die Kettenlängen-Liste und Variable für die Anzahl der Kettenlängen, nicht fest vorgeben will. Der Knackpunkt ist: Das Programm soll nach Bedarf, wenn eine neue Kettenlänge daherkommt, dynamisch selbst den Containerbilden und den Containernamen vergeben, z.b. kl17, kl18, kl19 u.s.w., wo er die Startpunkte sammelt. Die Anzahl kann ich dann über len abgreifen...
Gehen tut das, weiss bloß nicht wie. Wer kann mir da weiter helfen?
Mir fällt auf, ich weiß nicht mal, wie man das Problem richtig nennt. Da kann ich ja im netz auch nichts finden!
Schon mal Danke im Voraus ...
----------------- Das Schwierige ist nicht die Mathematik. Schwierig ist es zu formulieren, daß man selber versteht, was man sieht und die anderen auch!
Bekell
Aktiv Dabei seit: 05.09.2008 Mitteilungen: 2152
Beitrag No.3, vom Themenstarter, eingetragen 2020-11-24
2020-11-24 08:42 - DerEinfaeltige in Beitrag No. 2 schreibt:
Es fehlt eine genaue Problembeschreibung, was deine Funktion/Prozedur machen soll.
Was ist die Eingabe und gewünschte Ausgabe? (Datentypen und Funktionalität)
Wie sieht ein einfaches Beispiel aus?
Hallo Einfältiger, Danke daß Du Dich meldest.
Ich möchte, daß mein Programm zu der obigen Ausgabe noch folgendes am Ende meldet.
A: Im Abschnitt x bis y gibt es
23 Primzahlketten der Länge 1
27 Primzahlketten der Länge 2
23 Primzahlketten der Länge 3
0 Primzahlketten der Länge 4
23 Primzahlketten der Länge 5
27 Primzahlketten der Länge 6
B Im Abschnitt x bis y gibt es
3 Ketten zusammengesetzter Zahlen der Länge 1
etc. etc.
Ich will jetzt nicht selber soviel Variablen definieren, sondern er soll die notwendigen selber definierten und logisch benennen.
----------------- Das Schwierige ist nicht die Mathematik. Schwierig ist es zu formulieren, daß man selber versteht, was man sieht und die anderen auch!
Bekell
Aktiv Dabei seit: 05.09.2008 Mitteilungen: 2152
Beitrag No.4, vom Themenstarter, eingetragen 2020-11-24
2020-11-23 23:04 - Scynja in Beitrag No. 1 schreibt:
Hallo Bekell,
du steckst ziemlich tief in der Thematik drinnen. Kannst du das Problem auf einen einfachen Sachverhalt reduzieren?
Hallo Scynia,
Dein Programm funktioniert bei mir nicht. Er sagt:
Das off hab ich schon entfernt, er hat es auch bemängelt. Ich sehe bei Dir auch gar keine Bibliotheken ...??
----------------- Das Schwierige ist nicht die Mathematik. Schwierig ist es zu formulieren, daß man selber versteht, was man sieht und die anderen auch!
DerEinfaeltige
Senior Dabei seit: 11.02.2015 Mitteilungen: 2608
Beitrag No.5, eingetragen 2020-11-24
Ich wiederhole:
Was ist die Eingabe und gewünschte Ausgabe? (Datentypen und Funktionalität)
Wie sieht ein einfaches Beispiel aus?
Dein Post spricht übrigens von einer arithmetischen Reihe, deine for-Schleife durchläuft allerdings eine arithmetische Folge.
Dein Codebeispiel lässt vermuten, dass du einen Startwert, eine Schrittweite und eine Obergrenze vorgibst.
Was genau soll die Rückgabe sein?
Rechne es doch an einem einfachen Beispiel (Startwert 3, Schrittweite 4, Obergrenze 24 oder wie auch immer) von Hand vor!
----------------- Why waste time learning when ignorance is instantaneous?
- Bill Watterson -
Bekell
Aktiv Dabei seit: 05.09.2008 Mitteilungen: 2152
Beitrag No.6, vom Themenstarter, eingetragen 2020-11-24
2020-11-24 10:08 - DerEinfaeltige in Beitrag No. 5 schreibt:
Ich wiederhole:
Was ist die Eingabe und gewünschte Ausgabe? (Datentypen und Funktionalität)
Nur int
Dein Post spricht übrigens von einer arithmetischen Reihe, deine for-Schleife durchläuft allerdings eine arithmetische Folge.
Du hast recht, es ist eine Folge ...
Dein Codebeispiel lässt vermuten, dass du einen Startwert, eine Schrittweite und eine Obergrenze vorgibst.
Ja, die Vermutung ist richtig
Was genau soll die Rückgabe sein?
Rechne es doch an einem einfachen Beispiel (Startwert 3, Schrittweite 4, Obergrenze 24 oder wie auch immer) von Hand vor!
Startwert 7, Grenze 107, Schrittweite 10
7 PZ 1. Glied 1. PZ Kette der Länge 2
17 PZ 2. Glied 1. PZ Kette der Länge 2
27 ZZ 1. Glied 1. ZZ Kette der Länge 1
37 PZ 1. Glied 1. PZ Kette der Länge 2
47 PZ 2. Glied 2. PZ Kette der Länge 2
57 ZZ 1. Glied 2. ZZ Kette der Länge 1
67 PZ 1. Glied 1. PZ Kette der Länge 1
77 ZZ 1. Glied 1. ZZ Kette der Länge 2
87 ZZ 2. Glied 1. ZZ Kette der Länge 2
97 PZ 1. Glied 3. PZ Kette der Länge 2
107 PZ 2. Glied 3. PZ Kette der Länge 2
so soll der auskommentierbare Listenprint sei.
Und dann soll noch die Zusammenfassung kommen. Sie sieht so aus:
Im Abschnitt 7 bis 107 gibt es insgesamt 7 Ketten, davon 4 PZ ketten und 3 ZZ-Ketten, genauer:
1 PZ Kette der Länge 1 (Startwerte)
3 PZ Ketten der Länge 2 (Startwerte)
2 ZZ Ketten der Länge 1 (Startwerte)
1 ZZ Kette der Länge 2 (Startwerte)
Mein Programm hat einen Fehler. Es kommt die ZZ Kettenlänge 15 vor 14 und 13 vor. Er registriert aber beim Zählen, weil ja 15 mehr als 13 sind, bei der 13. ZZ aus der 15-er Kette schon die Kettenlänge 13, obwohl es sie bis dahin gar nicht gibt. Mein Programm prüft also nicht den Abschluss. Das ist beim zusammenzählen dann eine Fehlerquelle....
Noch ein Wunsch: ich möchte den Code verstehen, wenn hier jemand Code hinstellt. Besonders das automatische Erstellen von Listen ... (Er bitte also Code mit Kommentar der schwierigen Stellen) Bloß nicht so schreiben, daß dann nur noch 3 Zeilen dastehen!
----------------- Das Schwierige ist nicht die Mathematik. Schwierig ist es zu formulieren, daß man selber versteht, was man sieht und die anderen auch!
DerEinfaeltige
Senior Dabei seit: 11.02.2015 Mitteilungen: 2608
Beitrag No.7, eingetragen 2020-11-24
Ich wiederhole:
Was ist die Eingabe und gewünschte Ausgabe? (Datentypen und Funktionalität)
Wie sieht ein einfaches Beispiel aus?
Was genau soll die Rückgabe sein?
Rechne es doch an einem einfachen Beispiel (Startwert 3, Schrittweite 4, Obergrenze 24 oder wie auch immer) von Hand vor!
Es nützt nichts, irgendeine obskure Ausgabe zu posten, wenn du nicht erklärst, wie diese zustandekommt.
Auch stellt sich die Frage, was du wissen willst, wenn dein Programm bereits exakt das ausgibt, was es ausgeben soll.
----------------- Why waste time learning when ignorance is instantaneous?
- Bill Watterson -
Bekell
Aktiv Dabei seit: 05.09.2008 Mitteilungen: 2152
Beitrag No.8, vom Themenstarter, eingetragen 2020-11-24
Hallo Einfältiger,
2020-11-24 10:46 - DerEinfaeltige in Beitrag No. 7 schreibt: Ich wiederhole:
-- zum wiederholten Male ...
Was ist die Eingabe und gewünschte Ausgabe? (Datentypen und Funktionalität)
Ich versteh nicht, Wass du meinst: Eingabe sind Startwert, Grenze und Schrittweite, vom Datentyp her alles Integer. Ausgaben sind vom Datentyp her auch alles Integer.
Was meinst Du noch?
Wie sieht ein einfaches Beispiel aus?
Hatte ich in Post nr. 6 hingestellt ....
Was genau soll die Rückgabe sein?
Rechne es doch an einem einfachen Beispiel (Startwert 3, Schrittweite 4, Obergrenze 24 oder wie auch immer) von Hand vor!
Hab ich in Post Nr. 6 vorgerechnet per Hand
Auch stellt sich die Frage, was du wissen willst, wenn dein Programm bereits exakt das ausgibt, was es ausgeben soll.
tut es ja nicht. Was mein Programm leistet, steht in Post nr. 1, was es leisten soll, bzw. was ich mir wünsche in Post nr. 6.
----------------- Das Schwierige ist nicht die Mathematik. Schwierig ist es zu formulieren, daß man selber versteht, was man sieht und die anderen auch!
DerEinfaeltige
Senior Dabei seit: 11.02.2015 Mitteilungen: 2608
Beitrag No.9, eingetragen 2020-11-24
2020-11-24 10:59 - Bekell in Beitrag No. 8 schreibt:
Ich versteh nicht, Wass du meinst: Eingabe sind Startwert, Grenze und Schrittweite, vom Datentyp her alles Integer. Ausgaben sind vom Datentyp her auch alles Integer.
Was meinst Du noch?
Wie sieht ein einfaches Beispiel aus?
Hatte ich in Post nr. 6 hingestellt ....
Dein Beispiel passt nicht zu der Aussage, dass die Rückgabe aus Ganzzahlwerten besteht.
Dein Beispiel hat keine Rückgabe und gibt als Seiteneffekt Text aus.
Den ersten Teil deines Beispiels könnte man vielleicht schreiben als
KettenAnalysator: (int,int,int) => [(int,int,int,str)]
Gibt eine Liste von 4-Tupeln der Form
(Glied_der_Kette,Gliednummer,Kettenlänge,Kettentyp) zurück
Beispiel:
KettenAnalysator(7,47,10) =>
[(7,1,2,"pz"),(17,2,2,"pz"),(27,1,1,"zz"),(37,1,2,"pz"),(47,2,2,"pz")]
Die Zusammenfassung wäre dann etwas wie:
KettenZusammenfassung: [(int,int,int,str)] => (int,int,int,int,int,[(int,[int])],[(int,[int])])
Nimmt die Ausgabe des Kettenanalysators und berechnet die Zusammenfassung
(Start, Ende, KettenzahlGesamt, KettenzahlPZ, KettenzahlZZ,
Liste PZketten der Form (Startwert,Länge),
Liste ZZketten der Form (Startwert,Länge))
Beispiel:
KettenZusammenfassung([(7,1,2,"pz"),(17,2,2,"pz"),(27,1,1,"zz"),(37,1,2,"pz"),(47,2,2,"pz")]) =>
(7,47,3,2,1,[(7,2),(37,2)],[(27,1)])
----------------- Why waste time learning when ignorance is instantaneous?
- Bill Watterson -
Bekell
Aktiv Dabei seit: 05.09.2008 Mitteilungen: 2152
Beitrag No.10, vom Themenstarter, eingetragen 2020-11-24
Ja, jetzt hast Du verstanden, Einfältiger, was ich meinte.
Du denkst in Funktionen... das hatte ich mißverstanden, ich dachte bei Ein und Ausgabe an das Programm an sich.
Sag mir mal, wie das geht, eine automatisch erstellte Variable....
----------------- Das Schwierige ist nicht die Mathematik. Schwierig ist es zu formulieren, daß man selber versteht, was man sieht und die anderen auch!
Bekell
Aktiv Dabei seit: 05.09.2008 Mitteilungen: 2152
Beitrag No.12, vom Themenstarter, eingetragen 2020-11-24
2020-11-24 13:23 - DerEinfaeltige in Beitrag No. 11 schreibt:
2020-11-24 12:19 - Bekell in Beitrag No. 10 schreibt:
Sag mir mal, wie das geht, eine automatisch erstellte Variable....
Schlüssel-Wert Paare speichert man in Dictionaries.
Okay Dictionaries ...
Was soll das sein und was willst du damit erreichen?
Also ich meine, daß nicht ich die anlegen muß, sondern das Programm...
Man hat jetzt einen Speicher, wo immer die beiden Werte drin sind (Kettenlänge, Anzahl) als Variablen per Hand anlegen, und das Programm erhöht bei jeder Findung mit +1.
Ketten_länge1=0
Ketten_länge2=0
Ketten_länge3=0
u.s.w. So würd ich das auch hinkriegen. Aber das ist doof, weil ich nicht weiß, welche Kettenlängen alles vorkommen.
Ich will, daß er die Speicherorte selber anlegt, automatisch, und nur bei Bedarf.
Wie würdest Du das machen, mit welchen Befehlen ...
?
----------------- Das Schwierige ist nicht die Mathematik. Schwierig ist es zu formulieren, daß man selber versteht, was man sieht und die anderen auch!
Bekell
Aktiv Dabei seit: 05.09.2008 Mitteilungen: 2152
Beitrag No.14, vom Themenstarter, eingetragen 2020-11-24
2020-11-24 13:50 - DerEinfaeltige in Beitrag No. 13 schreibt:
Indem ich ein Dictionary mit Kettenlänge als Schlüssel und der Anzahl als Wert anlege.
Einfaches Beispiel:
Python
def count(S):
D ={}for x in S:
if x notin D:
D[x]=0
D[x] +=1return D
Das zählt die Vorkommen jedes Objektes im Container S und gibt ein Dict (Objekt (hashable) -> Anzahl (int)) zurück.
Danke Einfältiger, ich mach das mal, und melde mich zurück!
----------------- Das Schwierige ist nicht die Mathematik. Schwierig ist es zu formulieren, daß man selber versteht, was man sieht und die anderen auch!
Bekell
Aktiv Dabei seit: 05.09.2008 Mitteilungen: 2152
Beitrag No.15, vom Themenstarter, eingetragen 2020-11-24
Python
"
from openpyxl import Workbook
from sympy.ntheory import isprime
from math import sqrt
Start=13
Grenze=1000
Abstand=30
pz_count=[]
zz_count=[]
def count(S):
D = {}
for x in S:
if x not in D:
D[x] = 0
D[x] += 1
return D
for i in range(Start,Grenze,Abstand):
if isprime(i):
pz_count.append(i)
else:
zz_count.append(i)
print(count(pz_count),count(zz_count) )
Einen Teil hab ich verstanden:
Er sagt mir, daß die zahlen alle nur 1 x vorkommen. 🤗
----------------- Das Schwierige ist nicht die Mathematik. Schwierig ist es zu formulieren, daß man selber versteht, was man sieht und die anderen auch!
Scynja
Aktiv Dabei seit: 23.02.2011 Mitteilungen: 364
Beitrag No.16, eingetragen 2020-11-24
2020-11-24 10:35 - Bekell in Beitrag No. 6 schreibt:
Noch ein Wunsch: ich möchte den Code verstehen, wenn hier jemand Code hinstellt. Besonders das automatische Erstellen von Listen ... (Er bitte also Code mit Kommentar der schwierigen Stellen) Bloß nicht so schreiben, daß dann nur noch 3 Zeilen dastehen!
Der Code ist in JS. Du müsstest ihn auf Python adaptieren, wenn du ihn nutzen möchtest. Ich schreibe ihn dir noch einmal als Pseudocode:
Erstelle leere Liste.
In einer Schleife:
- gib mir die nächste Pimzahlkette
- suche, ob es bereits Primzahlketten mit der Länge gibt
- a) falls ja: füge diese konkrete Kette dem Listenobjekt hinzu
- b) falls nein: lege einen neuen Listeneintrag an. Er enthält die Länge der Primzahlketten und eine Liste von Primzahlketten (hier werden spätere eingefügt)
In Python gibt es auch Listen und Objekte. Also sollte es einfach adaptierbar sein. (Wenn es denn überhaupt das ist, was du suchst)
Bekell
Aktiv Dabei seit: 05.09.2008 Mitteilungen: 2152
Beitrag No.17, vom Themenstarter, eingetragen 2020-11-24
Viele Dank, Einfältiger und Scania. Es waren letztlich 15 Minuten Überlegen, nachdem ich die Funktion hatte ... bin allerdings erst jetzt dazu gekommen. Danke nochmals!
Das ist das Ergebnis für 13,10000,30
PZKetten {4: 3, 3: 11, 2: 22, 1: 48, 5: 2, 6: 1}
ZZKetten {1: 39, 2: 28, 4: 4, 3: 9, 6: 1, 5: 5, 10: 1}
Hab allerdings noch 2 Fragen:
1. Warum sieht die Abrechnung nicht geordnet aus...pr den PZ-Ketten-Längen. Erst 4,3,2,1 und dann 5,6 ??
2. Und warum zeigt er die nicht vorkommenden Längen zwischen der höchsten Kettenlänge und den anderen existenten nicht mit 0 an?
----------------- Das Schwierige ist nicht die Mathematik. Schwierig ist es zu formulieren, daß man selber versteht, was man sieht und die anderen auch!
Bekell
Aktiv Dabei seit: 05.09.2008 Mitteilungen: 2152
Beitrag No.19, vom Themenstarter, eingetragen 2020-11-25
Danke Einfältiger, ich hab das Dictionary mal versucht zu sortieren hiermit:
Python
liste =[(val,key)for key,val in pz_kettenlängenzähler.items()]
liste.sort()
#liste.reverse()
print(liste)
aber er sagt: AttributeError: 'list' object has no attribute 'items'
Was ist zu tun?
----------------- Das Schwierige ist nicht die Mathematik. Schwierig ist es zu formulieren, daß man selber versteht, was man sieht und die anderen auch!
Bekell
Aktiv Dabei seit: 05.09.2008 Mitteilungen: 2152
Beitrag No.21, vom Themenstarter, eingetragen 2020-11-25
Hallo Einfältiger,
ich hab Deine Funktion Print_chain übernommen, und er sagt zu der Zeile:
38: keys = sorted(ChainDict.keys())
Quote: 'list' object has no attribute 'keys'
Was meint er damit? Wieso macht er es nicht mit meinem Diktionary "pz_kettenlängenzähler"?
Antwort, weil "pz_kettenlängenzähler" kein Dictionary, sondern eine Liste!
Wie bekomme ich also die Ausgabe von: "count(pz_kettenlängenzähler)" in ein Dictionary verwandelt?
----------------- Das Schwierige ist nicht die Mathematik. Schwierig ist es zu formulieren, daß man selber versteht, was man sieht und die anderen auch!