Multiplikation
Die ganzzahlige Multiplikation von Werten lässt sich durch wiederholte Addition realisieren, da folgendes gilt:
a*b = Sum (i=1 … a) b
Der folgende Code funktioniert allerdings nur bei ganzzahligen Werten für a. Dafür wird allerdings auch das Vorzeichen von a berücksichtigt. Das Ergebnis der Berechnung wird in der Speicherzelle c (3) abgelegt.
@Start # Initialisierung des Programmzeigers Step: -3 # Schrittweite des Programmzeigers a: 10 # Wert für a, hier: 10 b: 5 # Wert für b, hier: 5 c: 0 # Wert für c,wird das Ergebnis beinhalten i: 0 # Wert für i, Schleifenvariable tmp: 0 # Wert für tmp, temporärer Speicher one: 1 # Wert für one, Konstante 1 REM Schleifenvariable i setzen Start: JA @a @posi # a>0, a muss erst negiert werden SUB @i @a # ansonsten a negativ in i transferieren JA 0 @loop # zur Multiplikation posi: SUB @tmp @a # tmp = -a SUB @i @tmp # i = -tmp = a SUB @tmp @tmp # tmp = 0 REM while i>0 ... loop: JA @i @next # Wenn i größer als 0 ist, weiter, sonst REM Schleife beendet, Ergebnis invertieren SUB @c @c # c = 0 JA @a @posa REM a war negativ SUB @i @i # i = 0 SUB @i @tmp # i = -tmp SUB @c @i # c = -i = tmp SUB 0 0 # Programm beenden REM a war positiv posa: SUB @c @tmp # c = -tmp SUB 0 0 # Programm beenden REM Schleifeninhalt, eine weitere Addition next: SUB @i @one # i dekrementieren SUB @tmp @b # tmp = tmp - b JA 0 @loop
In diesem Beispiel kommt erstmals auch eine Schleife im Sinne von while i>0 zum Einsatz.
Der Code lässt sich kürzer fassen, wenn z. B. die Überprüfung auf das Vorzeichen von a verzichtet werden kann oder die Speicherstellen für a und b nicht erhalten bleiben müssen. Auch ist dies sicherlich nicht die Effizienteste Möglichkeit, wenn mit großen Zahlen agiert wird. Die Berechnung von 1.000.000*1 macht dies deutlich. Zugleich wird wird 1*1.000.000 erheblich schneller berechnet, so dass es in einem optimierten Code Sinn machen kann, die Eingangswerte zunächst zu vergleichen und die Schleife über den kleineren Wert laufen zu lassen.
@Start # Initialisierung des Programmzeigers Step: -3 # Schrittweite des Programmzeigers a: 10 # Wert für a, hier: 10 b: 5 # Wert für b, hier: 5 c: 0 # Wert für c,wird das Ergebnis beinhalten i: 0 # Wert für i, Schleifenvariable tmp: 0 # Wert für tmp, temporärer Speicher absa: 0 # a Vorzeichenlos absb: 0 # b Vorzeichenlos one: 1 # Wert für one, Konstante 1 min: 0 # Speicher für den kleineren Wert max: 0 # Speicher für den größeren Wert Start: REM Optimierung der Multiplikation durch Sortierung der Eingangsgrößen REM um die äußere Schleife nur über den kleineren Faktor laufen zu lassen. REM Absolutwert für b ermitteln JA @b @posb # b>0 SUB @absb @b # chg = -b JA 0 @checka posb: SUB @tmp @b # tmp = -b SUB @absb @tmp # absb = -tmp = b SUB @tmp @tmp # tmp = 0 REM Absolutwert für a ermitteln checka: JA @a @posa # a>0 SUB @absa @a # chg = -a JA 0 @posab posa: SUB @tmp @a # tmp = -a SUB @absa @tmp # absa = -tmp = a SUB @tmp @tmp # tmp = 0 REM Vergleich der Absolutwerte und Belegung der Hilfsvariablen REM min, max und i posab: SUB @absb @absa # absb = absb - absa JA @absb @bgra # b>a SUB @tmp @a SUB @min @tmp # min = a SUB @tmp @tmp SUB @tmp @absa SUB @i @tmp # i = |a| SUB @tmp @tmp SUB @tmp @b SUB @max @tmp # max = b SUB @tmp @tmp JA 0 @loop bgra: SUB @tmp @a SUB @max @tmp # max = 0 SUB @tmp @tmp SUB @tmp @b SUB @min @tmp # min = b SUB @i @tmp SUB @tmp @tmp REM Multiplikation von min und max in einer Schleife über i = min REM while i>0 ... loop: JA @i @next # Wenn i größer als 0 ist, weiter, sonst REM Schleife beendet, Ergebnis ggf. invertieren in abh. vom Vorzeichen REM des kleineren Werts (min) SUB @c @c # c = 0 JA @min @posmin REM min war negativ SUB @i @i # i = 0 SUB @i @tmp # i = -tmp SUB @c @i # c = -i = tmp SUB 0 0 # Programm beenden REM min war positiv posmin: SUB @c @tmp # c = -tmp SUB 0 0 # Programm beenden REM Schleifeninhalt, eine weitere Addition next: SUB @i @one # i dekrementieren SUB @tmp @max # tmp = tmp - b JA 0 @loop
Eine weitere Verbesserung kann das Zerlegen in Primfaktoren darstellen, wenn a = a1*a2*a3*…*an+a0*1 ist. In dem Fall muss die Schleife nicht über a, sondern nur über die Summe von a0 bis an gehen. Bei a = 1.000 = 2*2*2*5*5*5 wären so lediglich 21 statt 1000 innere Iterationen erforderlich. Die Berechnung, bzw. der Aufwand für die Berechnung der Primfaktoren stellt dann allerdings noch eine andere Größe dar.