Effiziente Verfahren zur Berechnung von p^q (Potenzierung), wobei q eine ganze Zahl
Was ist ein effizienter Weg, um zu berechnen, pq, wobei q eine ganze Zahl?
Du musst angemeldet sein, um einen Kommentar abzugeben.
Was ist ein effizienter Weg, um zu berechnen, pq, wobei q eine ganze Zahl?
Du musst angemeldet sein, um einen Kommentar abzugeben.
Potenzierung durch Quadratur verwendet nur O(lg q) Multiplikationen.
Diese Arbeit sollte auf jeden monoid (
T
,operator*
), wo einT
konstruiert aus1
ist die identity-element. Enthält alle numerischen Typen.Ausweitung auf
signed q
ist einfach: dividieren halt das eine durch das Ergebnis der oben für den absoluten Wert derq
(aber wie immer vorsichtig sein, bei der Berechnung des absoluten Wertes).Unter der Annahme, dass
^
bedeutet Potenzierung und dassq
ist Laufzeit-Variablen, verwenden Siestd::pow(double, int)
.EDIT: der Vollständigkeit halber wegen der Kommentare auf diese Antwort: habe ich die Frage gestellt Warum wurde std::pow(double, int) entfernt von C++11? über die fehlende Funktion und in der Tat
pow(double, int)
war nicht entfernt in C++0x, nur die Sprache geändert wurde. Es scheint jedoch, dass die Bibliotheken nicht wirklich optimieren es aufgrund Ergebnis Genauigkeit betrifft.Selbst gegeben, ich würde noch Verwendung
pow
bis die Messung hat mir gezeigt, dass es nötig optimiert werden.pow
Funktion, wenn Laufzeit-Variabilität erforderlich ist.Ich nehme an ^ du meinst, power-Funktion, und nicht bitweise xor.
Ist die Entwicklung eines effizienten power-Funktion für jede Art von p und jede positive integral q ist das Thema einen ganzen Abschnitt, 3.2, Stepanov und McJones Buch - Elemente der Programmierung. Die Sprache im Buch ist nicht C++, aber ist sehr leicht übersetzt in C++.
Es umfasst mehrere Verbesserungen, einschließlich der Potenzierung durch Quadratur, die Umstellung auf tail recursion dann iteration, und Akkumulation-Variablen-Eliminierung, und bezieht sich die Optimierungen, die zu den Begriffen Art und Regelmäßigkeit und assoziative Operationen zu beweisen, es funktioniert für alle solche Typen.