|
|
| Folgender Benutzer sagt Danke zu dreihirn für den nützlichen Beitrag: | ||
Gilgamesch (02.08.2023) | ||
|
|||||||||||
|
AW: Das 3n+1 / 5n+1 Problem
Hallo Ingo,
Open Source ist sowieso besser, deshalb im Anhang jetzt der komplette Source Code in C (auch zur Kontrolle) und das Ergebnis. Der Code sollte mit den Kommentaren leicht verständlich sein und ist ja auch nur 60 Zeilen lang. Man sollte halt nicht spät nachts oder in Zeitnot etwas programmieren, nur weil es einen interessiert. Sollte ich nach 35 Jahren Software Entwicklung eigentlich wissen. Ein Auszug aus dem Ergebnis: 1: Startwert 2: Anzahl Runden 3: Anzahl Veränderungen des Wertes 4: Größter vorkommender Wert Code:
5 1 5 16 6 2 7 96 7 2 6 56 8 4 18 896 9 1 3 28 10 3 15 296 11 5 27 1840 12 7 39 1840 13 1 4 40 14 9 51 1840 15 3 13 116 16 15 84 19176 ... 91 20 116 1226576 92 5 30 2080 93 6 36 1840 94 31 181 986976 95 321 1894 2958675001976 96 10 57 12640 97 6 36 1840 ... 354 251 1485 78373215640 355 30 177 986976 356 30 177 986976 357 2 17 1072 358 2 17 5376 359 20 118 19176 360 11 66 62676 361 4 26 4776 362 9 53 12640 363 9 53 19176 364 31 183 111476 365 20 118 1226576 366 9 53 5496 367 20 118 1226576 368 20 118 291476 369 5 32 2080 370 9 53 9776 371 5 32 7840 372 Overflow Code:
698 Overflow 794 Overflow 1274 Overflow 1489 Overflow 1694 Overflow 1771 Overflow 2100 Overflow 2240 Overflow |
| Folgende 2 Benutzer sagen Danke zu Gilgamesch für den nützlichen Beitrag: | ||
dreihirn (02.08.2023), Wandersleben (02.08.2023) | ||
|
|||||||||||
|
AW: Das 3n+1 / 5n+1 Problem
Das Programm in FreeBasic würde etwa so aussehen:
Dim As UInt64 max64_3 = 18446744073709551615 / 3 - 1 Dim As UInt64 max64_5 = 18446744073709551615 / 5 - 1 Dim As UInt64 biggest_number Dim As Integer runde Function sequence(n As UInt64) As Integer Dim As Integer count = 0 runde = 1 biggest_number = 0 Do If n > max64_3 Then Return -1 ' Check auf Overflow (nach der Multiplikation) n = 3 * n + 1 count += 1 If n > biggest_number Then biggest_number = n While (n Mod 2) = 0 n /= 2 count += 1 Wend If n < 8 Then Return count If n > max64_5 Then Return -1 ' Check auf Overflow (nach der Multiplikation) n = 5 * n + 1 count += 1 If n > biggest_number Then biggest_number = n While (n Mod 2) = 0 n /= 2 count += 1 Wend runde += 1 If n < 8 Then Return count If count > 1000000 Then ' Infinite Loop Return -2 End If Loop End Function Sub Main() Dim As UInt64 n Dim As Integer count For n = 5 To 372 count = sequence(n) If count = -1 Then Print n; " Overflow" ElseIf count = -2 Then Print n; " Infinite Loop" Else Print n; " "; runde; " "; count; " "; biggest_number End If Next End Sub Schaut für mich übersichtlicher aus als das C-Programm. Aber C war noch nie wirklich für übersichtlichen Quellcode bekannt, lach. Für diejenigen, die sich in FreeBasic nicht so gut auskennen: count += 1 ist eine Kurzform für count = count + 1. Entsprechend bedeutet n /= 2 einfach n = n / 2 Ein entsprechendes Turbo-Pascal-Programm sieht ziemlich ähnlich aus, ich habe es aber nicht getestet. program CollatzSequence; uses sysutils; const max64_3: UInt64 = 18446744073709551615 div 3 - 1; max64_5: UInt64 = 18446744073709551615 div 5 - 1; var biggest_number: UInt64; runde: Integer; function Sequence(n: UInt64): Integer; var count: Integer; begin count := 0; runde := 1; biggest_number := 0; repeat if n > max64_3 then Exit(-1); // Check auf Overflow (nach der Multiplikation) n := 3 * n + 1; Inc(count); if n > biggest_number then biggest_number := n; while (n mod 2) = 0 do begin n := n div 2; Inc(count); end; if n < 8 then Exit(count); if n > max64_5 then Exit(-1); // Check auf Overflow (nach der Multiplikation) n := 5 * n + 1; Inc(count); if n > biggest_number then biggest_number := n; while (n mod 2) = 0 do begin n := n div 2; Inc(count); end; Inc(runde); if n < 8 then Exit(count); if count > 1000000 then Exit(-2); // Infinite Loop until False; end; var n: UInt64; count: Integer; begin for n := 5 to 372 do begin count := Sequence(n); if count = -1 then WriteLn(n, ' Overflow') else if count = -2 then WriteLn(n, ' Infinite Loop') else WriteLn(n, ' ', runde, ' ', count, ' ', biggest_number); end; end.
__________________
Mein Profil beim ICCF (International Correspondence Chess Federation) https://www.iccf.com/player?id=89948&tab=3 Geändert von Hartmut (02.08.2023 um 19:16 Uhr) |
| Folgende 2 Benutzer sagen Danke zu Hartmut für den nützlichen Beitrag: | ||
Gilgamesch (02.08.2023), Wandersleben (02.08.2023) | ||
|
|||||||||||
|
AW: Das 3n+1 / 5n+1 Problem
Stimmt, bei den Programmiersprachen gibt es ganz unterschiedliche Präferenzen.
Der komplette C Code, erzeugt denselben Output, mal etwas schwerer lesbarer ![]() #include"stdio.h" #include"stdint.h" #define z c++;if(n>b)b=n;while((n%2)==0){n/=2;c++;} uint64_t u=18446744073709551615/3-1,v=18446744073709551615/5-1,b;int r;int s(uint64_t n){int c=0;r=1;b=0; for(;; ){if(n>u)return-1;n=3*n+1;z if(n<8)return c;if(n>v)return-1; n=5*n+1;z r++;if(n<8)return c;if(c>1000000)return-2;}} int main(){for(uint64_t n=5;n<373;n++){int c=s(n);if(c==-1)printf("%4I64u Overflow\n",n); if(c==-2)printf("%4I64u Infinite Loop\n",n);if(c>=0)printf("%4I64u %4d %5d %16I64u\n",n,r,c,b);}} |
|
||||||||||||
|
AW: Das 3n+1 / 5n+1 Problem
Liebe Leute,
Ihr kommt etwas vom Thema ab. Trotzdem möchte ich auch eine Erinnerung beisteuern. Um 1990 herum war ich in Kontakt mit Wolfgang Delmare, der damals auch Schachprogrammierer war. Im Gespräch erzählte er über ein abgebrochenes Gespräch mit einem anderen Programmierer (Helmut Horacek?). Auch wenn es vielleicht nicht Helmut war, kürze ich ihn mal mit HH ab und Wolfgang mit WD. HH: Wie lang ist denn Dein Schachprogramm? WD: Meinst Du in Zeilen oder in Kommandos? HH: Genau. WD: Das ist aber nicht das Gleiche. Meinst Du Zeilen oder meinst Du Kommandos? HH: Aber man schreibt doch in jede Zeile nur ein Kommando. WD: Ich nicht. Meist kriege ich zwei bis drei Kommandos in eine Zeile. Wolfgang zu mir: An der Stelle brach HH das Gespräch ohne weitere Erklärung ab. ******************************** Aus Interesse frage ich mal: Was liefert das BASIC-Programm denn für Ergebnisse für das 15n+1/n+1 -Problem? Gibt es da auch so abgefahrene kleine Startwerte wie die 95 bei 3n+1/5n+1 ? Neugierige Grüße, Ingo.
__________________
Fließendes Wasser kennt keinen Kampf (Takagawa Kaku; alter Go-Meister) |
|
|||||||||||
|
AW: Das 3n+1 / 5n+1 Problem
Mein Post sollte nur helfen, den Code besser zu verstehen, da FreeBasic und Pascal als imperative Sprachen teilweise besser zu verstehen sind, wenn man in der C-Programmierung nicht so drin ist. Geht mir jedenfalls so.
__________________
Mein Profil beim ICCF (International Correspondence Chess Federation) https://www.iccf.com/player?id=89948&tab=3 |
|
||||||||||||
|
AW: Das 3n+1 / 5n+1 Problem
Hallo Hartmut,
wir schreiben aneinander vorbei. Es ist mir egal, ob 15n+1/n+1 mit dieser oder jener Programmiersprache attackiert wird. Ich traue Euch beiden zu, richtig zu programmieren. Der Punkt ist: Ich habe zuletzt 1992 programmiert (Zillions ausgenommen, aber das ist ja etwas anderes) und kann nicht mehr programmieren. Wobei ich beim Betrachten von Programmcode schon noch die eine oder andere Ungereimtheit erkenne. Zur Erinnnerung: 15n+1/n+1 hat die drei Fixpunkte 1 3 5 (und vielleicht weitere). Viele Grüße, Ingo.
__________________
Fließendes Wasser kennt keinen Kampf (Takagawa Kaku; alter Go-Meister) |
|
|||||||||||
|
AW: Das 3n+1 / 5n+1 Problem
Hallo Ingo,
diese Folge scheint wesentlich interessanter zu sein als die andere. Es gibt bis jetzt die Fixpunkte: 1, 3, 5, 9, 31, 507 Der erste Overflow erfolgt bei 1799 Anbei wieder Code + Liste. Ein Auszug aus der Liste: 1. Startwert 2. Anzahl Runden bis zum zweiten Erreichen des niedrigsten Wertes 3. Anzahl Veränderungen des Wertes bis zum zweiten Erreichen des niedrigsten Wertes 4. Niedrigster Wert der zweimal erreicht wird (Fixpunkt) 5. Höchster erreichter Wert Code:
1 1 6 1 16 3 2 11 3 46 5 2 11 5 76 7 4 24 3 766 9 2 11 9 136 11 3 18 5 316 13 3 19 3 376 15 5 31 3 856 17 1 10 1 256 19 2 12 9 286 21 2 13 5 316 23 16 95 9 800056 25 2 14 3 376 27 3 20 3 766 29 173 1021 31 643680766 ... 129 6 40 3 1936 131 17 105 3 37726 133 175 1035 31 643680766 135 44 257 507 122625406 ... 1787 266 1578 9 42897306732256 1789 161 956 31 643680766 1791 19 119 9 800056 1793 19 119 9 800056 1795 19 119 9 800056 1797 194 1151 31 643680766 1799 Overflow |
| Folgende 3 Benutzer sagen Danke zu Gilgamesch für den nützlichen Beitrag: | ||
|
||||||||||||
|
AW: Das 3n+1 / 5n+1 Problem
Liebe Leute,
nach wie vor sitze ich an Varianten des 3n+1-Problems. Gestern abend ist das 5n+-1 Problem dazu gekommen. Es geht los mit einer ungeraden Zahl n. Zu der bildet man 5n-1 und 5n+1. Dies sind beides gerade Zahlen. Eine von ihnen ist durch 4 teilbar, die andere nur durch 2. Man nimmt die Zahl, die durch 4 teilbar ist, und halbiert so lange, bis sich eine ungerade Zahl ergibt. Von der aus startet die nächste Runde. Beispiele: 1 -> (4 , 6) -> 4 -2 -1 Also ist 1 ein Fixpunkt. 7 -> (34 , 36) -> 36 - 18 - 9 9 -> (44 , 46) -> 44 - 22 - 11 11 -> (54 , 56) -> 56 - 28 - 14 - 7 Also ist 7-9-11-7 ein Zyklus. Bis zum Startwert 109 habe ich keine weiteren Zykel gefunden. Vermutung: Jeder Startwert läuft in einen Zyklus. Frage: Sind 1 und 7-9-11 die einzigen Zyklen? Dank im Voraus an alle, die ihre Engine-Bestien auf das Problem loslassen! Herzliche Grüße, Ingo.
__________________
Fließendes Wasser kennt keinen Kampf (Takagawa Kaku; alter Go-Meister) |
|
|||||||||||
|
AW: Das 3n+1 / 5n+1 Problem
Hallo zusammen,
ich habe es mal schnell durchlaufen lassen (5n-1 und 5n+1), die Änderungen am vorigen Programmcode sind ja überschaubar. Ergebnis: 1. Bis zum Startwert 1.000.000 treten nur die Fixpunkte 1 und 7 auf. 2. Die Folge konvergiert immer sehr schnell, der höchste vorkommende Wert ist nur maximal 10-15 mal größer als der Startwert. 3. Aufgrund von (2.) gibt es auch keine besonderen Ausreißer oder Überraschungen, alles läuft sehr schnell in 1 oder 7 rein. Viele Grüße, Thomas |
| Folgender Benutzer sagt Danke zu Gilgamesch für den nützlichen Beitrag: | ||
dreihirn (14.08.2023) | ||
![]() |
|
|
Ähnliche Themen
|
||||
| Thema | Erstellt von | Forum | Antworten | Letzter Beitrag |
| Hilfe: Mondial II - Problem | Eckehard Kopp | Technische Fragen und Probleme / Tuning | 5 | 09.05.2016 22:48 |
| Frage: MM I-Problem | Eckehard Kopp | Technische Fragen und Probleme / Tuning | 1 | 26.03.2016 03:09 |
| Frage: Problem mit einem Problem | udo | Teststellungen und Elo Listen / Test positions and Elo lists | 10 | 29.05.2011 01:25 |
| Frage: Fidelity-Problem | Eckehard Kopp | Technische Fragen und Probleme / Tuning | 1 | 29.09.2006 08:36 |