Zu vollgefressen zum Abheben

Ein Eichhörnchen turnt durch Zweige

Keine Zikaden in Weinheim: das Eichhörnchen im dortigen Arboretum konnte noch munter turnen.

Wieder mal eine Tier-Geschichte aus Forschung aktuell am Deutschlandfunk: In der Sendung vom 25.5. gab es ein Interview mit Zoe Getman-Pickering, die derzeit eine Massenvermehrung von Zikaden an der US-Ostküste beobachtet. Im Gegensatz zu so mancher Heuschreckenplage kam die nicht unerwartet, denn ziemlich verlässlich alle 17 Jahre schlüpfen erstaunliche Mengen dieser Insekten und verwandeln das Land in ein

All-You-Can-Eat-Buffet. Es gibt schon Berichte von Eichhörnchen und Vögeln, die so fett sind, dass sie nicht mehr richtig laufen können. Die sitzen dann einfach nur herum und fressen eine Zikade nach der anderen.

Es war dieses Bild von pandaähnlich herumhockenden Eichhörnchen, die Zikaden in sich reinstopfen eine einE Couch Potato Kartoffelchips, das meine Fantasie angeregt hat.

Gut: Gereizt hat mich auch die Frage, wo auf der Fiesheitssakala ich eigentlich einen intervenierenden Teil der Untersuchung ansiedeln würde, der im Inverview angesprochen wird: Um

herauszufinden [ob die Vögel noch Raupen fressen, wenn sie Zikaden in beliebigen Mengen haben können], haben wir auch künstliche Raupen aus einem weichen Kunststoff. Die setzen wir auf die Bäume. Und wenn sich dann Vögel für die künstlichen Raupen interessieren, dann picken sie danach

und sind bestimmt sehr enttäuscht, wenn sie statt saftiger Raupen nur ekliges Plastik schmecken. Na ja: verglichen mit den abstürzenden Fledermäuse von neulich ist das sicher nochmal eine Stufe harmloser. Balsam für die Ethikkommission, denke ich. Das Ergebnis übrigens: Ja, die Zikadenschwemme könnte durchaus eine Raupenplage nach sich ziehen.

Die Geschichte hat ein Zuckerl für Mathe-Nerds, denn es ist ja erstmal etwas seltsam, dass sich die Zikaden ausgerechnet alle 17 Jahre verabreden zu ihren Reproduktionsorgien. Warum 17? Bis zu diesem Interview war ich überzeugt, es sei in ÖkologInnenkreisen Konsens, das sei, um synchronen Massenvermehrungen von Fressfeinden auszuweichen, doch Getman-Pickering hat mich da eines Besseren belehrt:

Aber es gibt auch Theorien, nach denen es nichts mit den Fressfeinden zu tun hat. Sondern eher mit anderen Zikaden. Der Vorteil wäre dann, dass die Primzahlen verhindern, dass unterschiedliche Zikaden zur gleichen Zeit auftreten, was dann schlecht für die Zikaden sein könnte. Und dann gibt es auch noch einige Leute, die es einfach nur für einen Zufall halten.

Das mit dem Zufall fände ich überzeugend, wenn bei entsprechenden Zyklen in nennenswerter Zahl auch nichtprime Perioden vorkämen. Und das mag durchaus sein. Zum Maikäfer zum Beispiel schreibt die Wikipedia: „Maikäfer haben eine Zykluszeit von drei bis fünf, meist vier Jahren.“

Aua. Vier Jahre würden mir eine beliebig schlechte Zykluszeit erscheinen, denn da würde ich rein instinktiv Resonanzen mit allem und jedem erwarten. Beim Versuch, diesen Instinkt zu quantifizien, bin ich auf etwas gestoßen, das, würde ich noch Programmierkurse geben, meine Studis als Übungsaufgabe abbekommen hätten.

Die Fragestellung ist ganz grob: Wenn alle n Jahre besonders viele Fressfeinde auftreten und alle m Jahre besonders viele Beutetiere, wie oft werden sich die Massenauftreten überschneiden und so den (vermutlichen) Zweck der Zyklen, dem Ausweichen massenhafter Fressfeinde, zunichte machen? Ein gutes Maß dafür ist: Haben die beiden Zyklen gemeinsame Teiler? Wenn ja, gibt es in relativ kurzen Intervallen Jahre, in denen sich sowohl Fressfeinde als auch Beutetiere massenhaft vermehren. Haben, sagen wir, die Eichhörnchen alle 10 Jahre und die Zikaden alle 15 Jahre Massenvermehrungen, würden die Eichhärnchen alle drei Massenvermehrungen einen gut gedeckten Tisch und die Zikaden jedes zweite Mal mit großen Eichhörnchenmengen zu kämpfen haben.

Formaler ist das Problem also: berechne für jede Zahl von 2 bis N die Zahl der Zahlen aus dieser Menge, mit denen sie gemeinsame Teiler hat. Das Ergebnis:

Balkendiagramm: Gemeinsame Teiler für 2 bis 20

Mithin: wenn ihr Zikaden seid, verabredet euch besser nicht alle sechs, zwölf oder achtzehn Jahre. Die vier Jahre der Maikäfer hingegen sind nicht so viel schlechter als drei oder fünf Jahre wie mir mein Instinkt suggeriert hat.

Ob die Verteilung von Zyklen von Massenvermehrungen wohl irgendeine Ähnlichkeit mit dieser Grafik hat? Das hat bestimmt schon mal wer geprüft – wenn es so wäre, wäre zumindest die These vom reinen Zufall in Schwierigkeiten.

Den Kern des Programms, das das ausrechnet, finde ich ganz hübsch:

def get_divisors(n):
  return {d for d in range(2, n//2+1) if not n%d} | {n}


def get_n_resonances(max_period):
  candidates = list(range(2, max_period+1))
  divisors = dict((n, get_divisors(n)) for n in candidates)

  return candidates, [
      sum(1 for others in divisors.values()
        if divisors[period] & others)
    for period in candidates]

get_divisors ist dabei eine set comprehension, eine relativ neue Einrichtung von Python entlang der altbekannten list comprehension: „Berechne die Menge aller Zahlen zwischen 2 und N/2, die N ohne Rest teilen – und vereinige das dann mit der Menge, in der nur N ist, denn N teilt N trivial. Die eins als Teiler lasse ich hier raus, denn die steht ohnehin in jeder solchen Menge, weshalb sie die Balken in der Grafik oben nur um jeweils eins nach oben drücken würde – und sie würde, weit schlimmer, die elegante Bedingung divisors[period] & others weiter unten kaputt machen. Wie es ist, gefällt mir sehr gut, wie direkt sich die mathematische Formulierung hier in Code abbildet.

Die zweite Funktion, get_n_resonances (vielleicht nicht der beste Name; sich hier einen besseren auszudenken wäre auch eine wertvolle Übungsaufgabe) berechnet zunächt eine Abbildung (divisors) der Zahlen von 2 bis N (candidates) zu den Mengen der Teiler, und dann für jeden Kandidaten die Zahl dieser Mengen, die gemeinsame Elemente mit der eigenen Teilermenge haben. Das macht eine vielleicht etwas dicht geratene generator expression. Generator expression funktionieren auch wie list comprehensions, nur, dass nicht wirklich eine Liste erzeugt wird, sondern ein Iterator. Hier spuckt der Iterator Einsen aus, wenn die berechneten Teilermengen (divisors.values()) gemeinsame Elemente haben mit den Teilern der gerade betrachteten Menge (divisors[period]). Die Summe dieser Einsen ist gerade die gesuchte Zahl der Zahlen mit gemeinsamen Teilern.

Obfuscated? Ich finde nicht.

Das Ergebnis ist übrigens ökologisch bemerkenswert, weil kleine Primzahlen (3, 5 und 7) „schlechter“ sind als größere (11, 13 und 17). Das liegt daran, dass bei einem, sagen wir, dreijährigen Zyklus dann eben doch Resonanzen auftauchen, nämlich mit Fressfeindzyklen, die Vielfache von drei sind. Dass 11 hier so gut aussieht, folgt natürlich nur aus meiner Wahl von 20 Jahren als längsten vertretbaren Zyklus. Ganz künstlich ist diese Wahl allerdings nicht, denn ich würde erwarten, dass allzu lange Zyklen evolutionär auch wieder ungünstig sind, einerseits, weil dann Anpassungen auf sich ändernde Umweltbedingungen zu langsam stattfinden, andererseits, weil so lange Entwicklungszeiten rein biologisch schwierig zu realisieren sein könnten.

Für richtig langlebige Organismen – Bäume zum Beispiel – könnte diese Überlegung durchaus anders ausgehen. Und das mag eine Spur sein im Hinblick auf die längeren Zyklen im Maikäfer-Artikel der Wikipedia:

Diesem Zyklus ist ein über 30- bis 45-jähriger Rhythmus überlagert. Die Gründe hierfür sind nicht im Detail bekannt.

Nur: 30 und 45 sehen aus der Resonanz-Betrachtung jetzt so richtig schlecht aus…