Burnikel-Ziegler-Verfahren

Aus testwiki
Version vom 22. März 2023, 15:52 Uhr von imported>Snoopy1964 (Archivlink überprüft, Vorlagenfehler korrigiert)
(Unterschied) ← Nächstältere Version | Aktuelle Version (Unterschied) | Nächstjüngere Version → (Unterschied)
Zur Navigation springen Zur Suche springen

Das Burnikel-Ziegler-Verfahren ist ein 1998 von Christoph Burnikel und Joachim Ziegler[1] beschriebener Divisions-Algorithmus für ganze Zahlen. Er berechnet außer dem Quotienten auch den Rest.

Die Laufzeitkomplexität hängt vom eingesetzten Multiplikationsalgorithmus ab. Wenn die Multiplikation O(nc) Schritte benötigt, wie es beim Karazuba- und dem Toom-Cook-Algorithmus der Fall ist, läuft die Burnikel-Ziegler-Division ebenfalls in O(nc) Schritten ab[2]. Liegt die Multiplikationskomplexität bei O(nlog(n)log(logn)), was dem Schönhage-Strassen-Algorithmus entspricht, so verringert sich die Komplexität der Division auf O(nlog2(n)log(logn))[3].

In der Praxis ist der Burnikel-Ziegler-Algorithmus zwischen ca. 250 und 1,5 Millionen Dezimalstellen schneller als die Schulmethode und das Barrett-Verfahren.[4][5]

Beschreibung

Kernstück des Algorithmus sind zwei Unteralgorithmen namens D2n/1n und D3n/2n, die Zahlen der Länge 2n und 1n bzw. 3n und 2n dividieren und sich gegenseitig rekursiv aufrufen. Bei jedem Aufruf verkürzt sich die Zahlenlänge um 1/4 bzw. 1/3; es kommen dabei Additionen, Subtraktionen, Verschiebungen und Elementardivisionen zum Einsatz. Der Unteralgorithmus D3n/2n führt darüber hinaus eine Multiplikation durch und profitiert von schnellen Multiplikationsalgorithmen (s. o.).

Dritter Bestandteil ist ein Algorithmus namens Dr/s, der die Ausgangszahlen so aufteilt, dass sie für D2n/1n geeignet sind.

Verwendung

Der Burnikel-Ziegler-Algorithmus kommt in Java ab Version 8 [6], GMP[7] und der Algorithmenbibliothek Leda zum Einsatz.

Einzelnachweise

  1. Vorlage:Cite web
  2. http://cr.yp.to/bib/1998/burnikel.ps S. 11: Die Division zweier Zahlen der Länge r und s benötigt O(rs(K(s)+O(slogs)), wobei K(s) die Multiplikationskomplexität ist, also z. B. O(slog3) im Fall der Karazuba-Multiplikation.
  3. http://cr.yp.to/bib/1998/burnikel.ps Abschnitt 4.3
  4. Vorlage:Cite web
  5. Vorlage:Cite web
  6. http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=8014319
  7. http://gmplib.org/manual/Divide-and-Conquer-Division.html