Matroids Matheplanet Forum Index
Moderiert von mire2
Mathematische Software & Apps » Andere Softwarepakete » (Mit Python) Summe auf Ganzzahligkeit prüfen
Autor
Universität/Hochschule (Mit Python) Summe auf Ganzzahligkeit prüfen
LetsLearnTogether
Aktiv Letzter Besuch: in der letzten Woche
Dabei seit: 27.06.2021
Mitteilungen: 44
  Themenstart: 2021-07-30

Hallo, kennt jemand von euch eine gute Einführung um das mathematikorientierte programmieren in Python zu erlernen? Ich habe noch nie programmiert, aber hatte nun doch immer mal wieder Situationen, wo ich es hilfreich gefunden hätte, wenn ich ein Programm schreiben könnte, was mir hilft gewisse Dinge besser zu untersuchen. Konkret geht es mir aktuell darum folgende Partialsummen zu untersuchen: $\sum_{k=1}^n \frac{2^k}{k}$ Ich möchte n-Werte finden, für die die Summe ganzzahlig ist. Ich habe etwas recherchiert, und dachte ich könnte mir das nötige Wissen dazu just-in-time anlesen. Leider finde ich keine Quelle die wirklich was taugt, wenn man sich auf die elementaren Grundbausteine eines Programms und mathematische Anwendung beschränken will. Viele Skripte, oder Tutorials gehen mir da viel zu langsam vor um wirklich hilfreich zu sein. Ich kann ja einmal skizzieren, was das Programm können sollte. Ich möchte einen N-Wert vorgeben, etwa N=1000 und dann das Programm prüfen lassen, für welche 1\leq n\leq N die obige Summe eine ganze Zahl ist. Ist dies erfüllt, möchte ich mir das Tupel (n, Summenwert) printen lassen. Meinen beschränkten Programmierkenntnissen zufolge klingt das nach while-Schleife mit if-Bedingung die einen Wahrheitswert prüft, und bei positiven Ergebnis das Resultat festhält. Ich scheitere aktuell aber bereits an der Implementierung der Summe... Vor allem konnte ich bisher nicht rausfinden, wie man das Programm prüfen lässt, ob etwas ganzzahliges vorliegt, oder nicht. Das Problem ist ja auch, dass die Ergebnisse der Summe relativ große Nenner haben werden, was eventuell zu Rundungsfehlern führt. Als Laie kann ich nicht beurteilen wie problematisch das ist. Hat jemand Interesse mir zu helfen, ohne mir einfach das Programm zu schreiben? Ausgangspunkt könnte etwa das verlinken einer kurzen Quelle sein, die das notwendige erklärt. Vielen Dank im voraus. Edit: Also die Summe konnte ich mittlerweile doch implementieren. Das müsste doch etwa so aussehen: def sum(n): if n == 0: return 0 else: res = 2**n / n + sum(n-1) return res while n < 1000: if str.isdigit(sum(n)) is true: print((n,sum(n))) else: n = n+1 Aber das funktioniert nicht. Wie prüfe ich korrekt ob str.isdigit(sum(n)) wahr oder falsch ist? Wie gesagt, bei wahr würde ich das Ergebnis gerne festhalten, wenn falsch, soll das Programm einfach die anderen Werte durchgehen. Wünschenswert wäre auch, wenn ich das Programm einfach selber nach Zahlen suchen lassen könnte.


   Profil
Limesine
Aktiv Letzter Besuch: im letzten Monat
Dabei seit: 30.01.2016
Mitteilungen: 179
  Beitrag No.1, eingetragen 2021-07-30

\sourceon Python def sum(n): if n == 0: return 0 else: res = 2**n / n + sum(n-1) return res n = 0 while n < 1000: if str(sum(n)).isdigit() is True: print((n,sum(n))) else: n = n + 1 \sourceoff 1. Du brauchst vor der while Schleife überhaupt erst eine Definition von n, weil sonst der Vergleich "n < 1000" gar keinen Sinn macht. n existiert ja noch gar nicht. Wie soll es da mit etwas verglichen werden können? 2. Die isdigit() Methode kann nur Strings als Input nehmen. Du musst dein sum(n) erst in eine Zahl umwandeln. 3. Du wendest die isdigit() Methode so an, dass du schreibst "String der überprüft werden soll".isdigit(). Der String kommt nicht in die Klammern am Ende. 4. In Python schreibt man "True" und nicht "true". 5. In der Schleife wird dann aber einfach nur überprüft, ob sum(n) als string vollständig aus Ziffern besteht. Da sum(n) immer Fließkommazahlen ausgibt, kann da auch immer nur false rauskommen. Der Code oben, den ich oben angepasst habe, funktioniert. Er tut jedoch nicht das was du willst. Damit du das was du machen willst, musst du erstmal überprüfen, ob die Zahl Nachkommastellen hat. Das sollte recht einfach möglich sein, indem du z.B. die Zahl abrundest und dann die Zahl durch die abgerundete Zahl teilst. Wenn es Nachkommastellen gibt, wird da etwas rauskommen, was ungleich 1 ist. Vielleicht gibt es da auch direkt eine Funktion in Python, leider kenne ich die nicht. Wenn da exakt 1 rauskommt, hast du auch schon eine ganze Zahl gefunden. Das geht bestimmt hübscher und effizienter, aber die Vorgehensweise ist glaube ich relativ instruktiv.


   Profil
gonz
Senior Letzter Besuch: in der letzten Woche
Dabei seit: 16.02.2013
Mitteilungen: 3933
Wohnort: Harz
  Beitrag No.2, eingetragen 2021-07-30

Hallo Letslearntogether, um zu testen, ob eine Wert ganzzahlig ist, musst du ihn nicht als string behandeln, sondern kannst die floor Funktion aus der math lib benutzen. Das sähe dann etwa so aus: \sourceon python import math #... irgendein code der x liefert ... x=2 if math.floor(x)==x: print("x ist ganzzahlig") else: print("x ist nicht ganzzahlig") \sourceoff Viel Erfolg weiterhin beim Programmieren! Grüße, Gonz


   Profil
LetsLearnTogether
Aktiv Letzter Besuch: in der letzten Woche
Dabei seit: 27.06.2021
Mitteilungen: 44
  Beitrag No.3, vom Themenstarter, eingetragen 2021-07-30

Vielen dank für die konstruktive Kritik. [Die Antwort wurde nach Beitrag No.1 begonnen.]


   Profil
LetsLearnTogether
Aktiv Letzter Besuch: in der letzten Woche
Dabei seit: 27.06.2021
Mitteilungen: 44
  Beitrag No.4, vom Themenstarter, eingetragen 2021-07-30

\sourceon Python import math def sum(n): if n == 0: return 0 else: res = 2 ** n / n + sum(n - 1) return res n = 0 while n < 1000: if math.floor(sum(n)) == sum(n): print((n, sum(n))) else: n = n + 1 \sourceoff Wenn ich das ausführe wird einfach nur (0,0) ausgegeben. Immer und immer wieder... Mich wundert es etwas, dass man so cheaten muss, um einen Integer zu erkennen, bzw. könnt ihr das Programm umsetzen? Das würde mich dann doch interessieren. Edit: Also kann jemand ein Programm schreiben, welches solche ganze Zahlen von alleine findet? Ich habe das Gefühl, dass solche n-Werte recht groß werden könnten.


   Profil
gonz
Senior Letzter Besuch: in der letzten Woche
Dabei seit: 16.02.2013
Mitteilungen: 3933
Wohnort: Harz
  Beitrag No.5, eingetragen 2021-07-30

Um es erst einmal zum laufen zu bekommen: Das n=n+1 gehört nicht in den else Zweig, denn du willst zum nächsten Wert von n vorrücken, auch wenn du gerade eine Lösung zum Ausgeben gefunden hast. Deshalb "hängt" dein Programm bei n=0 fest, das ja gleich eine Lösung ergibt. \sourceon python import math def sum(n): if n == 0: return 0 else: res = 2 ** n / n + sum(n - 1) return res n = 0 while n < 1000: if math.floor(sum(n)) == sum(n): print((n, sum(n))) n = n + 1 \sourceoff Ob die Ausgaben ab n=55 wirklich Lösungen sind, oder nur Problemen mit den großen Zahlen geschuldet sind, weiß ich nicht, das müsste man sich mal genauer ansehen.


   Profil
LetsLearnTogether
Aktiv Letzter Besuch: in der letzten Woche
Dabei seit: 27.06.2021
Mitteilungen: 44
  Beitrag No.6, vom Themenstarter, eingetragen 2021-07-30

\quoteon Ob die Ausgaben ab n=55 wirklich Lösungen sind, oder nur Problemen mit den großen Zahlen geschuldet sind, weiß ich nicht, das müsste man sich mal genauer ansehen. \quoteoff Wahrscheinlich sind es Probleme mit den großen Zahlen. Hmm, kann man denn dieses "Rundungsproblem" irgendwie umgehen? Vielleicht etwas mehr Kontext: Eine Übungsaufgabe aus einem Buch (Gouvêa, p-Adic Numbers) ist es einen direkten Beweis dafür zu geben, dass für alle ganze Zahlen $M>0$ es ein $n$ gibt, sodass $\sum_{k=1}^n \frac{2^k}{k}$ durch $2^M$ teilbar ist. Was ich recht verblüffend finde. Der Autor schreibt, dass er keinen direkten Beweis kennt. Einen elementaren Beweis soll man in "Exercises in Number Theory" von Parent finden können. Ich habe nicht nachgesehen. Man kann den Beweis aber natürlich auch mit p-adischen Methoden führen. Deshalb wollte ich erstmal ein Programm schreiben, um mir weitere ganze Zahlen anzusehen, die so entstehen.


   Profil
zippy
Senior Letzter Besuch: in der letzten Woche
Dabei seit: 24.10.2018
Mitteilungen: 2567
  Beitrag No.7, eingetragen 2021-07-30

\quoteon(2021-07-30 07:25 - gonz in Beitrag No. 5) Ob die Ausgaben ab n=55 wirklich Lösungen sind, oder nur Problemen mit den großen Zahlen geschuldet sind, weiß ich nicht, das müsste man sich mal genauer ansehen. \quoteoff Es sieht eher nach Rundungsfehlern aus: \sourceon maxima (%i1) sum (2**k / k, k, 1, 55); 6854191778848733235751043161816825856 (%o1) ------------------------------------- 5132792460157432044975 (%i2) sum (2**k / k, k, 1, 100); 27903944083832816639333032427210556256224784066792870078248713715712 (%o2) -------------------------------------------------------------------- 1089380862964257455695840764614254743075 \sourceoff Daher ist die Nutzung von Floats für dieses Problem auch nicht sinnvoll. --zippy [Die Antwort wurde nach Beitrag No.5 begonnen.]


   Profil
zippy
Senior Letzter Besuch: in der letzten Woche
Dabei seit: 24.10.2018
Mitteilungen: 2567
  Beitrag No.8, eingetragen 2021-07-30

\quoteon(2021-07-30 07:39 - LetsLearnTogether in Beitrag No. 6) Deshalb wollte ich erstmal ein Programm schreiben, um mir weitere ganze Zahlen anzusehen, die so entstehen. \quoteoff Dafür musst du dir aber deutlich größere Werte von $n$ ansehen. Unterhalb von $n=30\,000$ gibt es nur die beiden Fälle $n=1$ und $n=2$: \sourceon maxima (%i1) s: 0$ for k: 1 thru 30000 do (s: s + 2**k / k, if integerp(s) then print(k)); 1 2 \sourceoff


   Profil
LetsLearnTogether
Aktiv Letzter Besuch: in der letzten Woche
Dabei seit: 27.06.2021
Mitteilungen: 44
  Beitrag No.9, vom Themenstarter, eingetragen 2021-07-30

Ich würde ja fast vermuten, dass es keine weiteren ganzzahligen Lösungen gibt. Aber damit "$2^M$ teilt $\sum_{k=1}^n 2^k/k$" eine sinnvolle Frage ist, sollte es ja unendliche viele geben. Oder könnt ihr einen Wert finden, für den die Summe ganzzahlig ist?


   Profil
DerEinfaeltige
Senior Letzter Besuch: in der letzten Woche
Dabei seit: 11.02.2015
Mitteilungen: 2964
  Beitrag No.10, eingetragen 2021-07-30

Da hier nicht durch 2-er-Potenzen dividiert wird, sind binäre Gleitkommazahlen grundsätzlich nur als Näherung zu gebrauchen. fractions wäre ein Modul zur Bruchrechnung. Ob das hilft, steht auf einem anderen Stern. Ich bezweifle, dass naives Brute-Force auch nur eine nicht-triviale Lösung findet. Bis n=40000 scheint es jedenfalls keine zu geben. \sourceon Python \numberson import fractions S = fractions.Fraction(0) k = 1 while 1: if k % 1000 == 0: print(f"Checkpoint {k = }") S += fractions.Fraction(2**k,k) if S.denominator == 1: print(f"Integral Solution found at {k = }: {S = }") k += 1 \sourceoff [Die Antwort wurde nach Beitrag No.7 begonnen.]


   Profil
Nuramon
Senior Letzter Besuch: in der letzten Woche
Dabei seit: 23.01.2008
Mitteilungen: 3009
  Beitrag No.11, eingetragen 2021-07-30

\(\begingroup\)\(\renewcommand{\Re}{\operatorname{Re}} \renewcommand{\Im}{\operatorname{Im}} \newcommand{\End}{\operatorname{End}} \newcommand{\id}{\operatorname{id}} \newcommand{\GL}{\operatorname{GL}} \newcommand{\im}{\operatorname{im}} \newcommand{\sgn}{\operatorname{sgn}} \newcommand{\d}{{\rm d}} \newcommand{\rg}{\operatorname{rg}} \newcommand{\spur}{\operatorname{spur}} \newcommand{\Hom}{\operatorname{Hom}} \newcommand{\tr}{\operatorname{tr}} \newcommand{\opn}{\operatorname} \newcommand\ceil[1]{\left\lceil #1 \right\rceil} \newcommand\floor[1]{\left\lfloor #1 \right\rfloor}\) Hallo, für $n\geq 3$ ist die Summe nie ganzzahlig: Nach dem Bertrandschen Postulat gibt es nämlich eine Primzahl $p$ mit $\ceil{\frac n2} < p \leq n$ und man überlegt sich leicht, dass dann $\sum_{k=1}^n \frac{2^k}k = \frac AB$ für $A,B\in\IN$, wobei $B$ durch $p$ teilbar ist, $A$ aber nicht. Die Übungsaufgabe ist also vielleicht eher so gemeint, dass es für jedes $M$ ein $n$ gibt, so dass die $2$-adische Bewertung der Summe bis $n$ mindestens $M$ ist.\(\endgroup\)


   Profil
LetsLearnTogether
Aktiv Letzter Besuch: in der letzten Woche
Dabei seit: 27.06.2021
Mitteilungen: 44
  Beitrag No.12, vom Themenstarter, eingetragen 2021-07-30

@Nuramon: Danke. Ich hatte mich schon gewundert, und hätte es vielleicht mal durchdenken sollen. Ich war schon stutzig, weil ich erst vor kurzem gezeigt hatte, dass die Partialsummen der harmonischen Reihe nie ganzzahlig sind. Mit dem gleichen Argument über das Bertrandsche Postulat, welches du skizziert hast. Die Aufgabe wird in dem genannten Buch in einer informellen Einleitung gestellt (die ich nicht im Detail studiert habe), aber es deutete alles darauf hin, dass die Aussage stimmt, was sie in einem gewissen Sinne auch gewiss tut. Ich hatte Teilbarkeit hier im Sinne der ganzen Zahlen interpretiert. Ursprünglich hatte ich diesen Thread erstellt, um die Grundlagen der Programmierung zu erlernen, und nicht das Problem zu diskutieren. Tut mir leid, wenn jetzt einige Rechner- und Gehirnleistung aufgebracht haben um ganze Zahlen zu finden. Das Problem ist ja aber eigentlich doch ziemlich interessant, weshalb man mir das verzeihen mag. :)


   Profil
LetsLearnTogether
Aktiv Letzter Besuch: in der letzten Woche
Dabei seit: 27.06.2021
Mitteilungen: 44
  Beitrag No.13, vom Themenstarter, eingetragen 2021-08-01

Hallo, ich wollte das hier noch einmal aufwärmen, da wie gesagt der eigentliche Beweggrund für die Frage die Empfehlung von geeigneter Literatur war. \quoteon kennt jemand von euch eine gute Einführung um das mathematikorientierte programmieren in Python zu erlernen? \quoteoff Dazu wurde sich bisher nie geäußert. Wahrscheinlich ist das aus dem Thread auch nicht ganz ersichtlich gewesen, so wie ich die Frage gestellt hat. Eventuell mag sich dazu noch jemand äußern.


   Profil
DerEinfaeltige
Senior Letzter Besuch: in der letzten Woche
Dabei seit: 11.02.2015
Mitteilungen: 2964
  Beitrag No.14, eingetragen 2021-08-01

Die Frage ist sehr allgemein und lässt sich so kaum beantworten. Für Numerik sollte man sich mit numpy und gegebenenfalls scipy beschäftigen. Für symbolische und zahlentheoretische Berechnungen bietet sympy einiges an Funktionalität. Um einfache Probleme lösen zu lernen wäre mein Vorschlag, einfach mal die ersten 100 Probleme im "Project Euler" durchzuarbeiten.


   Profil
LetsLearnTogether
Aktiv Letzter Besuch: in der letzten Woche
Dabei seit: 27.06.2021
Mitteilungen: 44
  Beitrag No.15, vom Themenstarter, eingetragen 2021-08-01

Gibt es eigentlich einen signifikanten Unterschied zwischen anderen "freien" Sprachen wie Python, oder Sage?


   Profil
rlk
Senior Letzter Besuch: in der letzten Woche
Dabei seit: 16.03.2007
Mitteilungen: 11110
Wohnort: Wien
  Beitrag No.16, eingetragen 2021-08-01

Hallo Letslearntogether, vielleicht hilft Dir A Crash Course in Python for Scientists von Rick Muller, Sandia National Laboratories weiter? SageMath ist ein Computeralgebra-System, verwendet aber eine Syntax die der von Python ähnlich ist. Ohne es selbst verwendet zu habe denke ich, dass es für Aufgaben wie diese besser geeignet ist als Python. Servus, Roland


   Profil
helmetzer
Senior Letzter Besuch: in der letzten Woche
Dabei seit: 14.10.2013
Mitteilungen: 1531
  Beitrag No.17, eingetragen 2021-08-01

\quoteon(2021-07-30 05:44 - LetsLearnTogether im Themenstart) Ich habe etwas recherchiert, und dachte ich könnte mir das nötige Wissen dazu just-in-time anlesen. Leider finde ich keine Quelle die wirklich was taugt, wenn man sich auf die elementaren Grundbausteine eines Programms und mathematische Anwendung beschränken will. Viele Skripte, oder Tutorials gehen mir da viel zu langsam vor um wirklich hilfreich zu sein. \quoteoff Ob ein Ausdruck ganzzahlig ist, kann nicht untersucht werden, indem man mit Gleitkommazahlen rechnet. Also erst selber nachdenken, Kritik an "Skripten oder Tutorials" ist wohlfeil.


   Profil
LetsLearnTogether
Aktiv Letzter Besuch: in der letzten Woche
Dabei seit: 27.06.2021
Mitteilungen: 44
  Beitrag No.18, vom Themenstarter, eingetragen 2021-08-02

@helmetzer: Ich glaube du hast meine Frage nicht so ganz verstanden.


   Profil
LetsLearnTogether hat die Antworten auf ihre/seine Frage gesehen.

Wechsel in ein anderes Forum:
 Suchen    
 
All logos and trademarks in this site are property of their respective owner. The comments are property of their posters, all the rest © 2001-2021 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]