Willkommen bei dotnet-snippets.de! Snippet hinzufügen Login Registrieren
Snippets in der Datenbank: 1563 | Anzahl registrierter User: 1896 | Besucher online: 55
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)

Größter gemeinsamer Teiler (2)


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

Beschreibung:

Nach dem kleinen Fauxpas beim ersten Snippet hier eine andere Implementierung.

Der sog. steinsche Algorithmus kommt ganz mit bitweisen Operatoren aus und bietet somit unter Umsetzung folgender Regeln eine bis zu 60% effizientere Berechnung gegenüber dem "normalen" euklidischen Algorithmus:

1. a und b gerade -> gcd(a, b) = 2gcd(a/2, b/2)
2. a und b ungerade -> gcd(a, b) = gcd([a-b]/2, b)
3. nur a gerade -> gcd(a, b) = gcd(a/2, b)


erstes Snippet: http://dotnet-snippets.de/dns/groesster-gemeinsamer-teiler-SID1361.aspx


Abgelegt unter: größter, gemeinsamer, Teiler, ggT, gcd, iterativ, Iteration, rekursiv, Rekursion, mathe, Euklid, euclid, binär, binary, bitweise, shift, bitshift, Stein, steinsche, Algorithmus, algorithm.



Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
Function gcd(ByVal a As Integer, ByVal b As Integer) As Integer
	Dim k As Integer = 0
	While 0 = (a And 1 Or b And 1)
		a >>= 1
		b >>= 1
		k += 1
	End While
		
	Dim t As Integer = If(a And 1, -b, a)
	While Not t = 0
		While Not t And 1
			t >>= 1
		End While
			
		If t > 0 Then a = t Else b = -t
		t = a - b
	End While
		
	Return a << k
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:  18.04.2011 20:24:02

Na, der ggt scheint dir nicht zu liegen. ;)
Auch hier hat sich ein kleiner Fauxpas eingeschlichen, die Bedingung der ersten While-Schleife muss lauten:

While ((a And 1 Or b And 1) = 0)

ansonsten wird eine Endlosschleife erzeugt bis irgendwann
eine OverflowException fliegt.

In Vb kann zwar u.U. ein Integer in ein bool gecastet werden aber nicht in Verbiegung mit Not, das Ergebnis ist dann immer True.


Dim b As Boolean
b = 1 ' True
b = 0 ' False
b = Not 1 ' True
b = Not 0 ' True
Klemens Nanni schrieb am:  19.04.2011 04:53:22

..und wieder das gelernt. (:


Diese Snippets könnten für Sie interessant sein:
[VB.NET] Größter gemeinsamer Teiler
[C#] Integers
[C#] "echte" Teiler Summe berechnen
[VB.NET] Primfaktorzerlegung
[VB.NET] Kleinster natürlicher Teiler > 1
[C#] größten gemeinsamen Teiler berechnen.
[VB.NET] Binomialkoeffizient
[VB.NET] Fibonacci-Folge iterativ erzeugen
[C#] rekursiver Verzeichnislauf
[C#] Eigenschaften aller Steuerlemente eines Formulars setzen
[C#] Treeview rekursiv durchsuchen
[VB.NET] Ordergröße rekursiv bestimmen
[C#] Dateien und Ordner rekursiv löschen
[C#] Ordnergröße ermitteln
[C#] Ordner und Dateien rekursiv durchlaufen
[C#] Ordner mit Inhalt kopieren (rekursiv)
[C#] FTP - Ordner Rekursiv erstellen
[C#] Dateien mit bestimmter Extension rekursiv in Array einlesen
[C#] Erzeugen von Zeichenfolgen durch Permutation
[C#] Verhindern das Funktion rekursiv aufgerufen wird.
[C#] C# Ordner auslesen und in Liste speichern "rekursiv"
[C#] Rekursion Treeview
[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.
[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#] 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] Das Sieb des Eratosthenes
[VB.NET] Modulare Exponentation
[VB.NET] Das Sieb von Atkin
[VB.NET] Das Sieb von Atkin (2)
[VB.NET] Werte zweier Variablen tauschen
[VB.NET] Ganzzahlige Wurzel
[VB.NET] Binäre Exponentation
[VB.NET] Das Sieb von Atkin (2) - aktuell
[VB.NET] Dezimalzahl in Zahl der Basis b < 37 konvertieren
[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
[C#] Generisches, komprimiertes, serialisieren von Objekten
[C#] Generisches, komprimiertes, deserialisieren von Objekten
[C#] 3 arten der Serialisierung bzw Deserialisierung
[C#] Capslock abfragen

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