<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="de">
	<id>https://wiki-de.moshellshocker.dns64.de/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=84.119.16.74</id>
	<title>Wikipedia (Deutsch) – Lokale Kopie - Benutzerbeiträge [de]</title>
	<link rel="self" type="application/atom+xml" href="https://wiki-de.moshellshocker.dns64.de/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=84.119.16.74"/>
	<link rel="alternate" type="text/html" href="https://wiki-de.moshellshocker.dns64.de/index.php/Spezial:Beitr%C3%A4ge/84.119.16.74"/>
	<updated>2026-06-22T09:39:28Z</updated>
	<subtitle>Benutzerbeiträge</subtitle>
	<generator>MediaWiki 1.43.8</generator>
	<entry>
		<id>https://wiki-de.moshellshocker.dns64.de/index.php?title=Bin%C3%A4re_Exponentiation&amp;diff=375263</id>
		<title>Binäre Exponentiation</title>
		<link rel="alternate" type="text/html" href="https://wiki-de.moshellshocker.dns64.de/index.php?title=Bin%C3%A4re_Exponentiation&amp;diff=375263"/>
		<updated>2024-04-22T08:09:12Z</updated>

		<summary type="html">&lt;p&gt;84.119.16.74: Jetzt kann der Exponent eine beliebige vorzeichenbehaftete Ganzzahl sein.&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Die &#039;&#039;&#039;binäre Exponentiation&#039;&#039;&#039; (auch &#039;&#039;&#039;Square-and-Multiply&#039;&#039;&#039; genannt) ist eine effiziente Methode zur Berechnung von [[Natürliche Zahl|natürlichen]] [[Potenz (Mathematik)|Potenzen]], also Ausdrücken der Form &amp;lt;math&amp;gt;x^k&amp;lt;/math&amp;gt; mit einer natürlichen Zahl &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Dieser [[Algorithmus]] wurde bereits um ca. 200 v. Chr. in [[Indien]] entdeckt und ist in einem Werk namens &#039;&#039;Chandah-sûtra&#039;&#039; niedergeschrieben.&lt;br /&gt;
&lt;br /&gt;
== Motivation ==&lt;br /&gt;
&lt;br /&gt;
Um &amp;lt;math&amp;gt;z = x^4&amp;lt;/math&amp;gt; zu berechnen, kann man entweder &amp;lt;math&amp;gt;z = x \cdot x \cdot x \cdot x&amp;lt;/math&amp;gt; ausrechnen (drei Multiplikationen) oder &amp;lt;math&amp;gt;y = x \cdot x&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;z = y \cdot y&amp;lt;/math&amp;gt; (zwei Multiplikationen), also &amp;lt;math&amp;gt;z = (x^2)^2&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Ebenso können auch andere ganzzahlige Potenzen durch „fortgesetztes Quadrieren und gelegentliches Multiplizieren“ effizient berechnet werden.&lt;br /&gt;
&lt;br /&gt;
Dieses Einsparen von Multiplikationen funktioniert sowohl für [[reelle Zahl]]en als auch für [[Matrix (Mathematik)#Matrizenmultiplikation|reellwertige Matrizen]], [[elliptische Kurve]]n und beliebige andere [[Halbgruppe]]n.&lt;br /&gt;
&lt;br /&gt;
== Algorithmus ==&lt;br /&gt;
&lt;br /&gt;
* Umwandlung des Exponenten &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; in die zugehörige [[Dualsystem|Binärdarstellung]].&lt;br /&gt;
* Ersetzen jeder &#039;&#039;&#039;0&#039;&#039;&#039; durch &#039;&#039;&#039;Q&#039;&#039;&#039; und jeder &#039;&#039;&#039;1&#039;&#039;&#039; durch &#039;&#039;&#039;QM.&#039;&#039;&#039;&lt;br /&gt;
* Nun wird &#039;&#039;&#039;Q&#039;&#039;&#039; als Anweisung zum [[Quadrat (Arithmetik)|Quadrieren]] und &#039;&#039;&#039;M&#039;&#039;&#039; als Anweisung zum [[Multiplikation|Multiplizieren]] aufgefasst.&lt;br /&gt;
* Somit bildet die resultierende [[Zeichenkette]] von links nach rechts gelesen eine Vorschrift zur Berechnung von &amp;lt;math&amp;gt;x^k&amp;lt;/math&amp;gt;. Man beginne mit 1, quadriere für jedes gelesene &#039;&#039;&#039;Q&#039;&#039;&#039; das bisherige Zwischenergebnis und multipliziere es für jedes gelesene &#039;&#039;&#039;M&#039;&#039;&#039; mit &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Da die Binärdarstellung von &amp;lt;math&amp;gt;k&amp;gt;0&amp;lt;/math&amp;gt; immer mit der Ziffer 1 beginnt – und so ebenfalls die Anweisung mit &#039;&#039;&#039;QM&#039;&#039;&#039; beginnt –, ergibt sich für die erste Anweisung &#039;&#039;&#039;QM&#039;&#039;&#039; in jedem Fall das Zwischenergebnis &amp;lt;math&amp;gt;1^2 \cdot x=x&amp;lt;/math&amp;gt;. Aus diesem Grund ergibt sich eine leicht vereinfachte Variante, bei der die erste Anweisung &#039;&#039;&#039;QM&#039;&#039;&#039; durch &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; ersetzt wird.&lt;br /&gt;
&lt;br /&gt;
=== Beispiel (Algorithmus) ===&lt;br /&gt;
&lt;br /&gt;
Sei k = 23. Die Binärdarstellung von 23 lautet &#039;&#039;10111&#039;&#039;. Daraus ergibt sich nach den Ersetzungen &#039;&#039;QM Q QM QM QM&#039;&#039;. Nach dem Streichen des führenden &#039;&#039;QM&#039;&#039;-Paares hat man &#039;&#039;Q QM QM QM&#039;&#039;. Daraus können wir nun ablesen, dass der Rechenvorgang folgendermaßen auszusehen hat: „quadriere, quadriere, multipliziere mit &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt;, quadriere, multipliziere mit &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt;, quadriere, multipliziere mit &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt;“.&lt;br /&gt;
&lt;br /&gt;
Formal sieht das Ganze so aus:&lt;br /&gt;
&amp;lt;math&amp;gt;\left( \left( (x^2)^2 \cdot x \right)^2  \cdot x \right)^2  \cdot x &amp;lt;/math&amp;gt; bzw. sukzessive geschrieben:&lt;br /&gt;
: &amp;lt;math&amp;gt;&lt;br /&gt;
x      \;\stackrel{\mathrm Q}\longrightarrow\;&lt;br /&gt;
x^2    \;\stackrel{\mathrm Q}\longrightarrow\;&lt;br /&gt;
x^4    \;\stackrel{\cdot x}  \longrightarrow\;&lt;br /&gt;
x^5    \;\stackrel{\mathrm Q}\longrightarrow\;&lt;br /&gt;
x^{10} \;\stackrel{\cdot x}  \longrightarrow\;&lt;br /&gt;
x^{11} \;\stackrel{\mathrm Q}\longrightarrow\;&lt;br /&gt;
x^{22} \;\stackrel{\cdot x}\longrightarrow\;&lt;br /&gt;
x^{23}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Man sieht am Beispiel, dass man sich mit Hilfe der binären Exponentiation einige Rechenschritte sparen kann.&lt;br /&gt;
Anstatt von 22 Multiplikationen werden nur noch 7 benötigt, indem man viermal quadriert und dreimal mit &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; multipliziert.&lt;br /&gt;
&lt;br /&gt;
=== Pseudocode (Algorithmus) ===&lt;br /&gt;
&lt;br /&gt;
Der Algorithmus ist in zwei Varianten dargestellt. Variante 1 verwendet eine if-Bedingung, um an den entsprechenden Stellen zu multiplizieren. Variante 2 baut die if-Bedingung implizit in den arithmetischen Ausdruck ein.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable toptextcells&amp;quot;&lt;br /&gt;
|- class=&amp;quot;hintergrundfarbe5&amp;quot;&lt;br /&gt;
! Variante 1&lt;br /&gt;
! Variante 2&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
&amp;lt;pre style=&amp;quot;border:none;&amp;quot;&amp;gt;&lt;br /&gt;
// Berechnet x^k&lt;br /&gt;
// b   ... binäre Darstellung von k&lt;br /&gt;
// res ... Resultat der Berechnung&lt;br /&gt;
&lt;br /&gt;
function bin_exp(x,b)&lt;br /&gt;
  res = 1&lt;br /&gt;
  for i = n..0&lt;br /&gt;
    res = res^2&lt;br /&gt;
    if b_i == 1&lt;br /&gt;
      res = res * x&lt;br /&gt;
    end-if&lt;br /&gt;
  end-for&lt;br /&gt;
  return res&lt;br /&gt;
end-function&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
&amp;lt;pre style=&amp;quot;border:none;&amp;quot;&amp;gt;&lt;br /&gt;
// Berechnet x^k&lt;br /&gt;
// b   ... binäre Darstellung von k&lt;br /&gt;
// res ... Resultat der Berechnung&lt;br /&gt;
&lt;br /&gt;
function bin_exp(x,b)&lt;br /&gt;
  res = 1&lt;br /&gt;
  for i = n..0&lt;br /&gt;
    res = res^2 * x^{b_i}&lt;br /&gt;
  end-for&lt;br /&gt;
  return res&lt;br /&gt;
end-function&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Alternativer Algorithmus ==&lt;br /&gt;
&lt;br /&gt;
Man kann das Verfahren für eine Berechnung von Hand auch so gestalten, dass man zunächst die Basis oft genug quadriert und anschließend die richtigen Zahlen miteinander multipliziert. Dann ähnelt es der [[Russische Bauernmultiplikation|Russischen Bauernmultiplikation]], welche die Multiplikation zweier Zahlen auf das Halbieren, Verdoppeln und Addieren von Zahlen zurückführt.&lt;br /&gt;
&lt;br /&gt;
Dazu schreibt man den Exponenten links und die Basis rechts. Der Exponent wird schrittweise halbiert (das Ergebnis wird abgerundet) und die Basis schrittweise [[Quadratzahl|quadriert]]. Man streicht die Zeilen mit geradem Exponenten. Das Produkt der nichtgestrichenen rechten Zahlen ist die gesuchte Potenz.&lt;br /&gt;
&lt;br /&gt;
=== Beispiel (alternativer Algorithmus) ===&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|colspan=&amp;quot;2&amp;quot; style=&amp;quot;text-align:center&amp;quot;| 2&amp;lt;sup&amp;gt;18&amp;lt;/sup&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|18&lt;br /&gt;
|&amp;lt;s&amp;gt;2&amp;lt;/s&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|9&lt;br /&gt;
|&#039;&#039;&#039;4&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
|4&lt;br /&gt;
|&amp;lt;s&amp;gt;16&amp;lt;/s&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|2&lt;br /&gt;
|&amp;lt;s&amp;gt;256&amp;lt;/s&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|1&lt;br /&gt;
|&#039;&#039;&#039;65.536&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
|Ergebnis&lt;br /&gt;
|262.144 (= &#039;&#039;&#039;4 · 65.536&#039;&#039;&#039;)&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Pseudocode (alternativer Algorithmus) ===&lt;br /&gt;
&lt;br /&gt;
Anders als bei dem vorherigen Ansatz werden hier die benötigten Potenzen von &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; direkt aufmultipliziert. Diese Variante bietet sich an, wenn der Exponent &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; nicht explizit in Binärdarstellung vorliegt. Zur Veranschaulichung kann die Gleichheit &amp;lt;math&amp;gt;x^{23} = x^{16}\cdot x^4 \cdot x^2 \cdot x&amp;lt;/math&amp;gt; betrachtet werden.&lt;br /&gt;
&lt;br /&gt;
Bestimmt werden soll &amp;lt;math&amp;gt;x^k&amp;lt;/math&amp;gt;, ohne &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; in Binärdarstellung vorliegen zu haben.&lt;br /&gt;
{|&lt;br /&gt;
!width=&amp;quot;50%&amp;quot; align=&amp;quot;center&amp;quot;|Binäre Exponentiation&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
  // Berechnet x^k&lt;br /&gt;
  // res … Resultat der Berechnung&lt;br /&gt;
&lt;br /&gt;
  function res = bin_exp(x,k)&lt;br /&gt;
    res = 1&lt;br /&gt;
    while k &amp;gt; 0&lt;br /&gt;
      if k mod 2 == 1&lt;br /&gt;
        res = res * x&lt;br /&gt;
      end-if&lt;br /&gt;
      x = x^2&lt;br /&gt;
      k = k DIV 2 //Ganzzahlige Division (das Ergebnis wird abgerundet)&lt;br /&gt;
    end-while&lt;br /&gt;
    return res&lt;br /&gt;
  end-function&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Rekursiver Algorithmus mit Herleitung ==&lt;br /&gt;
&lt;br /&gt;
Jede natürliche Zahl &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; lässt sich eindeutig in &amp;lt;math&amp;gt;n = 2m+b&amp;lt;/math&amp;gt; zerlegen, wobei &amp;lt;math&amp;gt;b\in\{0,1\}&amp;lt;/math&amp;gt;. Aufgrund der Potenzgesetze ergibt sich&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;\begin{align}&lt;br /&gt;
a^n &amp;amp;= a^{2m+b} \\&lt;br /&gt;
    &amp;amp;= (a^m)^2a^b.&lt;br /&gt;
\end{align}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Der letzte Ausdruck beinhaltet lediglich&lt;br /&gt;
* eine Potenzierung mit einem Exponenten &amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt;, der nur noch etwa halb so groß wie &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; ist, welche rekursiv mit demselben Algorithmus berechnet werden kann,&lt;br /&gt;
* eine Quadrierung,&lt;br /&gt;
* eine Multiplikation,&lt;br /&gt;
* eine Potenzierung mit 0 oder 1 als Exponent.&lt;br /&gt;
&lt;br /&gt;
Eine direkte Implementation in [[Haskell (Programmiersprache)|Haskell]] sähe wie folgt aus:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Haskell&amp;quot;&amp;gt;&lt;br /&gt;
    a^0 = 1&lt;br /&gt;
    a^1 = a&lt;br /&gt;
    a^2 = a*a&lt;br /&gt;
    a^n = (a^m)^2 * a^b where (m, b) = n `divMod` 2&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Die Funktion &amp;lt;code&amp;gt;^&amp;lt;/code&amp;gt;, die hier definiert wird, stützt sich also auf ein vorhandenes &amp;lt;code&amp;gt;*&amp;lt;/code&amp;gt; für die Multiplikation, [[Divmod|&amp;lt;code&amp;gt;divMod&amp;lt;/code&amp;gt;]] für die Abspaltung der untersten Binärstelle des Exponenten und, rekursiv, sich selbst.&lt;br /&gt;
&lt;br /&gt;
Geringfügige Optimierungen, wie etwa die Umwandlung in eine [[Endrekursion|endrekursive]] Variante, führen im Wesentlichen zu oben genannten iterativen Algorithmen.&lt;br /&gt;
&lt;br /&gt;
== Binäre Modulo-Exponentiation ==&lt;br /&gt;
&lt;br /&gt;
Beim Rechnen [[Kongruenz (Zahlentheorie)|modulo]] einer natürlichen Zahl ist eine leichte Modifikation anwendbar, die verhindert, dass die berechneten Zahlen zu groß werden: Man bildet nach jedem Quadrieren und Multiplizieren den Rest. Die zuvor vorgestellten Algorithmen können leicht durch diese Moduloperationen erweitert werden.&lt;br /&gt;
Dieses Verfahren wird beispielsweise bei [[RSA-Kryptosystem|RSA-Verschlüsselung]] angewendet.&lt;br /&gt;
&lt;br /&gt;
=== Beispiel ===&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|colspan=&amp;quot;2&amp;quot; style=&amp;quot;text-align:center&amp;quot;| 2&amp;lt;sup&amp;gt;18&amp;lt;/sup&amp;gt; mod 39&lt;br /&gt;
|-&lt;br /&gt;
|18&lt;br /&gt;
|&amp;lt;s&amp;gt;2&amp;lt;/s&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|9&lt;br /&gt;
|&#039;&#039;&#039;4&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
|4&lt;br /&gt;
|&amp;lt;s&amp;gt;16&amp;lt;/s&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|2&lt;br /&gt;
|&amp;lt;s&amp;gt;22&amp;lt;/s&amp;gt; (= 256 mod 39)&lt;br /&gt;
|-&lt;br /&gt;
|1&lt;br /&gt;
|&#039;&#039;&#039;16&#039;&#039;&#039; (= 484 mod 39)&lt;br /&gt;
|-&lt;br /&gt;
|Ergebnis&lt;br /&gt;
|25 (= &#039;&#039;&#039;4 · 16&#039;&#039;&#039; mod 39 = 2&amp;lt;sup&amp;gt;18&amp;lt;/sup&amp;gt; mod 39)&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Laufzeitanalyse ==&lt;br /&gt;
&lt;br /&gt;
Bei der einfachen und langsamen [[Potenz (Mathematik)|Potenzierung]] von &amp;lt;math&amp;gt;x^k&amp;lt;/math&amp;gt; werden &amp;lt;math&amp;gt;(k-1)&amp;lt;/math&amp;gt; Multiplikationen benötigt. Bei der binären Exponentiation wird die Schleife lediglich &amp;lt;math&amp;gt;\log_2(k)&amp;lt;/math&amp;gt;-mal durchlaufen (&amp;lt;math&amp;gt;\log_2(k)&amp;lt;/math&amp;gt; entspricht hierbei ungefähr der Länge der Zahl &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; in der Binärdarstellung). In jedem Schleifendurchlauf kommt es zu einer Quadrierung (wobei die erste Quadrierung vernachlässigt werden kann) und eventuell einer Multiplikation. Asymptotisch werden &amp;lt;math&amp;gt;O(\log(k))&amp;lt;/math&amp;gt; Operationen (eventuell Langzahloperationen) benötigt, wogegen &amp;lt;math&amp;gt;O(k)&amp;lt;/math&amp;gt; Operationen bei der einfachen Potenzierung zu Buche schlagen. &amp;lt;math&amp;gt;O&amp;lt;/math&amp;gt; bezeichnet eine [[Landau-Symbol|asymptotische obere Schranke]] für das Laufzeitverhalten des Algorithmus. Wie man leicht einsieht, ist die binäre Exponentiation sehr viel [[Effizienz (Informatik)|effizienter]] als das einfache Verfahren. Dieser verringerte Anspruch an die [[Rechenleistung]] ist bei großen Basen und Exponenten enorm.&lt;br /&gt;
&lt;br /&gt;
== Ähnliche Algorithmen ==&lt;br /&gt;
&lt;br /&gt;
Die binäre Exponentiation muss nicht notwendig die multiplikationssparendste Berechnungsart einer Potenz sein. Um beispielsweise &amp;lt;math&amp;gt;z = x^{15}&amp;lt;/math&amp;gt; zu berechnen, kann man entweder gemäß binärer Exponentiation&lt;br /&gt;
:&amp;lt;math&amp;gt;z = \left( \left((x^2 \cdot x)^2 \cdot x \right)^2 \cdot x \right)&amp;lt;/math&amp;gt;&lt;br /&gt;
berechnen (6 Multiplikationen), oder aber&lt;br /&gt;
:&amp;lt;math&amp;gt;z = y^3 = y \cdot y^2&amp;lt;/math&amp;gt; mit &amp;lt;math&amp;gt;y = x^5 = x \cdot (x^2)^2&amp;lt;/math&amp;gt;&lt;br /&gt;
(insgesamt 5 Multiplikationen). Übersichtlicher schreibt man das, indem man nur die Folge der Exponenten der berechneten Potenzen aufschreibt, hier 1, 2, 4, 5, 10, 15, wobei jede der Zahlen Summe zweier vorangehender Zahlen der Folge ist; solche Folgen heißen [[Additionskette]]n. Ein Beispiel mit größerer Ersparnis ist der Exponent 367, für den man nacheinander die Potenzen mit den Exponenten 1, 2, 3, 5, 10, 20, 23, 43, 86, 172, 344, 367 berechnet, wobei die relativ aufwendig berechnete 23.&amp;amp;nbsp;Potenz zweimal verwendet wird: unmittelbar danach und ganz am Schluss. Dadurch werden gegenüber der binären Exponentiation drei Multiplikationen eingespart (11 statt 14).&lt;br /&gt;
&lt;br /&gt;
Trotzdem ist in vielen Fällen die binäre Exponentiation das optimale Verfahren, weil die Berechnung der günstigsten Reihenfolge (also der kürzesten Additionskette) meist sehr viel aufwendiger ist als die Multiplikationen selbst, von denen man einige einspart. Anders ist es nur, wenn die Multiplikationen selbst sehr aufwendig sind (z. B. sehr große [[Matrix (Mathematik)|Matrizen]]) oder wenn viele Basen mit demselben Exponenten potenziert werden sollen.&lt;br /&gt;
&lt;br /&gt;
== Implementierung in C++ ==&lt;br /&gt;
&lt;br /&gt;
Es wird  &amp;lt;math&amp;gt;0^0 := 1&amp;lt;/math&amp;gt; verwendet, wie in der Funktion &amp;lt;code&amp;gt;pow&amp;lt;/code&amp;gt; aus der [[Standard Template Library|STL]]. Statt &amp;lt;code&amp;gt;int&amp;lt;/code&amp;gt; kann jeder &#039;&#039;vorzeichenbehaftete&#039;&#039; ganzzahlige Datentyp verwendet werden, falls nötig. Zur Vereinfachung der Darstellung fehlt eine Überprüfung auf Overflow und Underflow. Für negative Exponenten werden die Zwischenschritte positiv exponentiert und das Gesamtergebnis dann reziprok genommen, was eine höhere Präzision und bessere Performance ergibt.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c++&amp;quot;&amp;gt;&lt;br /&gt;
// b: basis&lt;br /&gt;
// e: Exponent&lt;br /&gt;
template&amp;lt;std::floating_point Fp, std::signed_integral Int&amp;gt;&lt;br /&gt;
Fp bin_exp( Fp b, Int e )&lt;br /&gt;
{&lt;br /&gt;
	Fp result = 1.0;&lt;br /&gt;
	make_unsigned_t&amp;lt;Int&amp;gt; uE = e &amp;gt;= 0 ? e : -e;&lt;br /&gt;
	auto next = [&amp;amp;] { uE &amp;gt;&amp;gt;= 1, b *= b; };&lt;br /&gt;
	for( ; uE; next() )&lt;br /&gt;
	{&lt;br /&gt;
		for( ; !(uE % 2); next() );&lt;br /&gt;
		result *= b;&lt;br /&gt;
	}&lt;br /&gt;
	return e &amp;gt;= 0 ? result : 1.0 / result;&lt;br /&gt;
}&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Literatur ==&lt;br /&gt;
&lt;br /&gt;
* [[Donald E. Knuth]]: &#039;&#039;[[The Art of Computer Programming]].&#039;&#039; Vol 2. Addison-Wesley, 1998 (Section 4.6.3, S. 461).&lt;br /&gt;
* Jörg Arndt, Christoph Haenel: &#039;&#039;Pi. Algorithmen, Computer, Arithmetik.&#039;&#039; 2. Auflage. Springer, Berlin 2000, ISBN 3-540-66258-8, S. 120–121.&lt;br /&gt;
&lt;br /&gt;
{{SORTIERUNG:Binare Exponentiation}}&lt;br /&gt;
[[Kategorie:Potenz (Mathematik)]]&lt;br /&gt;
[[Kategorie:Computerarithmetik]]&lt;br /&gt;
[[Kategorie:Zahlentheoretischer Algorithmus]]&lt;/div&gt;</summary>
		<author><name>84.119.16.74</name></author>
	</entry>
</feed>