<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="de">
	<id>https://wiki-de.moshellshocker.dns64.de/index.php?action=history&amp;feed=atom&amp;title=Steinscher_Algorithmus</id>
	<title>Steinscher Algorithmus - Versionsgeschichte</title>
	<link rel="self" type="application/atom+xml" href="https://wiki-de.moshellshocker.dns64.de/index.php?action=history&amp;feed=atom&amp;title=Steinscher_Algorithmus"/>
	<link rel="alternate" type="text/html" href="https://wiki-de.moshellshocker.dns64.de/index.php?title=Steinscher_Algorithmus&amp;action=history"/>
	<updated>2026-05-29T17:08:07Z</updated>
	<subtitle>Versionsgeschichte dieser Seite in Wikipedia (Deutsch) – Lokale Kopie</subtitle>
	<generator>MediaWiki 1.43.8</generator>
	<entry>
		<id>https://wiki-de.moshellshocker.dns64.de/index.php?title=Steinscher_Algorithmus&amp;diff=135743&amp;oldid=prev</id>
		<title>~2025-34586-1: /* Algorithmus */</title>
		<link rel="alternate" type="text/html" href="https://wiki-de.moshellshocker.dns64.de/index.php?title=Steinscher_Algorithmus&amp;diff=135743&amp;oldid=prev"/>
		<updated>2025-08-10T18:12:39Z</updated>

		<summary type="html">&lt;p&gt;&lt;span class=&quot;autocomment&quot;&gt;Algorithmus&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;Neue Seite&lt;/b&gt;&lt;/p&gt;&lt;div&gt;Der &amp;#039;&amp;#039;&amp;#039;steinsche Algorithmus&amp;#039;&amp;#039;&amp;#039; oder &amp;#039;&amp;#039;&amp;#039;binäre euklidische Algorithmus&amp;#039;&amp;#039;&amp;#039; dient der effizienten Berechnung des [[Größter gemeinsamer Teiler|größten gemeinsamen Teilers]]. Der [[Algorithmus]] wurde [[1967]] vom Physiker Josef Stein ([[Hebräische Universität Jerusalem]]) vorgestellt.&amp;lt;ref&amp;gt;{{Literatur |Autor=J. Stein |Titel=Computational problems associated with Racah algebra |Sammelwerk=Journal of Computational Physics |Band=1 |Nummer=3 |Datum=1967 |ISSN=0021-9991 |Seiten=397–405 |DOI=10.1016/0021-9991(67)90047-2}}&amp;lt;/ref&amp;gt; [[Donald E.&amp;amp;nbsp;Knuth]] zufolge entwickelten R.&amp;amp;nbsp;Silver und J.&amp;amp;nbsp;Tersian den Algorithmus bereits 1962, publizierten ihn aber nicht.&amp;lt;ref name=&amp;quot;KNUTH&amp;quot;&amp;gt;[[Donald E. Knuth]]: &amp;#039;&amp;#039;[[The Art of Computer Programming]].&amp;#039;&amp;#039; Band 2: &amp;#039;&amp;#039;Seminumerical Algorithms.&amp;#039;&amp;#039; 3. Auflage. Addison-Wesley Professional, 1997, ISBN 0-201-89684-2, S.&amp;amp;nbsp;338–341.&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Funktionsweise ==&lt;br /&gt;
Der Algorithmus nutzt folgende Rechenregeln:&lt;br /&gt;
&lt;br /&gt;
Falls &amp;lt;math&amp;gt;b = 0&amp;lt;/math&amp;gt;:&lt;br /&gt;
* &amp;lt;math&amp;gt;\operatorname{ggT}(a,\ 0) = a \qquad &amp;lt;/math&amp;gt; und Haltebedingung des Algorithmus&lt;br /&gt;
&lt;br /&gt;
Falls &amp;lt;math&amp;gt;b = \text{ungerade}&amp;lt;/math&amp;gt;:&lt;br /&gt;
* &amp;lt;math&amp;gt;\operatorname{ggT}(a,\ b) = \begin{cases}&lt;br /&gt;
                                      \operatorname{ggT}(a,\ b-a)\ \ \quad &amp;amp; \text{falls } b \ge a \\&lt;br /&gt;
                                      \operatorname{ggT}(b,\ a-b)\ \ \quad &amp;amp; \text{sonst }&lt;br /&gt;
                                    \end{cases}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Falls &amp;lt;math&amp;gt;b = \text{gerade}&amp;lt;/math&amp;gt;:&lt;br /&gt;
* &amp;lt;math&amp;gt;\operatorname{ggT}(a,\ b) = \begin{cases}&lt;br /&gt;
                                      \operatorname{ggT}(a,\ b/2)             &amp;amp; \text{falls } a \text{ ungerade} \\&lt;br /&gt;
                                      \operatorname{ggT}(a/2,\ b/2) \cdot 2   &amp;amp; \text{sonst }&lt;br /&gt;
                                    \end{cases}&amp;lt;/math&amp;gt;&lt;br /&gt;
;Funktionsweise:&lt;br /&gt;
:a) Nutzt &amp;lt;math&amp;gt;\operatorname{ggT}(a,\ 0) = a\ &amp;lt;/math&amp;gt; aus und ist gleichzeitig die Haltebedingung des Algorithmus.&lt;br /&gt;
:b) Wird abgewendet, wenn &amp;lt;math&amp;gt;b&amp;lt;/math&amp;gt; ungerade ist.&lt;br /&gt;
::b1) Ist &amp;lt;math&amp;gt;b \ge a&amp;lt;/math&amp;gt;, wird &amp;lt;math&amp;gt;b&amp;lt;/math&amp;gt; um &amp;lt;math&amp;gt;a&amp;lt;/math&amp;gt; reduziert. &amp;lt;math&amp;gt;\operatorname{ggT}(a,\ b) = \operatorname{ggT}(a,\ b-a)&amp;lt;/math&amp;gt; ausgenutzt.&lt;br /&gt;
::b2) Ist &amp;lt;math&amp;gt;b &amp;lt; a&amp;lt;/math&amp;gt;, wird als erster Operand der zweite Operand &amp;lt;math&amp;gt;b&amp;lt;/math&amp;gt; benutzt und als zweiter Operand &amp;lt;math&amp;gt;a-b&amp;lt;/math&amp;gt;. &lt;br /&gt;
:::Durch dieses geschickte Umsortieren wird das Horrorszenario des klassischen euklidischen Algorithmus vermieden, in dem ein sehr großer Operand nur sehr langsam reduziert wird.&lt;br /&gt;
:c) wird verwendet, wenn &amp;lt;math&amp;gt;b&amp;lt;/math&amp;gt; gerade ist:&lt;br /&gt;
::c1) Wenn nur ein Operand gerade ist, kann die &amp;lt;math&amp;gt;2&amp;lt;/math&amp;gt; als gemeinsamer Teiler gestrichen werden.&lt;br /&gt;
::c2) Wenn beide Operanden gerade ist, werde beide um den Teiler &amp;lt;math&amp;gt;2&amp;lt;/math&amp;gt; verringert, diese Operation wird sich aber für das Endergebnis gemerkt, da es ja ein gemeinsamer Teiler ist.&lt;br /&gt;
&lt;br /&gt;
Wir benutzen dafür das Horrorszenario für den klassischen euklidischen Algorithmus, zwei große fast gleiche Zahlen &amp;lt;math&amp;gt;209865&amp;lt;/math&amp;gt; und &amp;lt;math&amp;gt;209797&amp;lt;/math&amp;gt;:&lt;br /&gt;
&amp;lt;div style=&amp;quot;font-size:90%&amp;quot;&amp;gt;&lt;br /&gt;
:&amp;lt;math&amp;gt;\begin{array}{rl|l}&lt;br /&gt;
\operatorname{ggT}(209865,\ 209797) &amp;amp;  = \operatorname{ggT}(209797,\ 68) &amp;amp; \scriptstyle{\text{b2}} \\&lt;br /&gt;
\operatorname{ggT}(209797,\ 68) &amp;amp;  = \operatorname{ggT}(209797,\ 34) &amp;amp; \scriptstyle{\text{c1}} \\&lt;br /&gt;
\operatorname{ggT}(209797,\ 34) &amp;amp;  = \operatorname{ggT}(209797,\ 17) &amp;amp; \scriptstyle{\text{c1}} \\&lt;br /&gt;
\operatorname{ggT}(209797,\ 17) &amp;amp;  = \operatorname{ggT}(17,\ 209780) &amp;amp; \scriptstyle{\text{b2, hier bekommt der klassische euklidische Algorithmus ein Problem, hier wird allerdings eine ungerade Zahl durch Division durch 2 erzeugt und diese nach vorn gebracht}} \\&lt;br /&gt;
\operatorname{ggT}(17,\ 209780) &amp;amp;  = \operatorname{ggT}(17,\ 104890) &amp;amp; \scriptstyle{\text{c1, hier wird entweder halbiert oder diese ungerade Zahl subtrahiert und damit eine gerade Zahl erzeugt}} \\&lt;br /&gt;
\operatorname{ggT}(17,\ 104890) &amp;amp;  = \operatorname{ggT}(17,\ 52445) &amp;amp; \scriptstyle{\text{c1}} \\&lt;br /&gt;
\operatorname{ggT}(17,\ 52445) &amp;amp;  = \operatorname{ggT}(17,\ 52428) &amp;amp; \scriptstyle{\text{b1}} \\&lt;br /&gt;
\operatorname{ggT}(17,\ 52428) &amp;amp;  = \operatorname{ggT}(17,\ 26214) &amp;amp; \scriptstyle{\text{c1}} \\&lt;br /&gt;
\operatorname{ggT}(17,\ 26214) &amp;amp;  = \operatorname{ggT}(17,\ 13107) &amp;amp; \scriptstyle{\text{c1}} \\&lt;br /&gt;
\operatorname{ggT}(17,\ 13107) &amp;amp;  = \operatorname{ggT}(17,\ 13090) &amp;amp; \scriptstyle{\text{b1}} \\&lt;br /&gt;
\operatorname{ggT}(17,\ 13090) &amp;amp;  = \operatorname{ggT}(17,\ 6545) &amp;amp; \scriptstyle{\text{c1}} \\&lt;br /&gt;
\operatorname{ggT}(17,\ 6545) &amp;amp;  = \operatorname{ggT}(17,\ 6528) &amp;amp; \scriptstyle{\text{b1}} \\&lt;br /&gt;
\operatorname{ggT}(17,\ 6528) &amp;amp;  = \operatorname{ggT}(17,\ 3264) &amp;amp; \scriptstyle{\text{c1}} \\&lt;br /&gt;
\operatorname{ggT}(17,\ 3264) &amp;amp;  = \operatorname{ggT}(17,\ 1632) &amp;amp; \scriptstyle{\text{c1}} \\&lt;br /&gt;
\operatorname{ggT}(17,\ 1632) &amp;amp;  = \operatorname{ggT}(17,\ 816) &amp;amp; \scriptstyle{\text{c1}} \\&lt;br /&gt;
\operatorname{ggT}(17,\ 816) &amp;amp;  = \operatorname{ggT}(17,\ 408) &amp;amp; \scriptstyle{\text{c1}} \\&lt;br /&gt;
\operatorname{ggT}(17,\ 408) &amp;amp;  = \operatorname{ggT}(17,\ 204) &amp;amp; \scriptstyle{\text{c1}} \\&lt;br /&gt;
\operatorname{ggT}(17,\ 204) &amp;amp;  = \operatorname{ggT}(17,\ 102) &amp;amp; \scriptstyle{\text{c1}} \\&lt;br /&gt;
\operatorname{ggT}(17,\ 102) &amp;amp;  = \operatorname{ggT}(17,\ 51) &amp;amp; \scriptstyle{\text{c1}} \\&lt;br /&gt;
\operatorname{ggT}(17,\ 51) &amp;amp;  = \operatorname{ggT}(17,\ 34) &amp;amp; \scriptstyle{\text{b1}} \\&lt;br /&gt;
\operatorname{ggT}(17,\ 34) &amp;amp;  = \operatorname{ggT}(17,\ 17) &amp;amp; \scriptstyle{\text{c1}} \\&lt;br /&gt;
\operatorname{ggT}(17,\ 17) &amp;amp;  = \operatorname{ggT}(17,\ 0) &amp;amp; \scriptstyle{\text{b1}} \\&lt;br /&gt;
\operatorname{ggT}(17,\ 0) &amp;amp;  = 17 &amp;amp; \scriptstyle{\text{a}} \\&lt;br /&gt;
\end{array}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Zu beachten ist, dass der steinsche Algorithmus nur dann richtig funktioniert, wenn &amp;#039;&amp;#039;vorzeichenlose&amp;#039;&amp;#039; [[Integer (Datentyp)|Integer]] verwendet werden. Negative Zahlen müssen zuerst in positive überführt werden. Der euklidische Algorithmus hingegen funktioniert auch mit &amp;#039;&amp;#039;vorzeichenbehafteten&amp;#039;&amp;#039; Integertypen, wenn ein Operand nicht die kleinste darstellbare Zahl ist.&lt;br /&gt;
&lt;br /&gt;
== Prinzip ==&lt;br /&gt;
Zu bestimmen sei der größte gemeinsame Teiler der beiden positiven Zahlen &amp;lt;math&amp;gt;a&amp;lt;/math&amp;gt; und &amp;lt;math&amp;gt;b&amp;lt;/math&amp;gt;. Dazu wird als erstes eine Variable &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; definiert und dieser wird der Wert 0 zugewiesen. Dann werden sowohl &amp;lt;math&amp;gt;a&amp;lt;/math&amp;gt; als auch &amp;lt;math&amp;gt;b&amp;lt;/math&amp;gt; solange durch 2 geteilt, bis &amp;lt;math&amp;gt;a&amp;lt;/math&amp;gt; und &amp;lt;math&amp;gt;b&amp;lt;/math&amp;gt; nicht mehr durch 2 teilbar sind. Bei jeder Halbierung wird &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; um 1 erhöht.&lt;br /&gt;
&lt;br /&gt;
Der zweite Teil benötigt eine zusätzliche Variable &amp;lt;math&amp;gt;t&amp;lt;/math&amp;gt;, der die Differenz von &amp;lt;math&amp;gt;a&amp;lt;/math&amp;gt; und &amp;lt;math&amp;gt;b&amp;lt;/math&amp;gt; zugewiesen wird. Jeder gemeinsame Teiler von &amp;lt;math&amp;gt;a&amp;lt;/math&amp;gt; und &amp;lt;math&amp;gt;b&amp;lt;/math&amp;gt; ist auch Teiler von &amp;lt;math&amp;gt;t&amp;lt;/math&amp;gt;, sodass gilt: &amp;lt;math&amp;gt;\operatorname{ggT}(a, b) = \operatorname{ggT}(a, t) = \operatorname{ggT}(b, t)&amp;lt;/math&amp;gt;. Die Variable &amp;lt;math&amp;gt;t&amp;lt;/math&amp;gt; wird anschließend noch, solange es sich um eine gerade Zahl handelt, durch 2 geteilt. Dann wird &amp;lt;math&amp;gt;a&amp;lt;/math&amp;gt; durch &amp;lt;math&amp;gt;t&amp;lt;/math&amp;gt; ersetzt und mit dem neuen &amp;lt;math&amp;gt;a&amp;lt;/math&amp;gt; ein neues &amp;lt;math&amp;gt;t&amp;lt;/math&amp;gt; berechnet. Der Algorithmus ist beendet, sobald &amp;lt;math&amp;gt;t = 0&amp;lt;/math&amp;gt; gilt. Das Ergebnis ist dann &amp;lt;math&amp;gt;\operatorname{ggT}(a, b) = a \cdot 2^k&amp;lt;/math&amp;gt;.&amp;lt;ref&amp;gt;{{Internetquelle |autor=Alexander Weers |url=https://www.formelsammlung24.de/sites/Primfaktorzerlegung/ggT/ |titel=Größter gemeinsamer Teiler |werk=Formelsammlung24.de |abruf=2018-03-27 |archiv-url=https://web.archive.org/web/20180328041145/https://www.formelsammlung24.de/sites/Primfaktorzerlegung/ggT/ |archiv-datum=2018-03-28}}&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Algorithmus ==&lt;br /&gt;
Die hier in [[Pseudocode]] beschriebene Variante des Algorithmus entspricht im Wesentlichen derjenigen, die [[Donald E.&amp;amp;nbsp;Knuth]] in seinem Werk &amp;#039;&amp;#039;[[The Art of Computer Programming]]&amp;#039;&amp;#039; beschreibt.&lt;br /&gt;
&lt;br /&gt;
 &amp;#039;&amp;#039;STEIN&amp;#039;&amp;#039;(a,b)&lt;br /&gt;
   &amp;#039;&amp;#039;&amp;#039;wenn&amp;#039;&amp;#039;&amp;#039; a = 0&lt;br /&gt;
       &amp;#039;&amp;#039;&amp;#039;dann&amp;#039;&amp;#039;&amp;#039; &amp;#039;&amp;#039;&amp;#039;return&amp;#039;&amp;#039;&amp;#039; b&lt;br /&gt;
   k &amp;lt;math&amp;gt;\leftarrow&amp;lt;/math&amp;gt; 0&lt;br /&gt;
   &amp;#039;&amp;#039;&amp;#039;solange&amp;#039;&amp;#039;&amp;#039; a und b gerade Zahlen sind&lt;br /&gt;
       a &amp;lt;math&amp;gt;\leftarrow&amp;lt;/math&amp;gt; a/2&lt;br /&gt;
       b &amp;lt;math&amp;gt;\leftarrow&amp;lt;/math&amp;gt; b/2&lt;br /&gt;
       k &amp;lt;math&amp;gt;\leftarrow&amp;lt;/math&amp;gt; k + 1&lt;br /&gt;
   &amp;#039;&amp;#039;&amp;#039;wenn&amp;#039;&amp;#039;&amp;#039; a eine ungerade Zahl ist&lt;br /&gt;
       &amp;#039;&amp;#039;&amp;#039;dann&amp;#039;&amp;#039;&amp;#039; t &amp;lt;math&amp;gt;\leftarrow&amp;lt;/math&amp;gt; -b&lt;br /&gt;
       &amp;#039;&amp;#039;&amp;#039;sonst&amp;#039;&amp;#039;&amp;#039; t &amp;lt;math&amp;gt;\leftarrow&amp;lt;/math&amp;gt; a&lt;br /&gt;
   &amp;#039;&amp;#039;&amp;#039;solange&amp;#039;&amp;#039;&amp;#039; t ≠ 0&lt;br /&gt;
       &amp;#039;&amp;#039;&amp;#039;solange&amp;#039;&amp;#039;&amp;#039; t eine gerade Zahl ist&lt;br /&gt;
           t &amp;lt;math&amp;gt;\leftarrow&amp;lt;/math&amp;gt; t/2&lt;br /&gt;
       &amp;#039;&amp;#039;&amp;#039;wenn&amp;#039;&amp;#039;&amp;#039; t &amp;gt; 0&lt;br /&gt;
           &amp;#039;&amp;#039;&amp;#039;dann&amp;#039;&amp;#039;&amp;#039; a &amp;lt;math&amp;gt;\leftarrow&amp;lt;/math&amp;gt; t&lt;br /&gt;
           &amp;#039;&amp;#039;&amp;#039;sonst&amp;#039;&amp;#039;&amp;#039; b &amp;lt;math&amp;gt;\leftarrow&amp;lt;/math&amp;gt; -t&lt;br /&gt;
       t &amp;lt;math&amp;gt;\leftarrow&amp;lt;/math&amp;gt; a - b&lt;br /&gt;
   &amp;#039;&amp;#039;&amp;#039;return&amp;#039;&amp;#039;&amp;#039; a &amp;lt;math&amp;gt; \cdot &amp;lt;/math&amp;gt; 2&amp;lt;sup&amp;gt;k&amp;lt;/sup&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Viele Prozessoren haben heutzutage [[Befehlssatzarchitektur|Befehlssätze]], die sehr schnell (oft in einem Takt) bestimmen können, wie oft eine Ganzzahl durch Zwei teilbar ist. Zum Beispiel stellt die [[x86-Architektur]] seit dem [[Intel 80386|80386]] für diesen Zweck die Instruktion &amp;lt;code&amp;gt;bsf&amp;lt;/code&amp;gt; zur Verfügung. Unter Verwendung einer solchen Instruktion ist es möglich, zwei der drei Schleifen des Algorithmus einzusparen und damit seine Laufzeit signifikant zu verbessern. Die folgende Implementierung in der Programmiersprache [[C (Programmiersprache)|C]] nutzt zu diesem Zwecke die [[POSIX]]-Standardfunktion &amp;lt;code&amp;gt;ffs&amp;lt;/code&amp;gt; (find first set):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
#include &amp;lt;stdlib.h&amp;gt;  /* für abs() */&lt;br /&gt;
#include &amp;lt;strings.h&amp;gt; /* für ffs() */&lt;br /&gt;
&lt;br /&gt;
int ggt(int a, int b)&lt;br /&gt;
{&lt;br /&gt;
    int c;&lt;br /&gt;
&lt;br /&gt;
    if (a == 0 || b == 0) // falls eines oder beide Argumente 0 sind,&lt;br /&gt;
        return a | b; // ist das andere Argument oder 0 das Ergebnis&lt;br /&gt;
&lt;br /&gt;
    // dies kann weggelassen werden, wenn a und b nicht negativ sein können&lt;br /&gt;
    a = abs(a);&lt;br /&gt;
    b = abs(b);&lt;br /&gt;
&lt;br /&gt;
    c = ffs(a | b) - 1;&lt;br /&gt;
    a &amp;gt;&amp;gt;= ffs(a) - 1;&lt;br /&gt;
&lt;br /&gt;
    do {&lt;br /&gt;
        b &amp;gt;&amp;gt;= ffs(b) - 1;&lt;br /&gt;
        if (a &amp;gt; b) {&lt;br /&gt;
            // vertausche Variablen, damit bei Subtraktion kein Überlauf stattfinden kann&lt;br /&gt;
            int temp = b;&lt;br /&gt;
            b = a;&lt;br /&gt;
            a = temp;&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        b -= a;&lt;br /&gt;
    } while (b != 0);&lt;br /&gt;
&lt;br /&gt;
    return a &amp;lt;&amp;lt; c;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Eine Implementierung für vorzeichenlose Ganzzahlen in [[x86-Architektur|x86]]-[[Assemblersprache|Assembler]], die &amp;lt;code&amp;gt;bsf&amp;lt;/code&amp;gt; nutzt:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;nasm&amp;quot;&amp;gt;&lt;br /&gt;
ggt:&lt;br /&gt;
        mov     ecx, 4[esp]     ; Lade a&lt;br /&gt;
        mov     eax, 8[esp]     ; Lade b&lt;br /&gt;
        test    ecx, ecx        ; Vergleiche a mit 0:&lt;br /&gt;
        jz      done            ;  falls a gleich 0 ist das Ergebnis b&lt;br /&gt;
&lt;br /&gt;
        cmp     eax, ecx        ; Vergleiche a mit b:&lt;br /&gt;
        je      done            ;  falls a gleich b ist das Ergebnis b&lt;br /&gt;
&lt;br /&gt;
        mov     edx, eax        ; Lade b&lt;br /&gt;
        mov     eax, ecx        ; Lade a&lt;br /&gt;
        test    edx, edx        ; Vergleiche b mit 0:&lt;br /&gt;
        jz      done            ;  falls b gleich 0 ist das Ergebnis a&lt;br /&gt;
&lt;br /&gt;
        push    ebx&lt;br /&gt;
        bsf     ecx, edx        ; Bestimme größte Zweierpotenz von b&lt;br /&gt;
        bsf     ebx, eax        ; Bestimme größte Zweierpotenz von a&lt;br /&gt;
        cmp     ebx, ecx        ; Vergleiche beide&lt;br /&gt;
        cmova   ebx, ecx        ;  und merke deren Minimum&lt;br /&gt;
        shr     edx, cl         ; Dividiere b durch größte Zweierpotenz&lt;br /&gt;
next:&lt;br /&gt;
        bsf     ecx, eax        ; Bestimme größte Zweierpotenz von a&lt;br /&gt;
        shr     eax, cl         ; Dividiere a durch größte Zweierpotenz&lt;br /&gt;
        mov     ecx, edx&lt;br /&gt;
        cmp     edx, eax        ; Vergleiche b mit a&lt;br /&gt;
        cmovb   edx, eax        ;  und vertausche beide, falls b kleiner a&lt;br /&gt;
        cmovb   eax, ecx&lt;br /&gt;
        sub     edx, eax        ; Subtrahiere a von b&lt;br /&gt;
        jnz     next            ;  und wiederhole, bis b gleich 0&lt;br /&gt;
&lt;br /&gt;
        mov     ecx, ebx&lt;br /&gt;
        shl     eax, cl         ; Multipliziere a mit 2**Minimum&lt;br /&gt;
        pop     ebx&lt;br /&gt;
done:&lt;br /&gt;
        ret&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Quellen ==&lt;br /&gt;
&amp;lt;references /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:Zahlentheoretischer Algorithmus]]&lt;/div&gt;</summary>
		<author><name>~2025-34586-1</name></author>
	</entry>
</feed>