Antworte auf:  Python: Primteiler-Programm von Bekell
Forum:  Programmieren, moderiert von: matph

[Zur Forum-Gliederung] [Wie man Fragen beantwortet] [Themenstart einblenden]

  Alle registrierten Mitglieder können Mitteilungen schreiben.
Benutzername:
Passwort:
Nachricht-Icon:                   
                  
              
Nachricht:


 
 


Input assistance tools (JavaScript): [Link extern intern] [MathML?] [$$?]
[fed-area] [LaTeX-inline] [LaTeX-display] [Tikz] [hide-area][show-area] [Source code [num.]][?]
 Show Preview      Write using fedgeo formula editor or Latex.

Smilies for your message:
😃 😄 😁 🙂 🙃 😉 🤗 🤫 🤔 🙄 😴 🤒 😎 😮 😲 😂
🙁 😖 😒 😐 😡 👌 👍 👎 🤢 🤧 🥵 🥶 😵 🤯 😛 😷
Optionen: Deaktiviere HTML in dieser Nachricht
Deaktiviere MATHML in dieser Nachricht. Wenn Dein Text $-Zeichen enthält, die nicht LaTeX-Formeln begrenzen.
Deaktiviere Smilies in dieser Nachricht
Zeige die Signatur (Kann in 'Mein Profil' editiert werden.)
    [Abbrechen]
 
Beachte bitte die [Forumregeln]


Themenübersicht
Scynja
Aktiv
Dabei seit: 23.02.2011
Mitteilungen: 336
Herkunft:
 Beitrag No.17, eingetragen 2020-08-04 20:13    [Diesen Beitrag zitieren]

Warum schreibst du eigentlich so komplizierte Programme?
Du baust Schleifen ein, die nichts machen. Dann machst du ein Array leer und befüllst ein neues mit dem Inhalt, ohne, dass es einen Zweck hat.

Das ist doch alles Rauschen, was das Verständnis erschwert. In deinem Code guckst du an keiner Stelle nach der Endziffer. Es ist mir auch ein Rätsel, wie du mit dem Code auf 5000 kommen willst.

Wenn du int(500/51) schreibst und int liefert den nächstniedrigen Integer, dann ist das in jedem Fall 9 und nicht 10.

Um dir noch einmal zu zeigen was combinations macht (aus dem tooltip kopiert):
combinations(range(4), 3) --> (0,1,2), (0,1,3), (0,2,3), (1,2,3)

Python
from itertools import combinations, permutations
import itertools
Teiler=[3,7,17][::-1]
Divisor=0
AnzahlZZ=0
Zahl=1000
Länge=Zahl/2
schnittsumme=0
nr1=0
 
for Nr, Divisor in enumerate(Teiler):
    AnzahlZZ+=int(Länge/Divisor) # Hier wird summiert
    print("Nr:",Nr + 1,"Teiler",Divisor,"oft",int(Länge/Divisor),"Sum",AnzahlZZ)
 
for Nr, x in enumerate(itertools.combinations(Teiler, 2)):
    erg=x[0]*x[1]
    Abzüge=int(Länge/erg)
    schnittsumme+=Abzüge
    print("Nr:",Nr+1,"Paar",x,"Prod",erg,"oft",Abzüge,"Sum",schnittsumme)
 
print("Trefferanzahl", AnzahlZZ,"-",schnittsumme,"=",AnzahlZZ-schnittsumme)
 


Bekell
Aktiv
Dabei seit: 05.09.2008
Mitteilungen: 2082
Herkunft:
 Beitrag No.16, eingetragen 2020-08-04 18:21    [Diesen Beitrag zitieren]

2020-08-04 18:16 - DerEinfaeltige in Beitrag No. 15 schreibt:
2020-08-04 18:02 - Bekell in Beitrag No. 14 schreibt:
2020-08-04 17:00 - DerEinfaeltige in Beitrag No. 11 schreibt:
int(500/51) ergibt jedenfalls $9$ und nicht $10$.

Das stimmt nicht.

Doch das stimmt.
Schick doch mal den Link zur Python-Dokumentation der Funktion "int".

Das stimmt nicht, weil hinter 500/51 5000/51 steckt, aber 500 sind nur die Zahlen auf Endziffer 3. Du mußt diese Bedingung mitdenken! Auf diese Art kommt der 1 Treffer vor 51 zu liegen und daher die Summe 24


DerEinfaeltige
Senior
Dabei seit: 11.02.2015
Mitteilungen: 2442
Herkunft:
 Beitrag No.15, eingetragen 2020-08-04 18:16    [Diesen Beitrag zitieren]

2020-08-04 18:02 - Bekell in Beitrag No. 14 schreibt:
2020-08-04 17:00 - DerEinfaeltige in Beitrag No. 11 schreibt:
int(500/51) ergibt jedenfalls $9$ und nicht $10$.

Das stimmt nicht.

Doch das stimmt.
Schick doch mal den Link zur Python-Dokumentation der Funktion "int".


Bekell
Aktiv
Dabei seit: 05.09.2008
Mitteilungen: 2082
Herkunft:
 Beitrag No.14, eingetragen 2020-08-04 18:02    [Diesen Beitrag zitieren]

2020-08-04 17:00 - DerEinfaeltige in Beitrag No. 11 schreibt:
int(500/51) ergibt jedenfalls $9$ und nicht $10$.

Das stimmt nicht. Ich schrieb: ... mit Endziffer 3


DerEinfaeltige
Senior
Dabei seit: 11.02.2015
Mitteilungen: 2442
Herkunft:
 Beitrag No.13, eingetragen 2020-08-04 17:33    [Diesen Beitrag zitieren]

Die Google-Suche danach geht schneller als das Verfassen eines Postes.
Daher: Nein.


Bekell
Aktiv
Dabei seit: 05.09.2008
Mitteilungen: 2082
Herkunft:
 Beitrag No.12, eingetragen 2020-08-04 17:13    [Diesen Beitrag zitieren]

2020-08-04 17:00 - DerEinfaeltige in Beitrag No. 11 schreibt:

itertools.combinations(iterable,r) macht genau das, was in der Dokumentation steht.
Es erzeugt alle $r$-Tupel aus der Iterablen iterable.

in welcher Dokumentation?
Bist Du so freundlich, und verlinkst die bitte...


DerEinfaeltige
Senior
Dabei seit: 11.02.2015
Mitteilungen: 2442
Herkunft:
 Beitrag No.11, eingetragen 2020-08-04 17:00    [Diesen Beitrag zitieren]

2020-08-04 14:43 - Bekell in Beitrag No. 10 schreibt:

Hier ist nur mal die Zahl 4998 gemeint. Sie hat die PT 3,7,17.
Die Frage ist, wieviele Zahlen unter Ihr, die auf 3 enden, sind entweder durch 3, 7 oder 17 teilbar, oder auch durch zwei von ihnen.

Nr: 1 Teiler 17 oft 29 Sum 29
Nr: 2 Teiler 7 oft 71 Sum 100
Nr: 3 Teiler 3 oft 166 Sum 266

166 ist das Ergebnis. Das ist aber nicht ganz richtig, weil der Schnitt noch raus muß, sonst werden die Zahlen, die 2 der drei PT haben, doppelt gerechnet.

Der Schnitt wird hier berechnet:

Nr.1 Paar (17, 7) Prod 119 oft 4 Sum 4
Nr.2 Paar (17, 3) Prod 51 oft 9 Sum 13
Nr.3 Paar (7, 3) Prod 21 oft 23 Sum 36
Gesamtzahl: 266 - 36 = 230

Die Frage war, da 500/51 = 9,80 ist, also 10 und 23,8, also 24, - und, weil ich nur die Zahlen auf Endziffer 3 haben will - es der wirklich 24 und 10 sind, siehe Excel Tabelle oben, ob Cambinations das automatisch so macht, daß er den Schnittesschnitt berücksichtigt?
 

itertools.combinations(iterable,r) macht genau das, was in der Dokumentation steht.
Es erzeugt alle $r$-Tupel aus der Iterablen iterable.

Was du da rechnest, verstehe ich nicht.
Man kann nur raten, dass du die Dokumentation der Funktionen "int" und "round" nicht gelesen hast.

int(500/51) ergibt jedenfalls $9$ und nicht $10$.


Bekell
Aktiv
Dabei seit: 05.09.2008
Mitteilungen: 2082
Herkunft:
 Beitrag No.10, eingetragen 2020-08-04 14:43    [Diesen Beitrag zitieren]

2020-08-04 14:20 - DerEinfaeltige in Beitrag No. 9 schreibt:
Du willst also ausrechnen, wie viele Zahlen genau einen oder alle drei Teiler besitzen.
Dann verstehe ich die Frage nicht.
Denn genau das macht dein Programm, wenn ich es richtig sehe.

Hier ist nur mal die Zahl 4998 gemeint. Sie hat die PT 3,7,17.
Die Frage ist, wieviele Zahlen unter Ihr, die auf 3 enden, sind entweder durch 3, 7 oder 17 teilbar, oder auch durch zwei von ihnen.

Nr: 1 Teiler 17 oft 29 Sum 29
Nr: 2 Teiler 7 oft 71 Sum 100
Nr: 3 Teiler 3 oft 166 Sum 266

166 ist das Ergebnis. Das ist aber nicht ganz richtig, weil der Schnitt noch raus muß, sonst werden die Zahlen, die 2 der drei PT haben, doppelt gerechnet.

Der Schnitt wird hier berechnet:

Nr.1 Paar (17, 7) Prod 119 oft 4 Sum 4
Nr.2 Paar (17, 3) Prod 51 oft 9 Sum 13
Nr.3 Paar (7, 3) Prod 21 oft 23 Sum 36
Gesamtzahl: 266 - 36 = 230

Die Frage war, da 500/51 = 9,80 ist, also 10 und 23,8, also 24, - und, weil ich nur die Zahlen auf Endziffer 3 haben will - es der wirklich 24 und 10 sind, siehe Excel Tabelle oben, ob Cambinations das automatisch so macht, daß er den Schnittesschnitt berücksichtigt?
 


DerEinfaeltige
Senior
Dabei seit: 11.02.2015
Mitteilungen: 2442
Herkunft:
 Beitrag No.9, eingetragen 2020-08-04 14:20    [Diesen Beitrag zitieren]

2020-08-04 14:02 - Bekell in Beitrag No. 8 schreibt:

Ich hatte übrigens auf die 2-er Kombinationen begrenzt. Insofern macht Dein Programm nicht dasselbe. Und dann hatte ich noch die Anzahl der berührten zahlen ausgerechnet, indem ich von der summe der 1-er Kombinationen, die der 2-er abgezogen habe...



Du willst also ausrechnen, wie viele Zahlen genau einen oder alle drei Teiler besitzen.
Dann verstehe ich die Frage nicht.
Denn genau das macht dein Programm, wenn ich es richtig sehe.


Bekell
Aktiv
Dabei seit: 05.09.2008
Mitteilungen: 2082
Herkunft:
 Beitrag No.8, eingetragen 2020-08-04 14:02    [Diesen Beitrag zitieren]

2020-08-04 13:55 - Scynja in Beitrag No. 7 schreibt: Etwas Licht ist ins Dunkel gekommen. Ja. Ich lese es mir heute Abend noch einmal genau durch.
Aber wenn ich das richtig sehe, hat DerEinfaeltige bereits die Lösung gefunden.

Nein, der Einfältige hat eine neues Programm geschrieben. Ich danke ihm dafür, aber das war nicht meine Frage.

Meines funktionierte ja auch. Ich hatte eine Frage zu dem Modul gestellt, wie der rechnet.

@Einfältiger!

die 357 gehört nicht dazu, denn sie hat hinten eine 7. Ich habe mein math. Problem auf die Zahlen mit Endziffer 3 skaliert. Das ersieht man aus der Excel Tabelle.

Die Frage war, ob das Modul die Braune Zahl in der Excel Tabelle als Schnittesschnitt automatisch berücksichtigt?

und was macht Dein Programm hier in dieser Zeile:
Python
  1. R = {}

Ich hatte übrigens auf die 2-er Kombinationen begrenzt. Insofern macht Dein Programm nicht dasselbe. Und dann hatte ich noch die Anzahl der berührten zahlen ausgerechnet, indem ich von der summe der 1-er Kombinationen, die der 2-er abgezogen habe...


Scynja
Aktiv
Dabei seit: 23.02.2011
Mitteilungen: 336
Herkunft:
 Beitrag No.7, eingetragen 2020-08-04 13:55    [Diesen Beitrag zitieren]

2020-08-04 13:29 - Bekell in Beitrag No. 5 schreibt:
ZZ - Vielfache von PZ sind Zusammengesetzte Zahlen... Der Matheteil ist recht primitiv, es geht um die Programmatik! Primteiler sind die Teiler, die eine Zahl teilen, und prim sind. Die gebe ich vor. Er kuckt praktisch, wie oft die Primteiler einer Zahl im Bereich vor der Zahl vorkommen.

Schnitt meint - man spricht auch vom Durchschnitt zweier Mengen -, die Menge der Zahlen, die sich durch 7 und eine andere PZ aus der Teilermenge teilen lassen, haben gemeinsame. Die muß man ausrechnen. Das passiert im 2. Teil. Dann hat man die Menge der zZahlen, die von den PT der Ausgangszahl quasi infiltriert oder berührt sind.  

Ist das so verständlich?

Etwas Licht ist ins Dunkel gekommen. Ja. Ich lese es mir heute Abend noch einmal genau durch.
Aber wenn ich das richtig sehe, hat DerEinfaeltige bereits die Lösung gefunden.


DerEinfaeltige
Senior
Dabei seit: 11.02.2015
Mitteilungen: 2442
Herkunft:
 Beitrag No.6, eingetragen 2020-08-04 13:38    [Diesen Beitrag zitieren]

Da ich den Fehler nicht verstehe:

Du ignorierst die 357 bei deiner Zählung.

So wäre es etwas kürzer und wesentlich besser zu lesen:
Python
from itertools import combinations
 
def prod(T):
    p = 1
    for t in T:
        p *= t
    return p
 
def teiler_anzahl(Teiler,Nmax):
    R = {}
    for n in range(1,len(Teiler)+1):
        for c in combinations(Teiler,n):
            p = prod(c)
            R[c] = Nmax // p
    return R
 
print(teiler_anzahl([3,7,17],500))
 



[Die Antwort wurde nach Beitrag No.3 begonnen.]


Bekell
Aktiv
Dabei seit: 05.09.2008
Mitteilungen: 2082
Herkunft:
 Beitrag No.5, eingetragen 2020-08-04 13:29    [Diesen Beitrag zitieren]

ZZ - Vielfache von PZ sind Zusammengesetzte Zahlen... Der Matheteil ist recht primitiv, es geht um die Programmatik! Primteiler sind die Teiler, die eine Zahl teilen, und prim sind. Die gebe ich vor. Er kuckt praktisch, wie oft die Primteiler einer Zahl im Bereich vor der Zahl vorkommen.

Schnitt meint - man spricht auch vom Durchschnitt zweier Mengen -, die Menge der Zahlen, die sich durch 7 und eine andere PZ aus der Teilermenge teilen lassen, haben gemeinsame. Die muß man ausrechnen. Das passiert im 2. Teil. Dann hat man die Menge der zZahlen, die von den PT der Ausgangszahl quasi infiltriert oder berührt sind.  

Ist das so verständlich?


Scynja
Aktiv
Dabei seit: 23.02.2011
Mitteilungen: 336
Herkunft:
 Beitrag No.4, eingetragen 2020-08-04 13:24    [Diesen Beitrag zitieren]

Ich kenne es so, dass man Abkürzungen einmal ausschreibt bevor man sie im Text verwendet.

PT = Primteiler? Okay, das ist einleuchtend und möglichweise auch üblich.

ZZ?? Möglicherweise Zufallszahl(en) Ist mir allerdings erst relativ spät eingefallen.

Wie kann man auf einer Länge von 500 Zufallszahlen finden? Verstehe ich nicht. Also doch keine Zufallszahlen.

Dann geht es weiter:
Schnitt = Anzahl Zufallszahltreffer, die abgezogen werden muss
  Wovon abziehen, warum abziehen?

Alle Zweierkombinationen
= Alle Kombinationen von zwei Zufallszahlen?

Was hat es jetzt mit den Primteilern 3, 7, 17 auf sich?

Ich habe leider immer noch Verständnisprobleme. Aber vielleicht bin ich einfach nur zu weit vom Fach entfernt.


Bekell
Aktiv
Dabei seit: 05.09.2008
Mitteilungen: 2082
Herkunft:
 Beitrag No.3, eingetragen 2020-08-04 12:59    [Diesen Beitrag zitieren]

2020-08-04 11:57 - DerEinfaeltige in Beitrag No. 1 schreibt:
Woher sollen wir eigentlich wissen, was du da machst und ob oder warum das funktioniert oder auch nicht?

Poste den Code und erläutere den Algorithmus.
Dann
- können wir nachvollziehen, was passiert.
- kannst du selbst vielleicht auch nachvollziehen, was passiert.

Auf eine Länge von 500 finden wir genau so und soviel ZZ mit PT 7, soviel mit PT 3 und soviel mit PT 17...... Das wird im ersten Teil ausgedruckt. Mit Combinations wird der Schnitt berechnet, also die Anzahl von ZZ-Treffern, die abgezogen werden muß. Dazu bildet er alle Zweier-Combinationen, berechnet deren Häufigkeit. Das macht er alles richtig, nur die Frage von oben bleibt. Es fehlt gegenüber der Handauszählung in der 2. und 3. Zeile des 2. Teiles des Ausdruckes je eine 1 in der Summe.

Python
  1. Wir geben eine Teilerliste vor. Er berechnet wieviele Treffer der jewieligen auf einer vorgegebenen Länge zu finden sind.
  2. Danach testen wir itertools.combinations
  3. Damit berechnet er noch den Schnitt zu den jeweiligen Treffern.
  4. """
  5. from itertools import combinations
  6. from itertools import permutations
  7. import itertools
  8. Teiler=[3,7,17]
  9. Länge=500
  10. Divisor=0
  11. ZZAnzahl=0
  12. Start=1
  13. Zahl=1000
  14. Teilerneu=[]
  15. schnittsumme=0
  16. nr=0
  17. nr1=0
  18.  
  19.  
  20. if len(Teiler)>1:
  21. Länge=int(Zahl/2)
  22. Start=int(len(Teiler))
  23. for i in range (Start,0,-1):
  24. Divisor=Teiler.pop(i-1)# Hier werden die teiler der Liste entnommen.
  25. Teilerneu.append(Divisor)#neuer Contaner mit den teilern, weil der alte geleert wird.
  26. ZZAnzahl=ZZAnzahl+int(Länge/Divisor) # Hier wird summiert
  27. nr=nr+1
  28. print("Nr:",nr,"Teiler",Divisor,"oft",int(Länge/Divisor),"Sum",ZZAnzahl)
  29.  
  30. for L in range(0, Start+1):
  31. for x in itertools.combinations(Teilerneu, L):
  32. if len(x)==2:
  33. erg=x[0]*x[1]
  34. Abzüge=int(Länge/erg)
  35. schnittsumme=schnittsumme+Abzüge
  36. nr1=nr1+1
  37. print("Nr:",nr1,"Paar",x,"Prod",erg,"oft",Abzüge,"Sum",schnittsumme)
  38.  
  39. print("Trefferanzahl", ZZAnzahl,"-",schnittsumme,"=",ZZAnzahl-schnittsumme)


Bilbo
Senior
Dabei seit: 03.01.2005
Mitteilungen: 1975
Herkunft:
 Beitrag No.2, eingetragen 2020-08-04 12:24    [Diesen Beitrag zitieren]

Hallo Bekell,

da die ganzen Python-Fragen, die Du in den letzten Tagen gestellt hast, ja alle zu dem gleichen Programm zu gehören scheinen, schlage ich vor, dass Du dafür dann auch nicht jedes Mal einen neuen Thread aufmachst, sondern diese in einem Thread sammelst. Ansonsten versteht man nämlich spätestens hier wirklich nicht mehr, worum es eigentlich geht. 🙂

(Für Fragen, die nicht so eng dazugehören, dürfen es natürlich auch weiterhin eigene Threads sein.)

Viele Grüße

Thorsten


DerEinfaeltige
Senior
Dabei seit: 11.02.2015
Mitteilungen: 2442
Herkunft:
 Beitrag No.1, eingetragen 2020-08-04 11:57    [Diesen Beitrag zitieren]

Woher sollen wir eigentlich wissen, was du da machst und ob oder warum das funktioniert oder auch nicht?

Poste den Code und erläutere den Algorithmus.

Dann
- können wir nachvollziehen, was passiert.
- kannst du selbst vielleicht auch nachvollziehen, was passiert.


Bekell
Aktiv
Dabei seit: 05.09.2008
Mitteilungen: 2082
Herkunft:
 Themenstart: 2020-08-04 11:01    [Diesen Beitrag zitieren]

Kombinator-Frage

Das Programm läuft, die Ausgabe sieht so aus:

Nr: 1 Teiler 17 oft 29 Sum 29
Nr: 2 Teiler 7 oft 71 Sum 100
Nr: 3 Teiler 3 oft 166 Sum 266

Nr.1 Paar (17, 7) Prod 119 oft 4 Sum 4
Nr.2 Paar (17, 3) Prod 51 oft 9 Sum 13
Nr.3 Paar (7, 3) Prod 21 oft 23 Sum 36
ZZ-Brücken 266 - 36 = 230

Itertools.combinations kommt im 2. Teil zu Einsatz.
Die 2. und 3. Zeile des zweiten Teiles müßte so aussehen:

Nr. 2 Paar (17, 3) Prod 51 oft 10 Sum 14
Nr. 3 Paar (7, 3) Prod 21 oft 24 Sum 38

weil 500/21 = 24 und 500/51 = 10

Beweis:


Jetzt die Frage, hat der Kombinations-Befehl die braunen Zellen im Bild automatisch berücksichtigt? Woher aber soll der wissen, daß ich einen Schnitt berechne und das richtig ist?


 
All logos and trademarks in this site are property of their respective owner. The comments are property of their posters, all the rest © 2001-2020 by Matroids Matheplanet
This web site was originally made with PHP-Nuke, a former web portal system written in PHP that seems no longer to be maintained nor supported. PHP-Nuke is Free Software released under the GNU/GPL license.
Ich distanziere mich von rechtswidrigen oder anstößigen Inhalten, die sich trotz aufmerksamer Prüfung hinter hier verwendeten Links verbergen mögen.
Lesen Sie die Nutzungsbedingungen, die Distanzierung, die Datenschutzerklärung und das Impressum.
[Seitenanfang]