Die palindromische Ordnung

Ein Palindrom ist eine Zeichenkette, die v vorwärts, wie rückwärts gelesen den selben Inhalt hat. Zum Beispiel sind "Otto" oder "Lagerregal" Palindrome.Wir betrachten hier Zahlen, also sind beispielsweise "121" oder "1771" Palindrome, "34" jedoch nicht.

Dreht man die Zahl 34 um, macht aus 34 also 43 und addiert die beiden Zahlen, so erhält man 34+43 = 77, ein Palindrom! Probiert man dies mit der Zahl 37 aus, so erhält man: 37 + 73 = 110, kein Palindrom, o.k. Wenn man dieses Verfahren nun nochmals anwendet, also auf das Ergebnis der vorigen Rechnung 110, anwendet ergibt sich: 110 + 011 = 121 - doch wieder ein Palindrom. Die Anzahl der Anwendungen dieses Verfahren für eine gegebene Zahl, bis man ein Palindrom erhält nennt man die palindromische Ordnung der Zahl. Die Zahl 34 hat damit die palindromische Ordnung 1 und 37 die palindromische Ordnung 2.

Wir werden nun ein paar Zeilen Mathematica Code entwerfen mit Hilfe dessen wir die palindromische Ordnung einer Zahl bestimmen können.

My Image
Zunächst erzeugen wir einen Test, der überprüft, ob eine Zahl ein Palindrom ist, oder nicht. Als Vorbereitung dafür extrahieren wir aus einer gegebenen Zahl die Ziffern, dies geschieht in nebenstehenden Code mit dem Befehl IntegerDigits.
Anschließend bestimmen wir die Zahl, die entsteht, wenn man die Ziffern in umgekehrter Reihenfolge liest. Dies passiert mit dem Befehl Reverse.
Dann kann man einfach die Zahl "zusammenbasteln", die aus der umgekehrten Ziffernreihenfolge entsteht. Das übernimmt die Funktion Fold.
Damit erzeugen wir eine Funktion, die Funktion ReverseInteger, die eine gegebene Zahl "umdreht", also die Zahl erzeugt, die entsteht, wenn die Ziffern in umgekehrter Reihenfolge gelesen werden.
Und schon kann man eine Funktion definieren, die testet, ob eine gegebene Zahl ein Palindrom ist oder nicht, dies ist die Funktion testPalindrom.
a = 1234567;
liste = IntegerDigits[a]
{1, 2, 3, 4, 5, 6, 7}
rliste = Reverse[liste]
{7, 6, 5, 4, 3, 2, 1}
Fold[10 #1 + #2 &, 0, rliste]
7654321
reverseInteger[n_] := Fold[10 #1 + #2 &, 0, Reverse[IntegerDigits[n]]];
testPalindrom[n_] := n == reverseInteger[n]
palindromOrdnung[n_, maxiter_] := Module[{temp = n, i = 1},
While[testPalindrom[temp] == False && i < maxiter,
temp = temp + reverseInteger[temp];
i++;
]; (* End while *)
If[i >= maxiter,
Print["*** Maximum der Iterationen erreicht: ", n, ": ", temp]; , i]
]
Jetzt kann man direkt eine Funktion schreiben, die die palindromische Ordnung zu einer Zahl berechnet. Zur Sicherheit bauen wir hier eine Obergrenze ein, bis zu der getestet wird, ob bereits ein Palindrom erreicht wurde... man weiß ja nie, oder, wie in diesem Falle, man weiß ja vorher schon, was passieren wird.
Stellt man nun die palindromische Ordnung der Zahlen bis etwa 300 graphisch dar, so erhält man die folgende Abbildung. Dabei ist deutlich zu erkennen, daß es einige Zahlen gibt deren palindromische Ordnung nicht berechnet werden konnte, da die Maximalzahl der Iterationen (hier 200) erreicht wurde.
Diese Zahlen sind 196 und 295. Nach 200 Iterationen, ausgehend von der Zahl 196, wurde die Zahl:
1727771406219778777543062557405118846645642140346636747711515645369345777787911604276737
ermittelt, ohne daß auf dem Weg dorthin ein Palindrom "angetroffen" wurde. Bis heute ist nicht bekannt, ab man, ausgehend von 196, mit dem beschriebenen Verfahren auf ein Palindrom trifft, oder nicht.....
Stacks Image 26