Willkommen bei dotnet-snippets.de! Snippet hinzufügen Login Registrieren
Snippets in der Datenbank: 1563 | Anzahl registrierter User: 1896 | Besucher online: 240
Hauptmenü
Home
Top Ten
Zufälliger Snippet
FAQs
.NET Community
dotnet-forum.de
dotnet-kicks.de
Social

RSS Feeds
Rss Alle Snippets
Rss C#
Rss VB.NET
Rss C++
Rss ASP.NET
Partner
Member of Microsoft Community Leader/Insider Program (CLIP)

Binäre Exponentation


Autor: Klemens Nanni
Sprache: VB.NET
Bewertung:
noch nicht bewertet
Anzahl der Aufrufe: 2263
  
Kick it on dotnet-kicks.de  

Beschreibung:

Die binäre Exponentation ist ein Verfahren zur Rechenoptimierung von Potenzen. Sie reduziert die Anzahl an benötigten Multiplikationen.

Beispiel: 17^9 - Um diesen Ausdruck zu berechnen, benötigen Sie 8 Multiplikationen. Formen Sie in jedoch um, ist es auch mit weniger möglich:
17^9 = 17(17^4)² = 17[(17²)²]²

Sollten sich Ausdrücke innerhalb der Terme wiederholen, können diese in Variablen zwischengespeichert werden, um die Häufung selbiger Op. zu vermeiden.


Abgelegt unter: binär, binary, exp, exponent, exponentation, math, mathe, basis, base.



Visual Basic
1
2
3
4
5
6
7
Function BinExp(ByVal base As Integer, ByVal exp As Integer) As Long
    BinExp = base

    For Each d As Char In Convert.ToString(exp, 2).Remove(0, 1)
        If d = "0" Then BinExp *= BinExp Else BinExp *= BinExp * base
    Next
End Function
Sie haben Fragen zu diesem Snippet oder brauchen Hilfe bei der .NET Entwicklung?
Freundliche und kompetente Entwickler helfen Ihnen gern weiter im Forum für .NET Entwicklung.



Kommentare:
(Zum Schreiben von Kommentaren bitte anmelden.)

Scavanger schrieb am:  16.03.2011 17:59:28

Hallo,

erstmal sorry, wenn ich schon wieder an deinem Code was aus zusetzen habe...

Zuerst hat sich ein Tippfehler in der zweiten eingeschlichen:
Dim r As Integer = base


Als Datentypen würde ich ich long vorschlagen, sonst haut dir VB gleich bei bei deinem Beispiel oben (17 ^ 9) eine Overflow Exception um die Ohren.

Ansonsten eine recht "kreative" Lösung des Problems, aber die Lösung per Convert.ToString Überladung finde ich unschön, außerdem verlangsamt die Umwandlung in einen String die Ausführung um das ca. 1,5 - 2 fache.
Schöner gehts mit etwas modularer Arithmetik, hier mal die klassische Implementation:
Function BinExp(ByVal b As Long, ByVal e As Long) As Long
Dim r As Long = 1
While (e > 0)
If (e Mod 2) = 1 Then
r *= r * b
Else
r *= r
End If
e /= 2
End While
Return r
End Function



Das lässt sich schöner per
Klemens Nanni schrieb am:  16.03.2011 21:18:53

Der mathem. Weg macht durchaus Sinn, aber wollte ich hier den Fokus auf der Exponentation an sich belassen.
Wählt man ihn doch, empfiehlt sich, das "/= 2" durch ">>= 1" und "mod 2 = 0" durch "& 1" ersetzen. Bitweise Operatoren bringen nochmal einen kleinen Temposchub.


Diese Snippets könnten für Sie interessant sein:
[C#] Wandelt ein Bytearray in einen Binärstring
[VB.NET] Dezimalzahl eines Binärwerts berechnen
[VB.NET] Binärwert einer Dezimalzahl berechnen
[VB.NET] Zahlen als Binär darstellen
[C#] Binärsuche innerhalb einer Liste
[C#] Binärdatei in XML File speichern
[C#] Binärdatei aus XML Datei auslesen und abspeichern
[C#] Laden und speichern von komprimierten Binärdaten
[C#] Dezimal in Binär umwandeln
[C#] Binärvergleich zweier Dateien
[C#] Zahlensysteme (BIN, HEX, OCT, DEZ) umrechnen
[C#] Byte-Array in Struktur kopieren
[VB.NET] Größter gemeinsamer Teiler (2)
[C#] Generisches, komprimiertes, serialisieren von Objekten
[C#] Generisches, komprimiertes, deserialisieren von Objekten
[C#] 3 arten der Serialisierung bzw Deserialisierung
[VB.NET] Modulare Exponentation
[C#] Primzahl berechnen (optimiert)
[C#] Berechnung der Entfernung zwischen GPS-Koordinaten
[VB.NET] Das Sieb des Eratosthenes
[VB.NET] Primfaktorzerlegung
[VB.NET] Das Sieb von Atkin
[VB.NET] Das Sieb von Atkin (2)
[VB.NET] Pandigitale Zahlen
[VB.NET] Werte zweier Variablen tauschen
[VB.NET] Ganzzahlige Wurzel
[VB.NET] Kleinster natürlicher Teiler > 1
[VB.NET] Das Sieb von Atkin (2) - aktuell
[VB.NET] Dezimalzahl in Zahl der Basis b < 37 konvertieren
[C#] Wurzel und Potenz berechnen ohne Math-Klasse
[C#] Summe 1..n berechnen
[C#] Fibonacci-Folge berechnen
[C#] n-te Fibonaccizahl rekursiv berechnen
[C#] Summe 1²...n² berechnen.
[C#] Summe 1³..n³ berechnen.
[C#] größten gemeinsamen Teiler berechnen.
[VB.NET] Multiplikation von übergroßen Zahlen
[C#] Dreiecksberechnung
[VB.NET] PI nach der Bailey-Borwein-Plouffe-Formel berechnen
[VB.NET] Quadratische Gleichung mit der PQ Formel lösen
[VB.NET] Basisrechenfunktionen für einen Kreis
[C++] Exponents
[C#] Quersummenberechnung
[C#] Geodaten in sexagesimal Format umrechnen
[VB.NET] Größten gemeinsamen Teiler berechnen
[VB.NET] Quadratwurzel ohne Sqrt() Funktion ziehen
[C#] Addiere alle ganzen Zahlen von x bis y
[C++] Caesar
[C#] "echte" Teiler Summe berechnen
[C#] Formelevaluierung aus RPN Form
[C#] Prüfung auf narzisstische Zahlen
[C#] CellMatrix
[C#] Maschinengenauigkeit
[C#] Flächenberechnungen am Kreis,Quadrat,Parallelogramm,Trapez
[C#] Bruch-Klasse
[VB.NET] einfacher rekursiver Mathe Parser
[VB.NET] Permutation nachweisen
[VB.NET] Größter gemeinsamer Teiler
[VB.NET] Fibonacci-Folge iterativ erzeugen
[VB.NET] Binomialkoeffizient
[ASP.net] JavaScript Verweis reinschreiben OnPreRender

schlecht sehr gut
1 2 3 4 5 6 7 8 9 10
Nur angemeldete User können Snippets bewerten.