Moodle: Generico-Filter

Die Generico-Erweiterung erlaubt das flexible Anpassen von Inhalten in Moodle durch abrufbare Vorlagen (Filter). Die Erweiterung kann hier heruntergeladen werden: https://moodle.org/plugins/filter_generico. Generico-Filter funktionieren in den meisten Textfeldern von Moodle, jedoch nicht in der Datenbank-Aktivität.

Anwendungen für die Generico-Erweiterung

Falls in einem Moodlekurs eine persönliche Ansprache gewünscht wird, tippt man in einem Textfeld folgenden Befehl ein:

{GENERICO:type="firstname"}

Im entsprechenden Text wird dann der Vorname des entsprechenden Benutzers angezeigt. Durch Anpassung des Filters (oder einer Variante) davon, kann auch der Nachname oder der volle Name angezeigt werden.

Auch der Einbau eines QR-Codes kann mittels Generico einfach umgesetzt werden, sofern die entsprechende Vorlage vorhanden ist. Dazu schreibt man beispielsweise:

{GENERICO:type="qrcode",data="https://www.gigers.com/blog",size="12"}

Woraus Generico dann folgendes Webelement erzeugt:

Die Grösse des QR-Codes kann über einen Parameter angepasst werden. Der Link unter dem QR-Code wird ebenfalls automatisch eingefügt.

Auch die einfache Gliederung von einzelnen Seiten in Moodle kann durch Generico-Filter erreicht werden. Reiter erstellt man beispielsweise wie folgt:

{GENERICO:type="tabs"}
{GENERICO:type="tabitem",title="Reiter 1"}
Beliebiger Inhalt für Reiter 1
{GENERICO:type="tabitem_end"}
{GENERICO:type="tabitem",title="Reiter 2"}
Beliebiger Inhalt für Reiter 2
{GENERICO:type="tabitem_end"}
{GENERICO:type="tabitem",title="Reiter 3"}
Beliebiger Inhalt für Reiter 3
{GENERICO:type="tabitem_end"}
{GENERICO:type="tabs_end"}
Unter den einzelnen Reitern können beliebige Inhalte angezeigt werden.

Auch das Einbinden externer Werkzeuge über ein IFrame ist möglich. Soll beispielsweise ein Kanban-Board eingebunden werden, so reicht folgender Text aus:

{GENERICO:type="kanban",height="700",boardid="Mein eigenes Kanban-Board"}
Das Kanban-Bord wird mittels eines entsprechenden Generico-Filters automatisch erzeugt und in die eigene Moodle-Instanz eingebunden.

Vorteile der Generico-Erweiterung

Filter für die Generico-Erweiterung können von Moodle-Administratoren entweder selbst geschrieben oder als Vorlage übernommen werden. Sie bieten gegenüber dem direkten Verwenden von HTML-Code in einer Moodleseite folgende Vorteile:

  1. Die Nutzer benötigten keine Webkenntnisse (HTML, CSS, JavaScript), sondern können die entsprechenden Befehle direkt im eigentlichen Text eintippen.
  2. Die Programmierung der einzelnen Elemente wird zentral verwaltet. Falls Anpassungen notwendig werden, können diese zentral an einer Stelle durchgeführt werden. Das Anpassen zahlreicher Einzelseiten entfällt.
  3. Die Sammlung der Filter kann beliebig angepasst und erweitert werden.

Übrigens: Wenn zusätzlich das Atto-Plugin installiert ist, können diese auch über ein Menü abgerufen werden, was den Einsatz noch einmal erleichtert.

Benutzer müssen sich die Schreibweise der einzelnen Filter nicht merken, wenn diese über das entsprechende Atto-Plugin zu Verfügung gestellt werden.

Beispiel für einen Generico-Filter

Anhand des QR-Codes soll gezeigt werden, wie ein entsprechender Filter geschrieben werden kann. Dazu wird das Administrationsmenü aufgerufen und dort unter Plugins > Filter die Vorlagen für Generico ausgewählt. Geht es darum, einen entsprechenden Filter zu bearbeiten, klickt man auf den Namen des Filters, ansonsten auf eine der noch freien Zahlen. Standardmässig stehen 20 verschiedene Filterplätze zu Verfügung. Diese kann man in den Einstellungen aber auch noch erhöhen.

Damit gelangt man in das eigentliche Menü zum Schreiben der Filter.

Die Generico-Filter lassen sich sehr flexibel programmieren, wobei nicht bei jedem Filter alle Möglichkeiten ausgeschöpft werden müssen.

Ganz oben links findet sich ein grüner Knopf „Bundle“, über den man bestehende Filter als Textdatei herunterladen und in andere Moodle-Instanzen übernehmen kann. Danach folgt ein Auswahlmenü für vordefinierte Filter.

Unter „Schlüssel“ legt man die interne Bezeichnung für den Filter fest, der bei der Verwendung des Filters mit type=“bezeichnung“ verwendet wird, unter „Name der Vorlage“ die Bezeichnung, welche später im Atto-Menü erscheint. Es folgen die Versionsnummer und eine Anweisung, wie der Filter zu verwenden ist.

In „Inhalt der Vorlage“ wird festgelegt, welchen Code der Filter später in die Webseite einbaut. Im Falle des QR-Codes ist dies ein DIV-Element mit einer ID, wobei @@AUTOID@@ dafür sorgt, dass automatische eine ID vergeben wird, die nicht zu Konflikten mit anderen IDs führt. Ausserdem wird in diesem Fall noch der Link ergänzt, der unter dem QR-Code steht.

Die eigentliche Programmierung findet durch das Festlegen von Variablen statt und die dafür eventuell notwendigen JavaScript-Befehle.

Sind die notwendigen Variablen definiert, können diese und die IDs falls notwendig über entsprechende JavaScript-Befehle angesprochen werden, wobei externe Bibliotheken eingebunden, lokale Befehle ausgeführt oder entsprechende Dateien hochgeladen werden können. In weiteren Feldern ist es dann auch möglich, entsprechenden CSS-Code zu hinterlegen.

Sind alle Bestandteile des Filters korrekt ausgefüllt, steht dieser unter der vergebenen Bezeichnung nun allen Nutzern zu Verfügung.  Werden Filter selbst entwickelt, lohnt es sich, die entsprechende Programmierung ausserhalb des Filters vorzunehmen und erst die funktionierende Version einzufügen und allenfalls mit lokalen Variablen von der Form @@variable@@ zu ergänzen.

Weitere Informationen zu Generico

Anleitungen und weitere Informationen zu Generico findet man hier:

Stösst man bei der Entwicklung eigener Filter auf Schwierigkeiten, lohnt es sich auf jeden Fall, sich im oben genannten Forum zu melden. Oft erhält man dort schnell und unkompliziert Hilfe.

 

CO2-Messung mit MicroBlocks

CO2-Messungen in Schulen haben im Verlauf der Covid-19-Pandemie an Bedeutung gewonnen, weshalb nebst kommerziellen Geräten unterdessen verschiedene Bauanleitungen zu Verfügung stehen. Der hier vorgestellte Lösungsansatz unterscheidet sich von anderen Geräten dadurch, dass er folgende Anforderungen erfüllt:

  • Das Gerät soll die tatsächliche CO2-Konzentration einigermassen genau messen und diese nicht aus anderen Werten (z.B. dem Vorhandensein von Wasserstoff) ableiten.
  • Die Messdaten sollen auf unterschiedliche Weise ausgewertet werden können: direkte Anzeige, grafischer Verlauf, weitere Auswertung am Computer.
  • Das Gerät soll in einer blockbasierten Sprache von Schülerinnen und Schülern der Sekundarstufe I selbst programmiert werden können.
  • Teile des Gerätes sollen im MINT-Unterricht auch für andere Zwecke verwendet werden können.

Um diese Anforderungen zu erfüllen, wird eine Kombination aus dem Mikrocomputer Adafruit CLUE, der mit MicroBlocks programmiert wird und dem CO2-Sensor SCD-30 verwendet. Dies ist dank der von Markus Gälli freigegebenen Bibliothek für den CO2-Sensor seit Dezember 2021 möglich: https://github.com/MarkusGaelli/MicroBlocks-SCD30, wobei die Bibliothek voraussichtlich in der nächsten Version von MicroBlocks offiziell aufgenommen wird.

Das CO2-Messgerät und seine Funktionen

In der hier beschriebenen Version können die Messdaten auf dem Bildschirm des Adafruit CLUEs als Zahlenwerte und grafisch ausgegeben werden.

Der CO2-Sensor SCD30 wird mit dem Adafruit CLUE über ein STEMMA-to-Groove-Kabel verbunden und ist damit über die I2C-Schnittstelle ansprechbar.

Die Daten können via die MicroBlocks-Umgebung direkt an den Computer übergeben werden, an den der Adafruit CLUE mittels USB-micro-Kabel angeschlossen wird und von dort aus als CSV-Datei für die weitere Datenauswertung abgespeichert werden. Ausserdem verfügt die vorgestellte Variante über eine einfache Menüführung, welche flexibel ausgebaut werden kann.

MicroBlocks

Microblocks (https://microblocks.fun) ist eine blockbasierte Programmierumgebung für Mikrocomputer wie den micro:bit, Calliope und andere ähnliche Geräte, bei der Programme sofort ausgeführt werden können und die recht performant ist. Unterdessen stellt die Webseite auch diverse Anleitungen für den Unterricht (teilweise in deutscher Sprache) zu Verfügung. Wie der Mikrocomputer von MicroBlocks aus angesprochen wird, ist beispielsweise hier beschrieben: QuickStart.

Die Programmierung

Das komplette Programm für das vorgestellte CO2-Messgerät findet sich hier: https://github.com/mattgig/CO2-Messung.

Das Hauptprogramm nebst bereits vorhandenen einige zusätzliche Bibliotheken:

  • SCD30.ubl von Markus Gälli
    Stellt die Blöcke zum Ansprechen und Auslesen des SCD30 zu Verfügung.
  • digits.ubl
    Erlaubt die Anzeige der Ziffern 0-9 in beliebiger Grösse als Digitalzahlen.
  • drawGraph.ubl
    Stellt eine in der Höhe anpassbare Grafik für den Adafruit CLUE zu Verfügung.
  • menuOptions.ubl
    Erlaubt die Programmierung eines einfachen Menüsystems für den Adafruit CLUE.

Die eigentliche Messung wird in einem Block mit verschiedenen Unterbefehlen durchgeführt.

Das Hauptprogramm zeigt die gemessenen Werte als Zahl und Grafik an und kann die Messwerte auch zur weiteren Bearbeitung an einen Computer übergeben.

Zuerst werden diverse Parameter gesetzt und dann die Messwerte innerhalb einer repeat-until-Schleife ausgelesen, wobei jeweils die letzten 240 Werte in einer Liste gespeichert werden. Dabei stehen folgende Darstellungsmöglichkeiten der Messwerte zu Verfügung:

  • Anzeige als Text auf dem Bildschirm des Adafruit CLUE mittels displayIniformation;
  • direkte Ausgabe auf dem Bildschirm des Computers, falls der CLUE damit verbunden ist über say;
  • Weitergabe der Messwerte an das Graphmodul von Microblocks;
  • Ausgabe des aktuellen Messwertes als Farbinformation via NeoPixel-LED;
  • grafische Ausgabe der letzten 240 Messwerte auf dem Bildschirm des Adafruit CLUE.

Das Zeitintervall für die Messungen kann schrittweise von 5 – 120 Sekunden festgelegt werden, wodurch die grafische Ausgabe einen Zeitraum von 20 Minuten bis 8 Stunden abdeckt.

In der vorliegenden Version kann der Adafruit CLUE mit den Tasten A und B über ein einfaches Menü gesteuert werden.

Dabei kann jeweils über die Taste A der nächste Wert angesteuert und dieser über die Taste B ausgewählt werden. Das Drücken beider Tasten gleichzeitig führt zurück ins Hauptmenü.

Die Möglichkeiten, Messdaten über Funk an einen anderen Mikrocomputer zu senden, ist aktuell noch nicht implementiert, kann aber mit wenigen Befehlen (unter allfälliger Anpassung des Menüs) durchgeführt werden.

Verwendung im Unterricht

Erst einmal kann das Gerät für die CO2-Messung im Schulzimmer verwendet werden, um die Luftqualität zu überprüfen. Ob dabei die genaue Anzeige der aktuellen Messwerte, die Grafik (Zeitreihe von Messwerten) oder die NeoPixel-LED als Anhaltspunkt dient, hängt vom genauen Einsatzzweck ab.

Auswertung der Daten in Snap!, wobei die gleichen Algorithmen wie bei der grafischen Anzeige auf dem Adafruit CLUE verwendet werden.

Dann können die Schülerinnen und Schüler das Gerät aber auch verwenden, um mittels gezielter CO2-Messungen eigenen Fragestellungen nachzugehen. Die relativ einfach anpassbare Programmierung erleichtert dabei auch die Untersuchung etwas speziellerer Fragestellungen. Allerdings eignet sich der SCD30-Sensor nicht für schnelle Messungen, da die Messintervalle ca. 2 Sekunden betragen. Da die Messwerte als CSV-Datei gespeichert werden können, steht einer weiteren Auswertung nichts mehr im Wege.

Letztlich kann das Gerät auch als Beispiel für die Programmierung von Mikrocomputern im Informatikunterricht eingesetzt werden, wobei auf Fragestellungen wie Timing, Anzeige von Messwerten, Datenübermittlung usw. fokussiert werden kann.

Liniengrafiken aus Fotos als Vektorfelder

Verschiebt man Punkte entlang eines Vektorfeldes entstehen häufig interessante Muster, wie sie beispielsweise von Magnetlinien bekannt sind. Die Programmierung interessanter Vektorfelder ist aber nicht ganz einfach. Da liegt es nahe, Bilder als Quelle für solche Vektorfelder zu verwenden. Fotos eignen sich dafür besonders gut, weil die Farbinformation der einzelnen Fotopixel auf mehrere verschiedene Arten ausgewertet werden können.

Die aus den Vektorfeldern resultierenden Linienmuster werden dabei mit Snap! erzeugt.

Grundlagen

In Snap! können Fotos importiert werden, indem sie einfach auf die Programmieroberfläche gezogen werden. Anschliessend kann dieses Foto einem Sprite mit den folgenden Befehlen zugeordnet werden.

Ein bereits in Snap! importiertes Foto kann über den entsprechenden Block als Kostüm verwendet werden.

Der stretch-Block sorgt dafür, dass das Foto die ganze Bühnenoberfläche (stage) komplett ausfüllt.

Nun kann die Eigenschaft einzelner Pixel im geladenen Foto mit folgendem Programm überprüft werden.

Das Programm fragt den Farbwert eines einzelnen Pixels im gegebenen Foto ab.

Sobald im Programm die Taste t (für Testen) gedrückt wird, bewegt sich das Objekt (sprite) zur aktuellen Mausposition, liest dort den Farbwert (hue) des an der Mausposition befindlichen Pixels aus und zeigt diesen an. Die weiteren Blöcke im Programm werden für das Zusammenspiel mit den anderen Programmteilen benötigt.

Das Objekt zeigt in die Richtung des gemessenen Farbwerts und gibt diesen aus.

Weil die hue-Farbwerte von 0 bis 100 reichen, wird der Messwert noch mit 3.6 multipliziert, damit als Richtung die vollen 360° erreicht werden können.

Wenn sich das Objekt nun in Richtung des gemessenen Werts bewegt, anschliessend eine neue Richtungsbestimmung vornimmt und diesen Vorgang beliebig viele Male wiederholt, entsteht eine Spur auf dem Bild.

Auf dem Hintergrund sind bereits mehrere zurückgelegte Spuren zu sehen.

Damit diese Möglichkeit interaktiv ausprobiert werden kann, ist folgende Programmierung notwendig.

Das Objekt (sprite) kann mit der Maus positioniert werden. Sobald die Maustaste nicht mehr gedrückt wird, zeichnet das Programm eine Spur auf das Foto.

Die bisher von Hand gewählte Positionierung wird nun per Programm vielfach durchgeführt.

Einfache Linienmuster

Das folgende Programm sorgt zuerst dafür, dass einige Umgebungsvariablen richtig gesetzt sind und führt dann die oben beschriebenen Schritte innerhalb des warp-Blockes (dient der beschleunigten Bildschirmausgabe) mehrfach aus.

Ausgehend von Zufallspunkten werden Linien gezeichnet, welche dem Vektorfeld folgen.

Je nach verwendeter Fotovorlage, dem gewählten Kriterium (hier: Helligkeit) und der verwendeten Schrittlänge entstehen unterschiedliche Linienmuster.

Diesem Bild liegt das im Programm verwendete Eisbild zugrunde (heller Hintergrund).
Für dieses Bild diente das Foto mit dem Hund und der Ziege als Grundlage (dunkler Hintergrund).

Obwohl bei beiden Bildern (abgesehen vom Hintergrund) die genau gleichen Parameter gewählt wurden, sind völlig unterschiedliche Linienmuster entstanden.

Gleichzeitige Verwendung mehrere Linienmuster

Statt jeweils nur einen Parameter für die einzelnen Pfade (Linien) zu verwenden, kann dabei auf unterschiedliche Informationen zugegriffen werden. Dazu bietet es sich an, einen Block zu programmieren, welcher das Abfragen der unterschiedlichen Merkmale eines Bildpixels vereinfacht.

Der Block erlaubt die Wahl der gewünschten Farbinformation über ein Menü.

Als Auswahlmöglichkeiten stehen folgende Optionen zu Verfügung:

  • hue: Farbwert von 0 bis 100 entlang des Spektrums eines Regenbogens;
  • saturation: Farbigkeit von 0 bis 100, bestimmt, ob eine Farbe gräulich oder lebendig erscheint;
  • brightness: Helligkeit der gewählten Farbe;
  • red: Rotwert des Pixels;
  • green: Grünwert des Pixels;
  • blue: Blauwert des Pixels.

Die Werte für hue, saturation und brightness werden am besten mit 3.6, die für red, green und blue mit 1.41 multipliziert.

Diesen Block kann nun im oben abgebildeten Programm zum Zeichnen von Linien verwendet werden, oder er wird in eine erweiterte Version eingesetzt, welche gleichzeitig mehrere Kriterien für den Verlauf der einzelnen Pfade definiert.

Das Programm wählt ein Richtungskriterium und die gewünschte Einfärbung per Zufalls aus einer Liste von Möglichkeiten aus.

Der dem zurückgelegten Pfad (Linie) zugrunde liegende Farbwert, das Kriterium für die Richtungswahl bei den einzelnen Schritten, sowie die Schrittweite werden jeweils per Zufall ausgewählt. Dadurch entsteht bei geschickt gewählten Parametern anstelle eines blossen Linienmusters eine Art von Netz, wie sie beispielsweise häufig bei Stoffen zu finden ist.

Einige Beispiele sollen dieses Prinzip verdeutlichen (bei allen wurden die im abgebildeten Programm gezeigten Parameter verwendet).

Für dieses Muster wurde das Foto des Eichhörnchens verwendet (dunkler Hintergrund).
Für dieses Muster diente das Apfelbild als Grundlage (heller Hintergrund).
Hier wurde das Eisbild als Grundlage verwendet (dunkler Hintergrund).

Welche Muster ein entsprechendes Foto erzeugt, lässt sich im Voraus nur schwer erahnen. Klar abgegrenzte Objekte in einem Foto erzeugen aber klarere Richtungswechsel und prominente Muster in den erzeugten Grafiken.

Auf das beschriebene Programm kann hier zugegriffen werden: Photo to vector field.
Alle im Programm verwendeten Fotografien stammen von Ernst Giger.

Verwendung im Unterricht

Nebst dem reinen Experimentieren und der Neugier, welches Foto mit welchen Parametern zu welchen Mustern führt, kann das Programm auch dazu verwendet werden, Eigenschaften von Vektorfeldern systematisch zu untersuchen.

  • Statt einzelne Punkte zufällig zu wählen, können die Startpositionen auf bestimmten geometrischen Orten wie Linien oder Kreisen liegen.
  • Das gleiche Bild kann mehrfach mit den gleichen Startwerten als Grundlage für die Berechnung verwendet werden.
  • Bei unterschiedlichen Fotos kann untersucht werden, wie sich die Schrittlänge auf die Stabilität der Muster auswirkt.

Solche Untersuchungen können schnell zu Diskussionen darüber führen, wie einheitlich die Musterbildung in einzelnen Vektorfeldern ist und damit die Stabilität unterschiedlicher Systeme (hier Fotos) zu diskutieren.

Schliesslich kann auch der umgekehrte Weg gegangen werden. Gelingt es den Schülerinnen und Schülern ein Bild (oder Foto) anzufertigen, dass zu einem gewünschten Verhalten in Bezug auf den Linienverlauf einzelner Grafiken führt?

Primzahlen berechnen

Primzahlen bilden eine Grundlage der Mathematik und sind deshalb auch auf der Sekundarstufe I ein Thema. Allerdings beschränkt sich die Auseinandersetzung auf dieser Stufe häufig darauf, die Primzahlen mithilfe des Siebes von Eratosthenes zu gewinnen und diese anschliessend für die Primfaktorzerlegung von natürlichen Zahlen zu verwenden. Dabei bietet sich das Thema auf gut dafür an, die Berechnung von Primzahlen mit dem Computer und zu thematisieren und dabei über die Optimierung von Algorithmen zu diskutieren.

Naiver Ansatz

In einem ersten Versuch verwenden wir einen ganz einfachen Algorithmus. Wir nehmen zuerst einmal an, jede Zahl sei eine Primzahl. Dann teilen wir diese Zahl durch alle Zahlen, die kleiner als die gewünschte Zahl selbst sind. Sollten bei diesen Divisionen der Rest irgendwann 0 sein, verwerfen wir die Annahme, dass es sich um eine Primzahl handelt.

naive Bestimmung einer Primzahl
Ob es sich bei einer Zahl um eine Primzahl handelt, kann einfach geprüft werden.

Dieser einfache Algorithmus funktioniert für Zahlen > 1 gut, ist aber sehr langsam, da viele unnötigen Berechnungen durchgeführt werden. Dies sieht man, wenn man alle Zahlen aufführt, welche bei den Divisionen verwendet werden.

In der einfachen Version des Algorithmus zur Primzahlenbestimmung steigt der Rechenaufwand linear an.

Es fällt sofort auf, dass viele unnötige Rechenschritte durchgeführt werden, weil beispielsweise alle geraden Zahlen (ausser der 2) sicherlich keine Primzahlen sind. Trotzdem wird beispielsweise bei der 50 noch lange weitergerechnet, selbst wenn schon früh klar ist, dass es sich nicht um eine Primzahl handeln kann.

Möglichst frühzeitiger Abbruch

Die Vermeidung unnötiger Rechenschritte bedingt die Neuformulierung des Algorithmus. Dafür muss die for-Schleife in Snap! durch eine while-Schleife ersetzt werden. Allerdings steht diese nicht standardmässig zu Verfügung, weshalb diese zuerst programmiert werden muss. In Snap! funktioniert dies wie folgt:

Der neue while-Block wird rekursiv programmiert.

Mit der durch die while-Schleife mögliche Anpassung des Algorithmus werden unnötige Rechenschritte verhindert.

Dies wird deutlich, wenn man sich noch einmal alle Zahlen anschaut, die nun in den notwendigen Divisionen verwendet werden.

Im Gegensatz zum ersten Versuch werden nur noch bei Primzahlen selbst viele Berechnungen durchgeführt.

Bei allen Zahlen, welche keine Primzahlen sind, wird die Berechnung schon sehr früh abgebrochen. Dies ist auch deshalb von Interesse, weil Primzahlen seltener werden, wenn man grössere Zahlen untersucht. Das wird bereits in der oben abgebildeten Grafik deutlich:

  • Zahlenraum 1-25: 2, 3, 5, 7, 11, 13, 17, 19, 23, insgesamt 9 Primzahlen.
  • Zahlenraum 26-50: 29, 31, 37, 41, 43, 47 , insgesamt 6 Primzahlen.

Um das Programm weiter zu optimieren, ist eine mathematische Betrachtung von Teilern notwendig.

Eigenschaften von Teilern

Die Teiler einer bestimmten Zahl treten immer paarweise auf, wobei es vorkommen kann, dass die beiden Teiler gleich gross sind:

  • Teiler von 12: 1 und 12, 2 und 6, 3 und 4.
  • Teiler von 25: 1 und 25, 5 und 5.

Zu jedem grossen Teiler gehört also ein entsprechend kleiner Teiler. Bei der Quadratzahl 25 ist gut ersichtlich, dass zum Teiler 5 kein Teiler vorhanden ist, der grösser als 5 ist, sonst müsste es sich, z.B. bei 5 x 6 um eine grössere Zahl handeln.

Damit ist es möglich, die zu überprüfenden Teiler weiter einzuschränken. Statt bei Primzahlen bis zu n-1 zu prüfen, reicht eine Prüfung bis zur Quadratwurzel von n aus.

Die Änderung im Algorithmus beschränkt sich dabei auf das Abbruchkriterium in der while-Schleife.

Dadurch verringert sich der Rechenaufwand bei den bisher aufwändigen Primzahlen noch einmal dramatisch, was die Auflistung der benötigten Teiler zeigt:

Gegenüber der ursprünglichen Variante hat sich die Anzahl der Rechenschritte drastisch reduziert.

Eine weitere Optimierung ist möglich, indem man nicht mehr alle Zahlen als Teiler verwendet, sondern nur noch die Primzahlen selbst. Dabei stellt sich aber die Frage, woher dann diese Primzahlen im Voraus bekannt sein sollen.

Nimm 2

Mit einem entsprechenden höheren Aufwand beim Schreiben des Algorithmus ist es tatsächlich möglich, die Primzahlen aus sich selbst heraus zu erzeugen. Als Voraussetzung wird dazu nur eine Liste mit dem Element 2 benötigt. Alle weitere Primzahlen kann das folgende Programm daraus generieren.

Während die Zeit für die Berechnung insbesondere für grössere Primzahlen weiterhin sinkt, ist der dafür notwendige Algorithmus wesentlich komplexer geworden.

Nach dem ersten Durchlauf des Programms besteht die Liste aus den Zahlen 2 und 3, denn es wird bis maximal zur Zahl 3 geprüft und diese ist nicht durch 2 teilbar. Nach dem zweiten Durchlauf sind die Primzahlen 5 und 7 dazugekommen, denn das Programm prüft nun bis 8. Der nächste Durchlauf prüft bis 48 und liefert als letzte Primzahl 47 zurück. Bei jedem weiteren Durchlauf wird der untersuchte Zahlenraum grösser und damit die Liste der Primzahlen länger. So können aus der 2 alle weiteren Primzahlen generiert werden.

Nebst der schnelleren Berechnung hat dieser Ansatz auch den Vorteil, dass die Berechnung der Primzahlen jederzeit angehalten und später wieder fortgesetzt werden kann. Denn alles, was das Programm dafür benötigt, ist die Liste mit den Primzahlen, aus welcher es die grösste Primzahl ausliest, um weitere Berechnungen anzustellen.

Im gezeigten Beispiel darf der Computer dazu nicht ausgeschaltet werden, da sich die Liste im flüchtigen Speicher befindet. Die geführte Liste könnte aber auch auf eine Harddisk geschrieben werden, wodurch das Programm seine Arbeit auch nach einem tatsächlichen Unterbruch wieder aufnehmen könnte.

Laufzeiten

Die Laufzeiten der unterschiedlichen Varianten unterscheiden sich dramatisch. Gemessen wurde jeweils die Zeit, welche zur Berechnung der ersten n Primzahlen notwendig war.

Die Laufzeiten zur Berechnung von Primzahlen steigen in Abhängigkeit vom verwendeten Algorithmus unterschiedlich stark an.

Während bei der einfachsten Version die Laufzeiten immer stärker zunehmen, verhalten sich diese in der optimierten Fassung zumindest im untersuchten Zahlenbereich fast linear. Diese Unterschiede sind bei kleinen Zahlenbereich noch klein, werden aber schnell immer grösser.

Anwendung im Unterricht

Die vorgestellten Ansätze können nicht nur dafür verwendet werden, bei grösseren Zahlen herauszufinden, ob es sich dabei um Primzahlen handelt. Sie bieten auch eine gute Gelegenheit dafür, mit den Schülerinnen und Schülern die Notwendigkeit der Optimierung von Programmen zu besprechen.

Diese spielt bei vielen Computeranwendungen eine wichtige Rolle, nicht nur weil dadurch Energie und die damit verbundenen Kosten eingespart werden können, sondern dadurch werden auch Anwendungen möglich, die vorher aus Zeitgründen nicht praktikabel umgesetzt werden konnten.

Sashiko-Verziertechnik

Die Sashiko-Verziertechnik wurde in Japan verwendet, um schadhafte Textilien auszubessern. Interessant an Nähtechnik ist, dass sie in der Form von Binärzahlen dargestellt werden kann. Aufgegriffen hat das Thema Jens Mönig im Juni 2021.

Die Grundlagen

Traditionell werden Stiche gleicher Länge verwendet (Sashiko heisst auf Japanisch Stäbchen), wobei der Faden einmal auf der Ober- und einmal auf der Unterseite zu sehen ist. Dabei kann man jeweils mit einem Unter- oder Oberstich beginnen. Es gibt also zwei Möglichkeiten (Binärsystem). Führt man nun mehrere solcher Stichfolgen horizontal und vertikal aus, können ganz unterschiedliche Muster entstehen.

Beispiele für Sashiko-Muster: Bei der 1 (rot) beginnt man mit einem Oberstich, bei der 0 (blau) mit einem Unterstich.

Experimente mit verschiedenen Bit-Folgen können mit dem Snap!-Beispiel von Jens Mönig durchgeführt werden: Hitomezashi Sashiko.

Zufällige Muster

Im Dezember 2021 griff Ayliean MacDonald von Numberphile das Thema (siehe YouTube) und überlegte sich, ob solche Muster nicht auch zufällig erzeugt werden könnten. Dabei interessiert sie sich vor allem dafür, wie viel Ordnung, respektive Chaos bei unterschiedlich zufälligen Bitmustern entstehen.

Beispiel für ein Sashiko-Muster, bei dem mit 50%-Wahrscheinlichkeit mit einem Oberstich begonnen wird.

In Abweichung von der Anzahl der Stiche können so sehr viele unterschiedliche Muster entstehen, ohne dass diese von Hand „programmiert“ werden müssen.

Vom Quadrat zum Dreieck

Nebst der Einführung des Zufalls erweitert MacDonald die Sashiko-Muster auch, indem sie statt einem Quadrat ein gleichseitiges Dreieck als Ausgangsform verwendet. Dadurch entstehen Muster aus der Kombination von drei Stichrichtungen.

Bei der Verwendung eines Dreiecks als Grundfigur ergeben sich ebenfalls interessante Zufallsmuster.

Die Programmierung

Die Programmierung eines Stiches bestehend aus Ober- und Unterstich oder umgekehrt bildet die Grundlage der sowohl der Quadrat- als auch der Dreiecksmuster.

Ob mit einem Ober- oder Unterstich begonnen wird, ist vom Wahrheitswert starton abhängig.

Darauf aufbauen wird dann die weitere Programmierung vorgenommen. Beim Quadrat ist diese recht einfach, denn es müssen nur horizontale und vertikale Stichfolgen programmiert werden.

Der Block zeichnet eine Reihe von Stichmustern entweder in horizontale oder vertikale Richtung.

Über den if-Block wird jeweils festgelegt, ob mit einem Ober- oder Unterstich begonnen wird.

Schliesslich wird das ganze Programm für das Quadrat zusammengesetzt, indem der beschriebene Block zweimal aufgerufen und anschliessen noch ein Rahmen um das Bild (Vieleck) gezeichnet wird.

Bei der Programmierung des quadratischen Musters muss der Hauptblock zweimal mit Parametern für unterschiedliche Richtungen aufgerufen werden.

Die Programmierung des zufälligen Dreiecksmusters gestaltet sich ein weniger komplizierter, da dabei nicht nur drei Richtungen berücksichtigt werden müssen, sondern die Länge der einzelnen Stichfolgen laufend abnimmt.

Im Gegensatz zum Quadratmuster weisen die Stichfolgen beim Dreiecksmuster unterschiedliche Längen auf.

Ist der Block einmal programmiert, kann er aus dem Hauptprogramm von den unteren beiden Dreiecksecken aufgerufen werden, wobei die entsprechende Ausrichtung festgelegt werden muss.

Der Block zum Zeichnen der Stichfolgen muss beim Dreieck dreimal mit unterschiedlichen Winkeln aufgerufen werden.

Das komplette Programm kann hier aufgerufen werden: Zufallsbasierte Sashiko-Muster.

Verwendung im Unterricht

Im Unterricht können in Abhängigkeit von der zu Verfügung stehenden Zeit unterschiedliche Aspekte in den Vordergrund rücken.

  • Kulturell-ästhetischer Aspekt
    Ausgehend von kleinen Zeichnungen, die manuell ausgeführt werden, steht hier die Ästhetik und die Anwendung der Muster in der japanischen Kultur im Vordergrund. Das hier beschriebene Programm und das Original von Jens Mönig werden dann zur Generierung weiterer Muster verwendet, ohne dass dabei auf die Details der Programmierung eingegangen werden muss.
  • Mathematisch-technischer Aspekt
    Ausgehend von der Stichfolge und deren binären Repräsentation wird die Programmierung schrittweise aufgebaut. Ob dabei die determinierte Variante von Jens Mönig oder die hier vorgestellte zufallsgesteuerte Version in den Fokus gerückt wird, ist eher nebensächlich. Bei entsprechender Ausstattung kann auch eine Umsetzung in TurtleStich in Betracht gezogen werden.
  • Informatischer Aspekt
    Ausgehend von der Programmierung der Zufallsvariante können verschiedene Aspekte der Programmierung wie Unterfunktionen und Refaktorisierung die zentrale Rolle einnehmen, denn an die Programmierung des Zufallsprogrammes müssen sich die Schülerinnen und Schüler auf jeden Fall herantasten können. Inwieweit dies möglich ist, hängt von der Vorerfahrung und der zu Verfügung stehenden Zeit ab.

Das Beispiel der Sashiko-Muster zeigt sehr schön, wie wesentliche Aspekte der Informatik mit anderen Fächern unter ästhetischen Gesichtspunkten verknüpft werden können. Dabei greift das Beispiel in idealer Weise Hans Aeblis didaktische Forderung nach dem Wahren, Schönen und Guten im Unterricht auf.