<?xml version="1.0" encoding="UTF-8"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom" version="2.0"><channel><title><![CDATA[C++ RSA Verschlüsselung &#x2F; &amp;quot;Fortgesetztes Quadrieren&amp;quot; &#x2F; Riesige Zahlen]]></title><description><![CDATA[<p>Guten Tag zusammen,</p>
<p>in letzter Zeit beschäftige ich mich mit diesem (übrigens gut erklärten)<br />
Artikel: <a href="https://www.mathematik.de/ger/information/wasistmathematik/rsa/rsa.html" rel="nofollow">https://www.mathematik.de/ger/information/wasistmathematik/rsa/rsa.html</a><br />
und versuche die dort gezeigten Rechenschritte in C++ umzusetzen...<br />
Die Erzeugung einer beliebigen Primzahl funktioniert, auch die im Artikel<br />
beschriebenen Variablen e und d konnte ich erzeugen / bestimmen, allerdings bin<br />
ich jetzt an dem Punkt, das ich jetzt mit Potenzen rechnen muss wie z.B.<br />
82^29 mod 91 (aus dem Rechenbeispiel des Artikels). Es ist natürlich klar, dass dabei<br />
sehr große Zahlen herauskommen, zumindest bevor man &quot;modulo 91&quot; rechnet, daher wird<br />
in einem weiteren Artikel das &quot;fortgesetze Quadrieren&quot; beschrieben:<br />
<a href="https://www.mathematik.de/ger/information/wasistmathematik/rsa/rsa_potenzen.html" rel="nofollow">https://www.mathematik.de/ger/information/wasistmathematik/rsa/rsa_potenzen.html</a><br />
Das hab ich jetzt auch in einer Funktion umgesetzt die so aussieht:</p>
<pre><code>int pow_ex(int base, int expo, int ex_mod)               //basis, exponent, modulo &quot;Faktor&quot;
{
	int counter = 1, bin = 2, power;
	for (;;){                                        //in Endlosschleife 2er Potenzen ausrechnen bis eine gefunden wurde die kleiner als &quot;int expo&quot; ist
		bin *= 2;
		if (bin &lt; expo){
			counter++;
		}
		else{
			break;
		}
	}
	bin /= 2;
	power = pow(base, 2);                              // ab hier fortgesetztes Quadrieren
	power %= ex_mod;
	for (int i = 1; i &lt; counter; i++){
		power = pow(power, 2);
		power %= ex_mod;
	}
	for (int x = 0; x &lt; expo - bin; x++){             //Problem !!! in dieser Schleife enstehen unter Umständen riesige Zahlen, da
                                                          // die Zahlen, welche nicht durch die 2er Potenzen gedeckt wurden hinten angehängt werden
		power *= base;                            //z.B. bei 82^29 muss man (29-16) 13 mal die basis mit dem ganzen davor mulitiplizieren
	}                                                 //und bei 82^13 kommt eine Zahl mit locker über 15 Ziffern heraus, welche natürlich nicht
                                                          //in ein integer passt (ich bekomme dann immer negative Zahlen, was ja gar nicht sein kann)
	power %= ex_mod;                                 
	return power;
}
</code></pre>
<p>Nun brauche ich entweder eine Lösung, wie ich die Zahlen klein halten, was das fortgesetze Quadrieren ja eigentlich schon macht, aber eben nicht klein genug, oder einen Datentyp der riesige Zahlen speichern kann, allerdings wäre ich damit nicht so zufrieden (die BigInt Bibliothek wäre ja theoretisch eine Möglichkeit). Oder gibt es noch einen komplett anderen Lösungsweg den ich übersehen habe?</p>
<p>Vielen Dank für jegliche Hilfe im Vorraus</p>
<p>Gruß</p>
<p>Cyax</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/331204/c-rsa-verschlüsselung-quot-fortgesetztes-quadrieren-quot-riesige-zahlen</link><generator>RSS for Node</generator><lastBuildDate>Fri, 01 May 2026 19:16:18 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/331204.rss" rel="self" type="application/rss+xml"/><pubDate>Mon, 16 Feb 2015 15:39:40 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to C++ RSA Verschlüsselung &#x2F; &amp;quot;Fortgesetztes Quadrieren&amp;quot; &#x2F; Riesige Zahlen on Mon, 16 Feb 2015 15:39:40 GMT]]></title><description><![CDATA[<p>Guten Tag zusammen,</p>
<p>in letzter Zeit beschäftige ich mich mit diesem (übrigens gut erklärten)<br />
Artikel: <a href="https://www.mathematik.de/ger/information/wasistmathematik/rsa/rsa.html" rel="nofollow">https://www.mathematik.de/ger/information/wasistmathematik/rsa/rsa.html</a><br />
und versuche die dort gezeigten Rechenschritte in C++ umzusetzen...<br />
Die Erzeugung einer beliebigen Primzahl funktioniert, auch die im Artikel<br />
beschriebenen Variablen e und d konnte ich erzeugen / bestimmen, allerdings bin<br />
ich jetzt an dem Punkt, das ich jetzt mit Potenzen rechnen muss wie z.B.<br />
82^29 mod 91 (aus dem Rechenbeispiel des Artikels). Es ist natürlich klar, dass dabei<br />
sehr große Zahlen herauskommen, zumindest bevor man &quot;modulo 91&quot; rechnet, daher wird<br />
in einem weiteren Artikel das &quot;fortgesetze Quadrieren&quot; beschrieben:<br />
<a href="https://www.mathematik.de/ger/information/wasistmathematik/rsa/rsa_potenzen.html" rel="nofollow">https://www.mathematik.de/ger/information/wasistmathematik/rsa/rsa_potenzen.html</a><br />
Das hab ich jetzt auch in einer Funktion umgesetzt die so aussieht:</p>
<pre><code>int pow_ex(int base, int expo, int ex_mod)               //basis, exponent, modulo &quot;Faktor&quot;
{
	int counter = 1, bin = 2, power;
	for (;;){                                        //in Endlosschleife 2er Potenzen ausrechnen bis eine gefunden wurde die kleiner als &quot;int expo&quot; ist
		bin *= 2;
		if (bin &lt; expo){
			counter++;
		}
		else{
			break;
		}
	}
	bin /= 2;
	power = pow(base, 2);                              // ab hier fortgesetztes Quadrieren
	power %= ex_mod;
	for (int i = 1; i &lt; counter; i++){
		power = pow(power, 2);
		power %= ex_mod;
	}
	for (int x = 0; x &lt; expo - bin; x++){             //Problem !!! in dieser Schleife enstehen unter Umständen riesige Zahlen, da
                                                          // die Zahlen, welche nicht durch die 2er Potenzen gedeckt wurden hinten angehängt werden
		power *= base;                            //z.B. bei 82^29 muss man (29-16) 13 mal die basis mit dem ganzen davor mulitiplizieren
	}                                                 //und bei 82^13 kommt eine Zahl mit locker über 15 Ziffern heraus, welche natürlich nicht
                                                          //in ein integer passt (ich bekomme dann immer negative Zahlen, was ja gar nicht sein kann)
	power %= ex_mod;                                 
	return power;
}
</code></pre>
<p>Nun brauche ich entweder eine Lösung, wie ich die Zahlen klein halten, was das fortgesetze Quadrieren ja eigentlich schon macht, aber eben nicht klein genug, oder einen Datentyp der riesige Zahlen speichern kann, allerdings wäre ich damit nicht so zufrieden (die BigInt Bibliothek wäre ja theoretisch eine Möglichkeit). Oder gibt es noch einen komplett anderen Lösungsweg den ich übersehen habe?</p>
<p>Vielen Dank für jegliche Hilfe im Vorraus</p>
<p>Gruß</p>
<p>Cyax</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2442981</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2442981</guid><dc:creator><![CDATA[Cyax]]></dc:creator><pubDate>Mon, 16 Feb 2015 15:39:40 GMT</pubDate></item><item><title><![CDATA[Reply to C++ RSA Verschlüsselung &#x2F; &amp;quot;Fortgesetztes Quadrieren&amp;quot; &#x2F; Riesige Zahlen on Mon, 16 Feb 2015 15:59:40 GMT]]></title><description><![CDATA[<p>Ohne BigInt geht da nichts. RSA/ElGamal/etc. sind erst für sehr große Schlüssel sicher (also ints mit mehr als 512 Bit). Und eine effiziente BigInt-Klasse hat es in sich, denn du musst z.B. effiziente Multiplikationsverfahren (z.B. Karatsuba) implementieren. Auch das Auffinden von Primzahlen mit BigInts ist alles andere als einfach in diesen Dimensionen; meist beschränkt man sich auf Pseudoprimzahlen, für welche du Tests wie den von Miller-Rabin implementieren kannst.<br />
In der Regel wird ModExp eine der teuren Operationen sein, die du auf einem BigInt ausführst.</p>
<p>Fakt ist: kleine Zahlen gibt es in der Kryptografie eher nicht so.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2442984</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2442984</guid><dc:creator><![CDATA[Jodocus]]></dc:creator><pubDate>Mon, 16 Feb 2015 15:59:40 GMT</pubDate></item><item><title><![CDATA[Reply to C++ RSA Verschlüsselung &#x2F; &amp;quot;Fortgesetztes Quadrieren&amp;quot; &#x2F; Riesige Zahlen on Mon, 16 Feb 2015 16:06:52 GMT]]></title><description><![CDATA[<p>Ich denke wenn du auch längere Schlüssel ermöglichen möchtest, wie sie auch in RSA-Implementierungen für den produktiven Einsatz verwendet werden, kommst du nicht umhin eine BigInt-Bibliothek zu verwenden, da dann dein Exponent und der Modulus schonmal ein paar tausend Bits lang sein können.</p>
<p>Was deinen Algorithmus betrifft, den habe ich mir jetzt nicht genau angesehen, im englischen Wikipedia-Artikel zu dem Thema sind allerdings 2 Algorithmen, die fortgesetztes Quadrieren nutzen, in Pseudocode angegeben:</p>
<p><a href="http://en.wikipedia.org/wiki/Modular_exponentiation" rel="nofollow">http://en.wikipedia.org/wiki/Modular_exponentiation</a></p>
<p>Vielleicht lässt du dich davon inspirieren und verbesserst deine Variante entsprechend.<br />
Auf den ersten Blick fällt mir z.B. bei dir auf, dass du die <code>pow()</code> -Funktion verwendest. Falls es sich dabei um <code>std::pow()</code> handelt, tut es sicherlich nicht das was du möchtest:<br />
Soweit ich weiss ist <code>std::pow()</code> nur für Floating Point definiert, bzw. führt einen impliziten Cast in einen Floating-Point-Wert durch.</p>
<p>Finnegan</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2442986</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2442986</guid><dc:creator><![CDATA[Finnegan]]></dc:creator><pubDate>Mon, 16 Feb 2015 16:06:52 GMT</pubDate></item><item><title><![CDATA[Reply to C++ RSA Verschlüsselung &#x2F; &amp;quot;Fortgesetztes Quadrieren&amp;quot; &#x2F; Riesige Zahlen on Tue, 17 Feb 2015 11:59:32 GMT]]></title><description><![CDATA[<p>Dein Problem lässt sich lösen, wenn Du in Zeile 22 schreibst:</p>
<pre><code>(power *= base) %= ex_mod;
</code></pre>
<p>Dann bekommst Du keinen integer overflow solange <code>ex_mod^2 &lt; numeric_limits&lt; int &gt;::max()</code> ist. Und die 91 ist da weit von entfernt.</p>
<p>Abgesehen davon erscheint mir Dein Algorithmus etwas umständlich .. wie wär's mit:</p>
<pre><code>int pow_ex( int base, int expo, int ex_mod )
{
    assert( expo &gt;= 0 );
    assert( base &gt;= 0 );
    assert( ex_mod &gt; 0 );
    assert( ex_mod &lt;= std::numeric_limits&lt; int &gt;::max() / ex_mod );  // so kann es nie einen integer overflow geben

    base %= ex_mod;
    int result = 1;
    for( ; expo &gt; 0; (base *= base) %= ex_mod, expo &gt;&gt;= 1 )
        if( expo &amp; 1 )
            (result *= base) %= ex_mod;
    return result;
}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/2443092</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2443092</guid><dc:creator><![CDATA[Werner Salomon]]></dc:creator><pubDate>Tue, 17 Feb 2015 11:59:32 GMT</pubDate></item><item><title><![CDATA[Reply to C++ RSA Verschlüsselung &#x2F; &amp;quot;Fortgesetztes Quadrieren&amp;quot; &#x2F; Riesige Zahlen on Tue, 17 Feb 2015 12:26:45 GMT]]></title><description><![CDATA[<pre><code>assert( ex_mod &lt;= std::numeric_limits&lt; int &gt;::max() / ex_mod );  // so kann es nie einen integer overflow geben
</code></pre>
<p>lol</p>
<pre><code>uint64_t mulmod(uint64_t a, uint64_t b, uint64_t m)
{
	uint64_t r;
	asm
	( &quot;mulq %2; divq %3&quot;
	: &quot;=&amp;d&quot; (r), &quot;+%a&quot; (a)
	: &quot;rm&quot;  (b), &quot;rm&quot;  (m)
	: &quot;cc&quot;
	);
	return r;
}

uint64_t powmod( uint64_t x, uint64_t exp, uint64_t mod )
{
	uint64_t res = 1;

	for (; exp; exp &gt;&gt;= 1)
	{
		if (exp&amp;1)
			res = mulmod(res, x, mod);

		x = mulmod(x, x, mod);
	}

	return res;
}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/2443097</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2443097</guid><dc:creator><![CDATA[Columbo]]></dc:creator><pubDate>Tue, 17 Feb 2015 12:26:45 GMT</pubDate></item><item><title><![CDATA[Reply to C++ RSA Verschlüsselung &#x2F; &amp;quot;Fortgesetztes Quadrieren&amp;quot; &#x2F; Riesige Zahlen on Tue, 17 Feb 2015 12:23:20 GMT]]></title><description><![CDATA[<p>Jodocus schrieb:</p>
<blockquote>
<p>Fakt ist: kleine Zahlen gibt es in der Kryptografie eher nicht so.</p>
</blockquote>
<p>Ja, das ist mir auch schon aufgefallen, allerdings ist das ja lediglich ein kleiner Test von mir<br />
und soll ja nicht eine super sichere Verschlüsselung sein, sondern mir geht es mehr darum, das<br />
Prinzip hinter einer Verschlüsselung zu verstehen. Zudem möchte ich erstmal mit kleinen Zahlen<br />
rechnen, damit ich besser nachvollziehen kann, was mein Programm eigentlich macht und ob das<br />
auch alles korrekt ist... mit den riesigen Zahlen, welche normalerweise eingesetzt werden, ist<br />
das leider nur schwer möglich <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f609.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--winking_face"
      title=";)"
      alt="😉"
    /> Trotzdem danke für den Hinweis!</p>
<p>Finnegan schrieb:</p>
<blockquote>
<p>Was deinen Algorithmus betrifft, den habe ich mir jetzt nicht genau angesehen, im englischen Wikipedia-Artikel zu dem Thema sind allerdings 2 Algorithmen, die fortgesetztes Quadrieren nutzen, in Pseudocode angegeben:</p>
<p><a href="http://en.wikipedia.org/wiki/Modular_exponentiation" rel="nofollow">http://en.wikipedia.org/wiki/Modular_exponentiation</a></p>
<p>Vielleicht lässt du dich davon inspirieren und verbesserst deine Variante entsprechend.</p>
</blockquote>
<p>Perfekt, vielen Dank, so etwas hab ich gesucht.<br />
Was std::pow angeht, magst du vielleicht recht haben, allerdings kenne ich keine andere Funktion um Potenzen zu berechnen.<br />
Immer mit base*=base in einer for-Schleife zu rechnen, ist ja auch nicht gerade die schönste Lösung...</p>
<p>Werner Salomon schrieb:</p>
<blockquote>
<p>Dein Problem lässt sich lösen, wenn Du in Zeile 22 schreibst:</p>
<pre><code>(power *= base) %= ex_mod;
</code></pre>
</blockquote>
<p>Achja stimmt... Danke vielmals <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f642.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--slightly_smiling_face"
      title=":)"
      alt="🙂"
    /></p>
<p>Werner Salomon schrieb:</p>
<blockquote>
<p>Abgesehen davon erscheint mir Dein Algorithmus etwas umständlich</p>
</blockquote>
<p>Ja, da hast du vermutlich recht, aber wie gesagt: das ist nur ein kleiner test, die Optimierungen kommen dann zu einem späteren<br />
Zeitpunkt, aber Danke, jetzt weiß ich wenigstens wie ich das Ganze angehen kann.</p>
<p>Gruß</p>
<p>Cyax</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2443098</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2443098</guid><dc:creator><![CDATA[Cyax]]></dc:creator><pubDate>Tue, 17 Feb 2015 12:23:20 GMT</pubDate></item><item><title><![CDATA[Reply to C++ RSA Verschlüsselung &#x2F; &amp;quot;Fortgesetztes Quadrieren&amp;quot; &#x2F; Riesige Zahlen on Tue, 17 Feb 2015 14:25:45 GMT]]></title><description><![CDATA[<p>Cyax schrieb:</p>
<blockquote>
<p>Perfekt, vielen Dank, so etwas hab ich gesucht.<br />
Was std::pow angeht, magst du vielleicht recht haben, allerdings kenne ich keine andere Funktion um Potenzen zu berechnen.<br />
Immer mit base*=base in einer for-Schleife zu rechnen, ist ja auch nicht gerade die schönste Lösung...</p>
</blockquote>
<p>Doch! Das ist die schönste Lösung! Allein schon weil sie korrekt ist! (Floating Point liefert dir bei großen Zahlen falsche Ergebnisse) ... ansonsten schreib vielleicht noch eine <code>sqr()</code> -Funktion, mit der du quadrieren kannst - aber damit ist nicht viel gewonnen.</p>
<p>Finnegan</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2443121</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2443121</guid><dc:creator><![CDATA[Finnegan]]></dc:creator><pubDate>Tue, 17 Feb 2015 14:25:45 GMT</pubDate></item><item><title><![CDATA[Reply to C++ RSA Verschlüsselung &#x2F; &amp;quot;Fortgesetztes Quadrieren&amp;quot; &#x2F; Riesige Zahlen on Tue, 17 Feb 2015 19:31:23 GMT]]></title><description><![CDATA[<p>Finnegan schrieb:</p>
<blockquote>
<p>Doch! Das ist die schönste Lösung! Allein schon weil sie korrekt ist! (Floating Point liefert dir bei großen Zahlen falsche Ergebnisse) ... ansonsten schreib vielleicht noch eine sqr()-Funktion, mit der du quadrieren kannst - aber damit ist nicht viel gewonnen.</p>
</blockquote>
<p>Ok alles klar, mach ich, danke <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f642.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--slightly_smiling_face"
      title=":)"
      alt="🙂"
    /></p>
<p>Hier mal meine Lösung (für eine eigene pow funktion):</p>
<pre><code>int poW(int base, int exponent)
{
	int result = base;
	if (exponent == 2){
		return base * base;
	}
	if (exponent == 0){
		return 1;
	}
	for (int i = 1; i &lt; exponent; i++){
		result *= base;
	}
	return result;
}
</code></pre>
<p>Cyax</p>
<p>//edit: code funktioniert jetzt</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2443162</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2443162</guid><dc:creator><![CDATA[Cyax]]></dc:creator><pubDate>Tue, 17 Feb 2015 19:31:23 GMT</pubDate></item><item><title><![CDATA[Reply to C++ RSA Verschlüsselung &#x2F; &amp;quot;Fortgesetztes Quadrieren&amp;quot; &#x2F; Riesige Zahlen on Tue, 17 Feb 2015 18:33:49 GMT]]></title><description><![CDATA[<pre><code class="language-cpp">int main()
{
	int base = 2;
	for( unsigned i = 0; i &lt; 10; ++i )
		std::cout &lt;&lt; poW( base, i ) &lt;&lt; '\n';
}
</code></pre>
<pre><code>2
4
4
256
65536
0
0
0
0
0
</code></pre>
<p>Echt jetzt?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2443164</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2443164</guid><dc:creator><![CDATA[Swordfish]]></dc:creator><pubDate>Tue, 17 Feb 2015 18:33:49 GMT</pubDate></item><item><title><![CDATA[Reply to C++ RSA Verschlüsselung &#x2F; &amp;quot;Fortgesetztes Quadrieren&amp;quot; &#x2F; Riesige Zahlen on Tue, 17 Feb 2015 18:41:49 GMT]]></title><description><![CDATA[<pre><code>int poW(int base, int exponent)
{
    if(exponent == 2){
      return base*=base;
    }
    for(int i = 0; i &lt; exponent; i++){
      base *= base;
    }
    return base;
}
</code></pre>
<p>Das ist Unsinn. Vor allem Zeile 7. Du brauchst eine temporäre Variable die die ursprüngliche Basis repräsentiert. Wenn möglich Code rudimentär Testen bevor du ihn hier abschickst.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2443166</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2443166</guid><dc:creator><![CDATA[Columbo]]></dc:creator><pubDate>Tue, 17 Feb 2015 18:41:49 GMT</pubDate></item><item><title><![CDATA[Reply to C++ RSA Verschlüsselung &#x2F; &amp;quot;Fortgesetztes Quadrieren&amp;quot; &#x2F; Riesige Zahlen on Tue, 17 Feb 2015 18:45:11 GMT]]></title><description><![CDATA[<blockquote>
<p>Das ist Unsinn. Vor allem Zeile 7. Du brauchst eine temporäre Variable die die ursprüngliche Basis repräsentiert. Wenn möglich Code rudimentär Testen bevor du ihn hier abschickst.</p>
</blockquote>
<p>Ja alles klar, ich werds gleich ändern...</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2443167</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2443167</guid><dc:creator><![CDATA[Cyax]]></dc:creator><pubDate>Tue, 17 Feb 2015 18:45:11 GMT</pubDate></item><item><title><![CDATA[Reply to C++ RSA Verschlüsselung &#x2F; &amp;quot;Fortgesetztes Quadrieren&amp;quot; &#x2F; Riesige Zahlen on Tue, 17 Feb 2015 19:20:21 GMT]]></title><description><![CDATA[<p>Ich verstehe deine Obsession mit der <code>pow()</code> -Funktion nicht so ganz. Du schreibst doch sowieso gerade eine (!), indem du fortgesetztes Quadrieren implementierst! (der einzige Unterschied ist, dass sie im Anschluss noch ein Modulo macht!).<br />
Bei der darfst du ruhig für das quadrieren mit Multiplikation arbeiten <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f603.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--grinning_face_with_big_eyes"
      title=":D"
      alt="😃"
    /></p>
<p>Das schöne am fortgesetzten Quadrieren ist doch, dass man sich die Identität <span class="katex"><span class="katex-mathml"><math><semantics><mrow><msup><mi>a</mi><mi>b</mi></msup><mo>⋅</mo><msup><mi>a</mi><mi>c</mi></msup><mo>=</mo><msup><mi>a</mi><mrow><mi>b</mi><mo>+</mo><mi>c</mi></mrow></msup></mrow><annotation encoding="application/x-tex">a^b \cdot a^c = a^{b+c}</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="strut" style="height:0.849108em;"></span><span class="strut bottom" style="height:0.849108em;vertical-align:0em;"></span><span class="base textstyle uncramped"><span class="mord"><span class="mord mathit">a</span><span class="vlist"><span style="top:-0.363em;margin-right:0.05em;"><span class="fontsize-ensurer reset-size5 size5"><span style="font-size:0em;">​</span></span><span class="reset-textstyle scriptstyle uncramped"><span class="mord mathit">b</span></span></span><span class="baseline-fix"><span class="fontsize-ensurer reset-size5 size5"><span style="font-size:0em;">​</span></span>​</span></span></span><span class="mbin">⋅</span><span class="mord"><span class="mord mathit">a</span><span class="vlist"><span style="top:-0.363em;margin-right:0.05em;"><span class="fontsize-ensurer reset-size5 size5"><span style="font-size:0em;">​</span></span><span class="reset-textstyle scriptstyle uncramped"><span class="mord mathit">c</span></span></span><span class="baseline-fix"><span class="fontsize-ensurer reset-size5 size5"><span style="font-size:0em;">​</span></span>​</span></span></span><span class="mrel">=</span><span class="mord"><span class="mord mathit">a</span><span class="vlist"><span style="top:-0.363em;margin-right:0.05em;"><span class="fontsize-ensurer reset-size5 size5"><span style="font-size:0em;">​</span></span><span class="reset-textstyle scriptstyle uncramped"><span class="mord scriptstyle uncramped"><span class="mord mathit">b</span><span class="mbin">+</span><span class="mord mathit">c</span></span></span></span><span class="baseline-fix"><span class="fontsize-ensurer reset-size5 size5"><span style="font-size:0em;">​</span></span>​</span></span></span></span></span></span> zunutze macht um das Potenzieren von <span class="katex"><span class="katex-mathml"><math><semantics><mrow><mi>O</mi><mo>(</mo><mi>n</mi><mo>)</mo></mrow><annotation encoding="application/x-tex">O(n)</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="strut" style="height:0.75em;"></span><span class="strut bottom" style="height:1em;vertical-align:-0.25em;"></span><span class="base textstyle uncramped"><span class="mord mathit" style="margin-right:0.02778em;">O</span><span class="mopen">(</span><span class="mord mathit">n</span><span class="mclose">)</span></span></span></span> auf <span class="katex"><span class="katex-mathml"><math><semantics><mrow><mi>O</mi><mo>(</mo><mi>log</mi><mi>n</mi><mo>)</mo></mrow><annotation encoding="application/x-tex">O(\log n)</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="strut" style="height:0.75em;"></span><span class="strut bottom" style="height:1em;vertical-align:-0.25em;"></span><span class="base textstyle uncramped"><span class="mord mathit" style="margin-right:0.02778em;">O</span><span class="mopen">(</span><span class="mop">lo<span style="margin-right:0.01389em;">g</span></span><span class="mord mathit">n</span><span class="mclose">)</span></span></span></span> zu drücken (wobei <span class="katex"><span class="katex-mathml"><math><semantics><mrow><mi>n</mi></mrow><annotation encoding="application/x-tex">n</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="strut" style="height:0.43056em;"></span><span class="strut bottom" style="height:0.43056em;vertical-align:0em;"></span><span class="base textstyle uncramped"><span class="mord mathit">n</span></span></span></span> der Exponent ist):<br />
<span class="katex"><span class="katex-mathml"><math><semantics><mrow><msup><mi>a</mi><mi>n</mi></msup><mo>=</mo><mo>(</mo><mo>(</mo><mo>(</mo><msup><mi>a</mi><mn>2</mn></msup><msup><mo>)</mo><mn>2</mn></msup><msup><mo>)</mo><mn>2</mn></msup><mo>)</mo><mi mathvariant="normal">.</mi><mi mathvariant="normal">.</mi><mi mathvariant="normal">.</mi><msup><mo>)</mo><mn>2</mn></msup><mo>⋅</mo><msup><mi>a</mi><mrow><mi>n</mi><mo>−</mo><msup><mn>2</mn><mrow><mo>⌊</mo><msub><mi>log</mi><mn>2</mn></msub><mi>n</mi><mo>⌋</mo></mrow></msup></mrow></msup></mrow><annotation encoding="application/x-tex">a^n = (((a^2)^2)^2)...)^2 \cdot a^{n - 2^{\lfloor \log_2 n \rfloor}}</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="strut" style="height:0.9921em;"></span><span class="strut bottom" style="height:1.2421em;vertical-align:-0.25em;"></span><span class="base textstyle uncramped"><span class="mord"><span class="mord mathit">a</span><span class="vlist"><span style="top:-0.363em;margin-right:0.05em;"><span class="fontsize-ensurer reset-size5 size5"><span style="font-size:0em;">​</span></span><span class="reset-textstyle scriptstyle uncramped"><span class="mord mathit">n</span></span></span><span class="baseline-fix"><span class="fontsize-ensurer reset-size5 size5"><span style="font-size:0em;">​</span></span>​</span></span></span><span class="mrel">=</span><span class="mopen">(</span><span class="mopen">(</span><span class="mopen">(</span><span class="mord"><span class="mord mathit">a</span><span class="vlist"><span style="top:-0.363em;margin-right:0.05em;"><span class="fontsize-ensurer reset-size5 size5"><span style="font-size:0em;">​</span></span><span class="reset-textstyle scriptstyle uncramped"><span class="mord mathrm">2</span></span></span><span class="baseline-fix"><span class="fontsize-ensurer reset-size5 size5"><span style="font-size:0em;">​</span></span>​</span></span></span><span class="mclose"><span class="mclose">)</span><span class="vlist"><span style="top:-0.363em;margin-right:0.05em;"><span class="fontsize-ensurer reset-size5 size5"><span style="font-size:0em;">​</span></span><span class="reset-textstyle scriptstyle uncramped"><span class="mord mathrm">2</span></span></span><span class="baseline-fix"><span class="fontsize-ensurer reset-size5 size5"><span style="font-size:0em;">​</span></span>​</span></span></span><span class="mclose"><span class="mclose">)</span><span class="vlist"><span style="top:-0.363em;margin-right:0.05em;"><span class="fontsize-ensurer reset-size5 size5"><span style="font-size:0em;">​</span></span><span class="reset-textstyle scriptstyle uncramped"><span class="mord mathrm">2</span></span></span><span class="baseline-fix"><span class="fontsize-ensurer reset-size5 size5"><span style="font-size:0em;">​</span></span>​</span></span></span><span class="mclose">)</span><span class="mord mathrm">.</span><span class="mord mathrm">.</span><span class="mord mathrm">.</span><span class="mclose"><span class="mclose">)</span><span class="vlist"><span style="top:-0.363em;margin-right:0.05em;"><span class="fontsize-ensurer reset-size5 size5"><span style="font-size:0em;">​</span></span><span class="reset-textstyle scriptstyle uncramped"><span class="mord mathrm">2</span></span></span><span class="baseline-fix"><span class="fontsize-ensurer reset-size5 size5"><span style="font-size:0em;">​</span></span>​</span></span></span><span class="mbin">⋅</span><span class="mord"><span class="mord mathit">a</span><span class="vlist"><span style="top:-0.363em;margin-right:0.05em;"><span class="fontsize-ensurer reset-size5 size5"><span style="font-size:0em;">​</span></span><span class="reset-textstyle scriptstyle uncramped"><span class="mord scriptstyle uncramped"><span class="mord mathit">n</span><span class="mbin">−</span><span class="mord"><span class="mord mathrm">2</span><span class="vlist"><span style="top:-0.363em;margin-right:0.07142857142857144em;"><span class="fontsize-ensurer reset-size5 size5"><span style="font-size:0em;">​</span></span><span class="reset-scriptstyle scriptscriptstyle uncramped"><span class="mord scriptscriptstyle uncramped"><span class="mopen">⌊</span><span class="mop"><span class="mop">lo<span style="margin-right:0.01389em;">g</span></span><span class="vlist"><span style="top:0.29964em;margin-right:0.1em;"><span class="fontsize-ensurer reset-size5 size5"><span style="font-size:0em;">​</span></span><span class="reset-scriptscriptstyle scriptscriptstyle cramped"><span class="mord mathrm">2</span></span></span><span class="baseline-fix"><span class="fontsize-ensurer reset-size5 size5"><span style="font-size:0em;">​</span></span>​</span></span></span><span class="mord mathit">n</span><span class="mclose">⌋</span></span></span></span><span class="baseline-fix"><span class="fontsize-ensurer reset-size5 size5"><span style="font-size:0em;">​</span></span>​</span></span></span></span></span></span><span class="baseline-fix"><span class="fontsize-ensurer reset-size5 size5"><span style="font-size:0em;">​</span></span>​</span></span></span></span></span></span><br />
...und dann nochmal das gleiche Spiel mit dem Restfaktor <span class="katex"><span class="katex-mathml"><math><semantics><mrow><msup><mi>a</mi><mrow><mi>n</mi><mo>−</mo><msup><mn>2</mn><mrow><mo>⌊</mo><msub><mi>log</mi><mn>2</mn></msub><mi>n</mi><mo>⌋</mo></mrow></msup></mrow></msup></mrow><annotation encoding="application/x-tex">a^{n - 2^{\lfloor \log_2 n \rfloor}}</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="strut" style="height:0.9921em;"></span><span class="strut bottom" style="height:0.9921em;vertical-align:0em;"></span><span class="base textstyle uncramped"><span class="mord"><span class="mord mathit">a</span><span class="vlist"><span style="top:-0.363em;margin-right:0.05em;"><span class="fontsize-ensurer reset-size5 size5"><span style="font-size:0em;">​</span></span><span class="reset-textstyle scriptstyle uncramped"><span class="mord scriptstyle uncramped"><span class="mord mathit">n</span><span class="mbin">−</span><span class="mord"><span class="mord mathrm">2</span><span class="vlist"><span style="top:-0.363em;margin-right:0.07142857142857144em;"><span class="fontsize-ensurer reset-size5 size5"><span style="font-size:0em;">​</span></span><span class="reset-scriptstyle scriptscriptstyle uncramped"><span class="mord scriptscriptstyle uncramped"><span class="mopen">⌊</span><span class="mop"><span class="mop">lo<span style="margin-right:0.01389em;">g</span></span><span class="vlist"><span style="top:0.29964em;margin-right:0.1em;"><span class="fontsize-ensurer reset-size5 size5"><span style="font-size:0em;">​</span></span><span class="reset-scriptscriptstyle scriptscriptstyle cramped"><span class="mord mathrm">2</span></span></span><span class="baseline-fix"><span class="fontsize-ensurer reset-size5 size5"><span style="font-size:0em;">​</span></span>​</span></span></span><span class="mord mathit">n</span><span class="mclose">⌋</span></span></span></span><span class="baseline-fix"><span class="fontsize-ensurer reset-size5 size5"><span style="font-size:0em;">​</span></span>​</span></span></span></span></span></span><span class="baseline-fix"><span class="fontsize-ensurer reset-size5 size5"><span style="font-size:0em;">​</span></span>​</span></span></span></span></span></span> ... usw. bis man die ganze Potenz zusammen hat (in <span class="katex"><span class="katex-mathml"><math><semantics><mrow><mi>O</mi><mo>(</mo><mi>log</mi><mi>n</mi><mo>)</mo></mrow><annotation encoding="application/x-tex">O(\log n)</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="strut" style="height:0.75em;"></span><span class="strut bottom" style="height:1em;vertical-align:-0.25em;"></span><span class="base textstyle uncramped"><span class="mord mathit" style="margin-right:0.02778em;">O</span><span class="mopen">(</span><span class="mop">lo<span style="margin-right:0.01389em;">g</span></span><span class="mord mathit">n</span><span class="mclose">)</span></span></span></span> Schritten).<br />
Was du jetzt machst, ist eine weitere <code>pow()</code> -Funktion zu schreiben, die eben <em>nicht</em> das elegante quadrieren nutzt, <em>nur</em> um deine Quadrate auszurechnen (!).<br />
Multiplizier' die Zahl einfach mit sich selbst um sie zu quadrieren - einfacher wirds nicht <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f609.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--winking_face"
      title=";)"
      alt="😉"
    /></p>
<p>Gruss,<br />
Finnegan</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2443171</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2443171</guid><dc:creator><![CDATA[Finnegan]]></dc:creator><pubDate>Tue, 17 Feb 2015 19:20:21 GMT</pubDate></item></channel></rss>