In anderen Sprachen: English Русский 中文

Tutorial:Kombinator Tutorial

From Official Factorio Wiki
Jump to: navigation, search

Dies ist ein Tutorial für Fortgeschrittene. Anfänger sollten das Tutorial:Schaltungsnetz-Kochbuch für Beispiele und die Schaltungsnetz Seite für einen Überblick über das Schaltungsnetz lesen. Dieses Tutorial setzt ein grundlegendes Verständnis von Schaltungen voraus und behandelt fortgeschrittenere Themen wie SR-Flipflops, Speicherzellen und Taktgeber.

Einführung

Logikschaltungen mit Kombinatoren werden aufgebaut, indem man Ausgänge so mit Eingängen verknüpft, dass die erwünschte Operation durchgeführt wird. Komplexere Logik erfordert eine Vielzahl von Kombinatoren, aber einige sehr nützliche Grundfunktionen können bereits mit nur einer Handvoll Kombinatoren erreicht werden. Kombinator-Logik funktioniert, weil Factorio alle Aktualisierungen genau 60 mal pro Sekunde durchführt, so dass Kombinatoren in einem Takt-Schritt ihre Logik ausführen und im nächsten Takt die resultierenden Ausgabewerte summiert werden oder Entscheidungen wirksam werden.

Wenn Logikwerte von Kombinatoren berechnet werden, werden die Ausgaben erst im nächsten Schritt vom Schaltungsnetz erkannt. Wenn also ein Kombinator für Vergleiche verwendet wird, um eine bestimmte Eingangsbedingung zu erkennen, wird sein Ausgangswert erst im nächsten Schritt im Schaltungsnetz wirksam. Es ist wichtig, dieses Verhalten im Hinterkopf zu behalten. Es kann zu Sequenz-Fehlern und erheblichen Verzögerungen führen, wenn mehrere Kombinatoren in Reihe geschaltet sind.

Das Schaltungsnetz verhält sich wie ein Drahtbus in der Elektronik. Es überträgt die Informationen aus allen angeschlossenen Drähten, d. h., wenn gleiche Signale auf einem Draht sind, werden diese automatisch addiert. Wenn das Signal unterschiedlich ist, wird es auch über diesem Draht übertragen, aber als unterschiedliches Signal.

Beim Querverbinden von Kombinatoren ist es eine gute Praxis, die unbenutzte Farbe zum Querverbinden zu verwenden. Dadurch werden die Eingangs- und Ausgangsnetzwerke aufgeteilt und es wird verhindert, dass unerwünschte Eingänge versehentlich mit einem größeren Schaltungsnetz verbunden werden. Kombinatoren summieren die roten und grünen Eingänge vor der Berechnung, so dass bei der Rückverdrahtung des Ausgangs mit dem Eingang beide Farben verwendet werden können. In den meisten Fällen ist es jedoch sinnvoller, die entgegengesetzte Farbe des Drahtes zu verwenden, damit der resultierende Ausgang und Eingang nicht gestört wird.

Virtuelle Signale

Die verfügbaren virtuellen Signale für das Schaltungsnetz

Zusätzlich zu den Standard-Signalen für die Gegenstände enthält das Schaltungsnetz von Factorio auch eine Reihe von Signalen, die keinen bestimmten Spielgegenstand repräsentieren. Stattdessen dienen diese virtuellen Signale als benutzerdefinierte Kanäle für das Schaltungsnetz. Sie haben die Bedeutung, die der Benutzer ihnen zuweisen möchte. Derzeit gibt es 48 virtuelle Signale, die über das Schaltungsnetz gesendet werden können:

  • Die 36 alphanumerischen Zeichen (A-Z, 0-9)
  • Neun Farben: Rot, Grün, Blau, Gelb, Magenta, Cyan, Weiß, Grau und Schwarz
  • Drei Symbole: ein Häkchen, ein Informationsbuchstabe 'i' und ein kleiner, weißer Punkt

Logische Signale

Es gibt drei zusätzliche virtuelle Signale, die als Logiksignale bezeichnet werden. Im Gegensatz zu anderen Signalen können sie nicht über das Schaltungsnetz gesendet werden; stattdessen wenden sie zusätzliche Logik auf Kombinatoren an, die deren Verhalten verändern. Insbesondere fungieren diese Logiksymbole als Platzhalter, also als spezielle Signale, die null oder mehr beliebige Signale repräsentieren, anstatt ein einzelnes diskretes Signal darzustellen. Das Schaltungsnetz von Factorio implementiert drei Arten von Platzhaltern.

Alles Platzhalter
Signal everything.png

Der Platzhalter Alles wird bei Kombinatoren für Entscheidungen verwendet. Sein genaues Verhalten hängt davon ab, ob er als Eingang oder als Ausgang verwendet wird:

  • Eingabe: Gibt wahr zurück, wenn alle Eingangssignale die Bedingung erfüllen, oder wenn es keine Eingangssignale gibt. Andernfalls gibt er falsch zurück.
  • Ausgang: Gibt alle Eingangssignale ungleich Null zurück.

Wenn er als Eingabe verwendet wird, kann man sich den Platzhalter Alles als logisches UND oder als Allaussage vorstellen. Wenn er als Ausgang verwendet wird, wirkt er wie ein "Echo" oder "Dump" der Eingangssignale.

Hinweis: Kann als Ausgang verwendet werden, solange die Eingabe nicht ein Jeweils Platzhalter ist.

Irgendetwas Platzhalter
Signal anything.png

Der Platzhalter Irgendetwas wird auch bei Kombinatoren für Entscheidungen verwendet, allerdings nur als Eingang.

Bei mindestens einem Eingangssignal gibt er wahr zurück, wenn irgendein Eingangssignal die Bedingung erfüllt. Wenn kein Signal die Bedingung erfüllt, oder keine Eingangssignale vorhanden sind, wird falsch zurückgegeben. Von diesem Verhalten her kann man sich den Irgendetwas-Platzhalter als logisches ODER oder als Existenzaussage vorstellen.

Jeweils Platzhalter
Signal each.png

Der Platzhalter Jeweils wird sowohl mit Kombinatoren für Entscheidungen als auch mit Kombinatoren für Berechnungen verwendet und verhält sich im Vergleich zu den beiden vorherigen etwas anders. Im Allgemeinen führt er eine Kombinator-Aktion auf jedes Signal einzeln aus, wobei die genaue Aktion davon abhängt, wie er verwendet wird und in welcher Art er von Kombinator verwendet wird. Er kann als Eingang verwendet werden und ebenfalls als Ausgang, aber nur, wenn er auch als Eingang verwendet wird.

In einem Kombinator für Entscheidungen vergleicht der Platzhalter Jeweils jedes Eingangssignal einzeln mit der Kombinatorbedingung und gibt jedes Signal zurück, das die Bedingung erfüllt. Die Art und Weise, wie der Platzhalter Jeweils Signale zurückgibt, wenn er als Eingang verwendet wird, hängt davon ab, ob er auch als Ausgang verwendet wird oder nicht:

  • Nur Eingabe: Summiert jedes Eingangssignal, das die Bedingung erfüllt, und gibt je nach Ausgabeeinstellungen entweder eine Anzahl der erfüllten Bedingungen oder eine Summierung der Eingangswerte als Ausgangssignal zurück.
  • Eingang und Ausgang: Gibt jedes Signal zurück, das die Bedingung erfüllt hat, wobei die Werte von den Ausgangseinstellungen abhängen.

In einem Kombinator für Berechnungen wird die vorgesehene arithmetische Operation individuell auf jedes Eingangssignal angewendet, und ähnlich wie beim Kombinator für Entscheidungen hängt das zurückgegebene Signal davon ab, ob der Platzhalter Jeweils als Ausgang verwendet wird oder nicht:

  • Nur Eingang: Das Ergebnis jeder Operation auf den Eingangssignalen wird summiert und als Ausgangssignal zurückgegeben.
  • Eingang und Ausgang: Jedes Eingangssignal wird mit dem Ergebnis der angegebenen Operation darauf angewendet zurückgegeben.

Der Jeweils-Platzhalter ist also deutlich komplexer als die beiden anderen Platzhalter, bietet aber im Gegenzug für seine Komplexität eine gute Leistung.

Eingangs-Isolator & Gatter

Ein Kombinator für Berechnungen, der auf (Eingabe: Jeweils + 0, Ausgabe: Jeweils) gesetzt ist, kann zum Vertauschen von Drahtfarben und als Isolator verwendet werden, um zu verhindern, dass nachgeschaltete Logik in die Eingänge des Schaltungsnetzes zurückfließt.

Ein Kombinator für Entscheidungen, der auf (Ausgabe: Alles, Eingang → Ausgang) eingestellt ist, fungiert ebenfalls als Isolator, solange die eingestellte Logikbedingung wahr ist. Dieser kann auch selektiv Eingänge nur dann durchlassen oder "steuern", wenn dies gewünscht ist. Dies könnte verwendet werden, um entfernte Bahnhöfe sequentiell nach ihrem Kisteninhalt abzufragen und nur gewünschte Bahnhöfe einzuschließen.

Set/Reset Flipflop-Schalter

Manchmal benötigt man etwas, das einen Trigger auf eine bestimmte Menge setzt (SET), und dann so lange eingeschaltet BLEIBT, bis diese Menge einen anderen Wert erreicht (den RESET-Wert). Dafür benötigt man einen Kombinator für Entscheidungen und einen Kombinator für Berechnungen (Für komplexere mehrkanalige Bedingungen können auch zwei Kombinatoren für Entscheidungen und ein Kombinator für Konstanten verwendet werden).

Man stellt den ersten Kombinator für Entscheidungen auf die gewünschte SET-Bedingung ein, so dass er dann eine 1 ausgibt. Dessen Ausgang wird mit dem Eingang eines Kombinators für Berechnungen verbunden, der die Eingabe mit dem Bias-Wert multipliziert, der die Differenz zwischen dem Set- und dem Reset-Wert darstellt. Sein Ausgang wird wiederum mit dem Eingang des Kombinators für Entscheidungen verbunden, so dass der Eingang des Entscheiders dem Ausgang des Berechners entspricht.
Immer, wenn die eingestellte Bedingung erreicht wird, gibt der Kombinator für Entscheidungen eine '1' aus, und der Bias-Wert im Kombinator für Berechnungen wird angewendet. Dadurch wird der Ausgang so lange 'wahr' gehalten, bis der Wert wieder unter den Rücksetzpunkt fällt.

In diesem speziellen Beispiel läuft die Pumpe, wenn das Leichtöl 20000 erreicht, und schaltet sich aus, wenn es 5000 erreicht:

SR latch.png

Ein ähnliches Beispiel für eine Dampf-Reserve mit genauer Beschreibung und Erklärung gibt es hier:
RS-Flipflop - Version mit einem Kombinator

Intelligente Zugbeladung

Dies löst das Problem, dass die Beladung von Kisten mit einem bestimmten Gegenstand in aller Regel ungleicher und langsamer erfolgt als die Beladung von Zügen.

Zum Aufbau wird ein Kombinator für Berechnungen sowie rotes und grünes Signalkabel benötigt. Zunächst verbinden wir alle verwendeten Kisten mit dem Eingang des Kombinators für Berechnungen. Im Kombinator für Berechnungen wird als Berechnung Gegenstand / -Anzahl der Kisten und als Ausgabe Gegenstand eingestellt. Dies ergibt den Durchschnitt der Anzahl der Gegenstände in den Kisten, mit einem negativen Vorzeichen. Als letztes werden alle verwendeten Greifarme mit andersfarbigem Signalkabel mit dem Ausgang des Kombinators verbunden. Die Greifarme so einstellen, dass sie aktivert werden, wenn Gegenstand < 1 ist.

Eine anschaulichere Darstellung sowie Fragen zum Design finden sich in einem reddit-Post: MadZuri's smart loading train station.

Erläuterung, warum das funktioniert: Der Kombinator berechnet die durchschnittliche Anzahl der Gegenstände in den Kisten als negative Zahl. Der Kisteninhalt des Greifarms ist positiv, und da das Schaltungsnetz implizit alle Eingaben addiert, ergibt sich bei der Addition des negativen Durchschnitts die Differenz aus Durchschnitt und Anzahl Gegenstände in der Kiste. Ist die Differenz kleiner als 1, also 0 oder negativ, befinden sich genauso viele oder weniger Gegenstände in der Kiste als der Durchschnitt, d.h. der Greifarm wird aktiviert. Anders herum ausgedrückt: ist die Differenz 1 oder größer, dann befinden sich mehr Gegenstände in der Kiste als der Durchschnitt und der Greifarm bleibt deaktiviert.

Speicher

Um beispielsweise einen Zähler zu realisieren, aber auch für komplexere Schaltungen, benötigt man einen Speicher, der die verarbeiteten Werte zwischenspeichert. Hierzu setzen wir einen Kombinator für Entscheidungen ein, bei dem der Ausgang an den Eingang angeschlossen wird und als Kriterium größer als 0 (für positive Werte) eingestellt hat. Solange alle anderen Eingaben im Netz 0 sind, wird damit der Ausgabewert erhalten. Jeder Eingang ungleich 0 erzeugt einen Grundtakt. In jedem Zyklus wird der gespeicherte Wert um die Summe aller angeschlossenen Eingangswerte erhöht. Ein einzelner Impuls eines Eingangs bewirkt somit eine einmalige Inkrementierung um den gepulsten Wert. Ein Rücksetzen des Zählers auf 0 erfolgt immer dann, wenn die eingestellte Bedingung nicht mehr erfüllt ist, oder wenn ein negativer Impuls in Höhe des Eingangswertesg auftritt.

Taktgeber

Ein grundlegender Taktgeber. Signal 1 wird Tick für Tick erhöht bis 30 erreicht sind, dann beginnt er wieder bei 1.

Ein Taktgeber entsteht, wenn man den Ausgang eines Kombinators mit seinem eigenen Eingang verbindet, so dass jeder Zyklus den Zählerstand wieder an den Eingang zurückgibt. Es kann entweder der Kombinator für Berechnungen oder der Kombinator für Entscheidungen verwendet werden.

Ein Kombinator für Berechnungen, der mit sich selbst verbunden ist, ist lustig anzusehen und läuft endlos durch. Es erfordert zusätzliche Steuerlogik zum Zurücksetzen.

Für einen selbstrückstellenden Taktgeber wird nur ein einziger Kombinator für Entscheidungen benötigt, dessen Ausgang mit dem Eingang verbunden ist und der mit kleiner als (<) und Eingabe → Ausgabe konfiguriert ist. Wenn dann ein Kombinator für Konstanten an den Eingang angeschlossen wird, zählt er jeden Zyklus um den Wert des Kombinators für Konstanten hoch, bis der eingestellte Wert in der Bedingung erreicht ist, und gibt dann eine 0 aus, die mit dem Kombinator für Konstanten summiert wird und den Prozess zurücksetzt.

Die Taktsequenz enthält keine 0. Sie beginnt bei dem im Kombinator für Konstanten eingestellten Wert und geht bis zu dem Wert, der schließlich dazu führt, dass die Bedingung falsch ist. Ein Kombinator für Berechnungen kann die Taktsequenz ändern, aber man muss daran denken, dass seine Ausgaben einen Zyklus später als die Eingangswerte des Taktzyklus auftreten.

Ein Taktgenerator, der nur einmal zählt, kann mit dem folgenden Aufbau erstellt werden:

Einmaliger Taktgeber. Läuft bis T=Z+1. Rücksetzen über R>0.

Impulsgeneratoren

Wenn man einen zusätzlichen Kombinator für Entscheidungen (=) an den Ausgang eines einfachen Taktgebers anschließt, kann man man ein Impulsgenerator bauen, der jedes Mal, wenn der Takt die eingestellte Bedingung durchläuft, einen einzelnen Puls am Ausgang ausgibt. Jeder beliebige Ausgangswert kann verwendet werden, entweder direkt von der Taktsequenz (Eingang → Ausgang), eine 1, oder ein Wert auf einem separaten Logikkanal des Schaltungsnetzes, wie er von einem Kombinator für Konstanten gesetzt wird, oder vom Schaltungsnetz selbst.
PulseGen.png

  • Der Wert 1 kann als beliebige positive ganze Zahl geschrieben werden, solange er innerhalb der Grenzen des Taktgenerators liegt.
  • Mit obigem Taktgenerator würde dieses Licht jeden 1. Tick pulsieren, nachdem der Taktgeber 30 Ticks erreicht hat. Das bedeutet, dass es 1/30 einer Sekunde pulsiert, da Factorio Schaltungen 60 Mal pro Sekunde aktualisiert.

Zähler

Ein Zähler wird verwendet, um eine Anzahl von Eingangsereignissen zu zählen und die Summe dieser Zählung auszugeben. Jeder pulsierende Eingang in einen Kombinator für Entscheidungen, der als Eingang → Ausgang konfiguriert und Ausgang und Eingang verbunden hat, erzeugt einen Zähler. Dieser Eingang muss zu allen anderen Zeiten 0 sein, sonst läuft der Kombinator wie eine Uhr durchgängig.

Üblicherweise wird dazu ein Impulsgenerator verwendet. Schaltet man mehrere Kombinatoren für Entscheidungen mit sequentiellen Bedingungen, die als Isolator dienen, mit einem Taktgeber und einem Impulsgenerator zusammen an den Eingang eines Zählers, kann man die Inhalte der einzelnen Kombinatoren abfragen und zählen.

Logikgatter

Einige Logikgatter funktionieren nur mit booleschen Werten, bei denen die Eingänge entweder 0 oder 1 sind. Andere Logikgatter funktionieren auch mit anderen Werten, z.B. 2.

Eingebaut

Der Kombinator für Berechnungen hat eingebaute OR-, XOR- und AND-Operatoren. Diese arbeiten bitweise, d. h. sie führen die Operation auf jedem Bit der Zahl im Binärformat aus und geben das Ergebnis zurück.

Ein Beispiel für den bitweisen AND-Operator:

Eingang 1 Eingan 2 Ausgang
0 1 0
1 1 1
1 4 0
1 3 1
10 30 10
10 40 8

Wenn die Eingänge nur aus booleschen Werten (1 oder 0) bestehen, können die Operatoren des Kombinators für Berechnungen als Logikgatter verwendet werden.

Monadisches NOT


NOT.png

Wahrheitstabelle:

Eingang Ausgang
0 1
1 0

Binäres OR


OR.png

Wahrheitstabelle:

Eingang 1 Eingang 2 Ausgang
0 0 0
0 1 1
1 0 1
1 1 1

*Hinweis: Dies funktioniert für eine beliebige Anzahl von Eingängen, die alle als das Signal "A" gesendet werden. Dies funktioniert sowohl für boolesche Eingänge als auch für andere Werte.

Binäres NOR


NOR.png

Wahrheitstabelle:

Eingang 1 Eingang 2 Ausgang
0 0 1
0 1 0
1 0 0
1 1 0


*Hinweis: Dies funktioniert für eine beliebige Anzahl von Eingängen, die alle als das Signal "A" gesendet werden. Dies funktioniert sowohl für boolesche Eingänge als auch für andere Werte.


Binäres XOR


XOR.png

Wahrheitstabelle:

Eingang 1 Eingang 2 Ausgang
0 0 0
0 1 1
1 0 1
1 1 0

*Hinweis: Dies funktioniert nur bei booleschen Eingängen.

Binäres AND


AND.png

Wahrheitstabelle:

Eingang 1 Eingang 2 Ausgang
0 0 0
0 1 0
1 0 0
1 1 1

*Hinweis: Das angegebene Beispiel für den Kombinator für Berechnungen funktioniert für nicht-boolesche Werte und gibt nicht-boolesche Werte zurück, wenn sie als Eingabe gegeben werden, aber nur, wenn beide Werte nicht 0 sind.

*Hinweis: Das angegebene Beispiel für den Kombinator für Entscheidungen funktioniert nur für boolesche Werte. Es kann für eine beliebige Anzahl von Eingängen geändert werden, indem die angezeigte "1" auf 1 weniger als die Anzahl der Eingänge oder die angezeigte "2" auf die Anzahl der Eingänge geändert wird, wie unten für ein ternäres UND gezeigt.

Ternäres AND


TrinaryAND.png

Wahrheitstabelle

Eingang 1 Eingang 2 Eingang 3 Ausgang
0 0 0 0
0 1 0 0
0 0 1 0
0 1 1 0
1 0 0 0
1 1 0 0
1 0 1 0
1 1 1 1

Binäres NAND


NAND.png

Wahrheitstabelle:

Eingang 1 Eingang 2 Ausgang
0 0 1
0 1 1
1 0 1
1 1 0

*Hinweis: Dies funktioniert nur für boolesche Eingangswerte. Es kann für eine beliebige Anzahl von Eingängen geändert werden, indem die angezeigte "2" in die Anzahl der Eingänge geändert wird.

Binäres XNOR


XAND.png

Wahrheitstabelle:

Eingang 1 Eingang 2 Ausgang
0 0 1
0 1 0
1 0 0
1 1 1

*Hinweis: Dies funktioniert nur bei booleschen Eingabewerten.

Speicherzellen

Einfaches Flipflop

Wenn man den Kombinator in einer Schleife mit sich selbst verbindet, muss man andere Kabelfarbe verwenden als die Haupteingänge oder -ausgänge.

SimpleLatchv2.png

Wahrheitstabelle:

Ausgang 1 Eingang 1 Einmgang 2 Ausgang 1 (t+1)
0 0 0 0
0 1 0 1
0 0 1 0
0 1 1 0
1 0 0 1
1 1 0 1 (2)
1 0 1 0
1 1 1 1 (2)

Ausgang 1 ist die grüne Schleife, die im Bild zu sehen ist. Sie trägt den zu speichernden Wert.

Eingang 1 ist Set, und Eingang 2 ist Reset.

Positive Zelle

Zelle zum Speichern eines positiven Wertes, mit Reset-Unterstützung:

AdvancedMemoryCell.png

Der gewünschte Wert wird als Signal I auf der rechten Seite angeschlossen, um die Speicherzelle zu setzen. Um die Zelle zurückzusetzen, schließt man einen negativen Wert als Signal I an.

  • Der Ausgang der Speicherzelle ist 2 sich gegenseitig ausschließende Signale.
    • Falls das Eingangssignal I > 0 ist, wird das Signal I auf die andere Seite weitergegeben.
    • Falls das Eingangssignal I unterbrochen wird, wird stattdessen das Signal M als Speicher des vorherigen Eingangswertes ausgegeben.
  • Wenn das Eingangssignal I unterbrochen wird, dauert es 2 Ticks, um auf das Speichersignal M umzuschalten.
  • Wenn das Eingangssignal I nur einen Tick dauert, beginnt die Speicherzelle zwischen den beiden vorherigen Werten zu wechseln, Tick für Tick. Unbegrenzt.
  • Die Umschaltung erfolgt nahtlos, d. h. es gibt keine Ticks mit Leersignal.

Positiv- und Negativzelle

Diese Zelle kann negative oder positive Werte speichern. Der Reset erfolgt auf einer eigenen Leitung. Zusätzlich wird ein 1-Tick-Burst korrekt behandelt. Forum Beitrag.

  • Der Ausgang M (Speicher) ist der letzte Nicht-Null-Eingang I (Eingang).
  • Ein Nicht-Null-Signal R (Reset) setzt den Ausgang auf Null.
  • 1-Tick-Bursts von R oder I werden korrekt behandelt.
  • Negative Werte werden korrekt behandelt.

Memory cell with negatives.png

Multiplikator und Wörterbücher/Arrays

CombinatorMultiplierDetailed.png
  • Die Multiplikation von zwei Signalen ist einfach und erfordert nur einen einzigen Kombinator. Die Multiplikation einer Gruppe von Signalen ist jedoch komplizierter.
  • Ein Beweis für die Gleichung und warum sie funktioniert, wird unten gezeigt.
  • Ein Wörterbuch ist ein System, mit dem auf einen Wert eines bestimmten Signals zugegriffen werden kann. Zum Beispiel kann A viele Signale enthalten (entweder von einem Kombinator für Konstanten oder einer Speicherzelle) und B kann 1 eines bestimmten Signals enthalten (z. B. das blaue Signal). Was übrig bleibt, ist der Wert des blauen Signals aus A. Das liegt daran, dass alle anderen Signale mit 0 multipliziert werden.
  • Arrays sind ähnlich wie Wörterbücher, aber statt eines Signals als Schlüssel verwenden wir eine Zahl. Es werden Kombinatoren für Konstanten platziert, die jedes Signal auf eine eindeutige Zahl abbilden (z. B. 1 gelbes Fließband, 2 rotes Fließband, 3 blaues Fließband, 4 Befeuerter Greifarm, usw.). Dann verwendet man einen Kombinator mit "jedes = Index OUTPUT 1 von jedem" und setzen das als Eingabe in ein Wörterbuch ein.
CombinatorMultiplierMath.png
   ((A+B)^2 - (A-B)^2)/4 = AB
   (A+B)^2 - (A-B)^2 = 4AB
   (A^2 + 2AB + B^2) - (A^2 - 2AB + B^2) = 4AB
   4AB = 4AB

Siehe auch