Ich und mein großes Maul
Das ist ja ekelhaft im allgemeinen Fall, aber das musste ich heute Abend noch durchtüfteln, nachdem ich mich über die schlechten Mathekenntnisse der KI lustig gemacht habe.Jetzt sollte hoffentlich alles passen, egal welche m und n.
Leider habe ich einen allerletzten Ausdruck, wo ich eine Fallunterscheidung habe, da ich eine Stufenfunktion brauche, die 0 für x < 0 und 1 für x >= 0 ist. Das kann man nicht mehr mit primitiven Operationen wie Plus, Minus, Mal, Geteilt schreiben, da muss man irgendwie verzweigen. Du kannst das entweder so machen wie ich, mit einem expliziten if, oder das irgendwie verstecken hinter irgendwelchen sign oder abs Funktionen (Was immer Javascript da so hat), die dann intern aber auch nix anderes machen.
Der finale Ausdruck ist lang. Es gäbe auch eine Erklärung, die wäre nochmals viel länger, aber ich denke mit ausreichendem Draufgucken kann man verstehen, was da vor sich geht. Das schafft dann aber kein Drittklässler mehr, vermutlich auch die meisten Abiturienten nicht.
Da ich das in Python ausgekügelt habe, und keine Lust habe, das jetzt auch noch in LaTeX zu setzen kopiere ich einfach mein Testprogramm hier. Das sollte trivial nach Javascript übersetzbar sein, und Python ist so einfach, da muss ich wohl nicht erklären, was die Syntax bedeutet:
import math
def H(x):
# Stufenfunktion, wie auch immer du die in Javascript mit den erlaubten Mitteln machen würdest
return 1 if x >= 0 else 0
def func(i, n, m):
L = math.floor(m / n)
s = m - n * L
T = s * (L + 1)
J = H(i - T) # Hier müssen wir feststellen, ob i-T >= 0 ist (d.h. ob i >= T)
return n * ((i - T * J) % (L + 1 - J)) + (1 - J) * math.floor(i / (L + 1)) + J * (s + math.floor((i - T) / L))
n = 4
m = 18
for i in range(m):
print(i, func(i, n, m))
Die Namen der Behelfsvariablen (L, s, T) haben eine gewisse Bedeutung in meinem Kopf, und aus der Herleitung heraus, aber sind nicht wichtig. Die Geschichte mit dem J ist, dass ich es als persönliche Herausforderung gesehen habe, kein if zu nutzen. Das ganze wäre viel einfacher, wenn man mit if i < T einfach zwei verschiedenen Formeln nutzen würde.
Die Grundidee ist, dass wir uns ausrechnen, wie viele lange Zyklen haben, und wie viele kurze (das ist das s) , und vor allem, wo der Übergang von den langen zu den kurzen ist. Das ist das T. Bei n = 4 und m = 18 haben wir 2 kurze Zyklen mit nur 4 Werten (und somit 2 andere mit 5 Werten). Der Übergang ist dann bei i = 2 * 5 = 10.
Wenn i >= T ist, sind wir in einer kurzen Zeile. Mit diesem Wissen können wir dann den korrekten Wert innerhalb der Zeile konstruieren. Bei i < T haben wir Zyklen von Länge L + 1, ab i >= T ist die Länge L. Das ist alles in dem langen Ausdruck am Ende verpackt.
Die Ordnung der Zyklen ist natürlich willkürlich, man hätte genausogut auch anders ordnen können, aber ich mochte dass die Sequenz bei 0 mit 0 beginnt, und das schien mir die natürliche Ordnung von da an.