I don´t like mondays

Für einige Jahre kann man die Frage stellen, welcher Tag, wenn man diesen für den 10. Februar 2013 etwa in der Form 10022013 darstellt, eine Primzahl ergibt. Für das Jahr 2013 geht das, für 2014, aus naheliegenden Gründen, nicht. Dafür kann man für jedes Jahr die Frage stellen, in welcher Zahl, die die jeweiligen Tage darstellt, der größte Primfaktor enthalten ist. Für das Jahr 2014 ist dies der 30. Oktober, wie wir gleich sehen werden. Mit Hilfe von Mathematica ist es einfach derartige "Spielereien" zu betreiben. Zunächst wird aus der Liste der Tage eines Jahres eine Liste ganzer Zahlen gemacht, das tut der nebenstehende Mathematica-Code:

listeTage[jahr_Integer] := FromDigits /@
Flatten /@ 
IntegerDigits /@
Reverse /@
DateRange[{jahr, 1, 1}, {jahr, 12, 31}];

Was auf den ersten Blick verwirrend aussieht ist im Grunde recht einfach. Es wird die Liste der Tage gebildet, jedes einzelne Element in der Reihenfolge umgedreht, so daß das Jahr vorne steht. Aus den Zahlen wird die Ziffernfolge gebildet und dann als ganze Zahl zusammengesetzt.

Die Zahlen in dieser Liste werden nun ganz einfach in ihre jeweiligen Primfaktoren zerlegt, das tut der folgende Befehl: faktorisierteTage = FactorInteger /@ tage2014. Da jeder der einzelnen Primfaktoren in der Form {Faktor, Häufigkeit} aufgeführt wird müssen wir jeweils die erste Komponenten eines solchen Paares extrahieren, da wir uns in diesem Falle nur für die Primfaktoren, nicht aber für die Häufigkeiten interessieren. Wir wählen hierzu die "brutal-einfache" Methode, da es für "Take", meines Wissens nach, keine "leveslspec" Anweisung gibt, mit der man direkt auf eine entsprechende Listentiefe zugreifen könnte.

primFaktoren = Take[#, 1] & /@ Partition[Flatten[faktorisierteTage], 2] // Flatten

Die Liste der Tage wird zunächst mit Flatten "eingeebnet", um danach wieder (auf der ersten Ebene!) Zweierpaare zu bilden. Von diesen wird jeweils die erste Komponenten gewählt.
Man erhält eine Liste von Listen, die dann mit einem erneuten Flatten zu einer Liste gemacht wird.

Da der jeweils größte Primfaktor (eines jeden Tages) ganz rechts in der Liste der Faktoren steht, kann man diesen einfach mit liste[[All,-1]] extrahieren. Danach hat man eine Liste der größten Primfaktoren eines jeden Tages für das gegebene Jahr. Daraus wiederum eine Liste der jeweils größten Primfaktor (des Tages) zu extrahieren ist einfach liste = #[[1]] & /@ liste. Mit diesen Vorarbeiten ist eine entsprechende Mathematica Funktion schnell "zusammengebaut":

Stacks Image 2951

Diese liefert nun für jedes Jahr den größten Primfaktor in der Zerlegung der Tage des jeweiligen Jahres sowie die Position innerhalb des Jahres, an der dieses Maximum angenommen wird. Damit kann man den Tag exakt bestimmen. Tut man dies für das Jahr 2014 erhält man als größtenPrimfaktor die Zahl 15.051.007 an der Position 303 innerhalb des Jahres 2014. Dies entspricht dem 30. Oktober 2013, ein Donnerstag, was man mit dem Befehl DayName @ DatePlus[{2014, 1, 1}, 302] sofort erhält. Mathematica gibt hier natürlich "Thursday" aus, was aber kein Problem darstellt.

tageDeutsch = {Sunday -> "Sonntag", Monday -> "Montag", Tuesday -> "Dienstag", Wednesday -> "Mittwoch", Thursday -> "Donnerstag", Friday -> "Freitag", Saturday -> "Samstag"};

Mit der hier rechts dargestellten, einfachen Regel werden die Wochentage ganz einfach ins Deutsche übersetzt.

Stacks Image 2984

So sind die Tage schnell "eingedeutscht". Der Einfachheit halber habe ich auch dies in eine kleine Mathematica Funktion gepackt, die mir für jedes Jahr den (deutschen) Namen des Wochentages liefert, an dem das Maximum der Primfaktoren angenommen wird:

Stacks Image 2988

Jetzt kann sehr schnell für jedes Jahr des Jahrhunderts der Tag bestimmt werden, an dem das Maximum angenommen wird. Dazu sind nur zwei kurze Befehlsfolgen notwendig, wie hier rechts gezeigt.Danach muß man für die entstandene Liste von Wochentagen nur noch die Häufigkeiten der Wochentage ermitteln. Das tut der Befehl "Tally".

jahre = Range[2000, 2099];
temp = maxPrimfaktor[#] & /@ jahre;
positionen = temp[[All, 2]];

wochentage = tagesNamen[##] & @@@ ({jahre, positionen}T);
frequenz = Tally @ wochentage;

Nun bleibt nur noch die Erzeugung einer ansprechenden Grafik. Hier habe ich die Form eines Balkendiagramms gewählt.
Stacks Image 2999

Download

  • Download PDF

  • Download Notebook

RapidWeaver Icon

Made in RapidWeaver