Generierung von Ziffern der Wurzel aus 2
Möchte ich generieren die Ziffern der Quadratwurzel von zwei, um 3 Millionen stellen.
Ich bin mir bewusst, Newton-Raphson aber ich habe nicht viel Ahnung, wie es zu implementieren, die in C oder C++ wegen fehlender biginteger support. Kann jemand mich in die richtige Richtung?
Auch, wenn jemand weiß, wie man es in python (ich bin Anfänger), ich würde schätzen es auch.
- Mit dem GMP - Paket können Sie ganz einfach große Zahl Unterstützung. GMP ist ziemlich ausgereift und hoch optimiert für eine enorme Bandbreite von zahlen, unterstützt integers, rationals, und schwebt, und mit C++ - Wrapper für die low-level-C-Sachen.
- Ich habe geschrieben einige python-code basiert auf diesem: en.wikipedia.org/wiki/.... Getestet habe ich es, obwohl, und ich bezweifle, dass er konnte, Griff die drei-Millionen-Ziffern sehr schnell. Noch, wenn Sie interessiert sind, werde ich es posten.
- denke, das ist die gleiche Methode, die wir gelernt in der Mittelschule Recht?
- Auch die Methode, die ich gelernt in der Mittelschule beteiligten drücken Tasten auf einem Taschenrechner 🙂
- Wolfram Alpha wird nicht lassen Sie Sie berechnen 3 Millionen Ziffern aber was Sie geben kann, ist erstaunlich.
- gelernt, dass die Methode in der Mittelschule dann mit Taschenrechner in der Schule und heute habe ich neu erlernt, die Methode wieder.
- wirklich spät hier .. werden Sie veröffentlichen Sie Ihre Lösung? 🙂
- sorry! Es ist bis jetzt.
- Ich hoffe Sie planen nicht nur post von jemand anderes die Lösung bei spoj.pl/Probleme/SQRT2, ohne zu versuchen, zu lernen, den Algorithmus.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Könnten Sie versuchen, mit Hilfe der mapping:
a/b -> (a+2b)/(a+b)
aba= 1, b= 1
. Diese konvergiert gegen Wurzel(2) (in der Tat gibt die Fortsetzung Bruchteil Darstellungen).Nun der entscheidende Punkt: Diese können dargestellt werden als eine matrix-Multiplikation (ähnlich wie fibonacci)
Wenn a_n und b_n sind die N-te Zahl in den Schritten dann
[1 2] [a_n b_n]T = [a_(n+1) b_(n+1)]T
[1 1]
welches jetzt gibt uns
[1 2]n [a_1 b_1]T = [a_(n+1) b_(n+1)]T
[1 1]
So, wenn die 2x2-matrix A, die wir brauchen, um zu berechnen An, die getan werden kann, durch wiederholtes quadrieren und verwendet nur integer-Arithmetik (so dass Sie nicht haben, um sorgen über die Präzision, Fragen).
Beachten Sie auch, dass die a/b bekommen Sie immer in reduzierter form (als gcd(a,b) = gcd(a+2b, a+b)), also, wenn Sie denken mit einem Bruchteil der Klasse, die zum darstellen der Zwischenergebnisse nicht!
Da die N-te Nenner ist wie (1+sqrt(2))^n, um 3 Millionen stellen, würden Sie wahrscheinlich benötigen, um zu berechnen, bis die 3671656th Begriff.
Beachten, auch wenn Sie auf der Suche für die ~3.6 Millionstel Begriff, wiederholte Quadratur Ihnen erlauben, um die Berechnung der N-TEN term in O(Log n) Multiplikationen und Additionen.
Außerdem kann dieser einfach parallel, im Gegensatz zu den iterativen diejenigen, die wie Newton-Raphson etc.
BEARBEITEN: ich mag diese version besser als die Vorherige. Es ist eine Allgemeine Lösung, die akzeptiert sowohl ganze zahlen und Dezimalzahlen; mit n = 2 und precision = 100000, dauert es etwa zwei Minuten. Vielen Dank an Paul McGuire für seine Anregungen & andere Vorschläge willkommen!
while root == 0 or (ceil(log(root, 10)) < precision and (ndigits or carry != 0)):
mitwhile (len(rootlist) < precision and (ndigits or carry != 0)):
? Wird loszuwerden, die fiesen ceil-und log-Funktion aufruft, und der wiederholte test fürroot == 0
.precision
Nullen und dann, ein paar zahlen später, starten Sie die Generierung Werte ungleich null. Also ich wollte sicher gehen, dass man diese Werte ungleich null. Ich werde versuchen, mitwhile len(rootlist)...
obwohl;rootlist
war eine späte Ergänzung und ich denke, ich habe nie rund um die Umgestaltung der umliegenden code.len(rootlist)
ist nur ein paar Mikrosekunden langsamer alslog10(root)
auch für großeprecision
. Aberlen
ist in der Tat ästhetisch, also änderte ich es. Nochmals vielen Dank.range(1,10)
aus der main-loop-Algorithmus auf eine Konstante variable wie_1_to_9
- keinen Sinn, mit zu machen, das Angebot rufen jedes mal durch die Schleife.for
Schleife undrange
nennen, sind ganz unnötig. Tests haben ergeben, dass diewhile
Schleife oben ist am schnellsten.Als für beliebig große zahlen haben, könnten Sie einen Blick auf Die GNU Multiple Precision Arithmetic Library (für C/C++).
Für die Arbeit? Nutzen Sie die Bibliothek!
Zum Spaß? Gut für Sie 🙂
Schreiben Sie ein Programm, das zu imitieren, was Sie tun würden, mit Bleistift und Papier. Beginnen Sie mit 1-stelligen, dann die 2 Ziffern, dann 3, ..., ...
Mach dir keine sorgen über Newton oder sonst jemand. Nur tun Sie es Ihre Weise.
Schönste Weg ist wohl mit den weiter fraction expansion
[1; 2, 2, ...]
die Quadratwurzel von zwei.decimal((root_two_cf_expansion())
gibt einen iterator von allen Dezimalstellen.t1
undt2
im Algorithmus sind die minimalen und maximalen Werte für die nächste Ziffer. Wenn Sie gleich sind, und wir-Ausgang, digit.Beachten Sie, dass dies nicht mit bestimmten Ausnahmefällen, wie negative zahlen in der Fortsetzung Bruchteil.
(Dieser code ist eine Anpassung der Haskell-code für die Behandlung kettenbrüche, wurde im Umlauf.)
Hier ist eine kurze version für die Berechnung der Quadratwurzel eines integer - eine zu Ziffern Präzision. Es funktioniert durch die Suche nach der ganzzahligen Quadratwurzel von eine nach Multiplikation mit 10 angehoben, um die 2 x Ziffern.
Nur ein paar Punkte zu beachten.
Müssen Sie konvertieren das Ergebnis in eine Zeichenfolge und fügen Sie den Dezimalpunkt an die richtige Stelle (wenn Sie möchten, dass der Dezimalpunkt gedruckt).
Umwandlung eine sehr große ganze Zahl, ein string ist nicht sehr schnell.
Aufteilung von sehr großen ganzen zahlen ist nicht sehr schnell (in Python) entweder.
Je nach Leistung Ihres Systems, kann es eine Stunde oder länger dauern, um zu berechnen die Quadratwurzel von 2 bis 3 Millionen Dezimalstellen.
Habe ich nicht bewiesen, wird die Schleife immer kündigen. Kann es oszillieren zwischen zwei Werten, die sich in der letzten Ziffer. Oder kann es nicht.
Gut, der folgende code ist der code, den ich geschrieben habe. Es generiert eine Millionen stellen nach dem Dezimalkomma für die Quadratwurzel von 2 in über 60800 Sekunden für mich, aber mein laptop war zu schlafen, wenn es das Programm ist, sollte es schneller. Sie können versuchen, zu generieren 3 Millionen stellen, aber es könnte ein paar Tage, um es zu bekommen.
Python unterstützt bereits große Integer-zahlen aus der box, und wenn das ist das einzige, was hält Sie zurück in C/C++, Sie können schreiben Sie immer einen schnellen container-Klasse selbst.
Das einzige problem, das Sie erwähnt haben, ist ein Mangel an großen zahlen. Wenn Sie nicht möchten, verwenden Sie eine Bibliothek haben, so sind Sie auf der Suche nach Hilfe schreiben ein so Klasse?
Hier ist ein effizienter integer-Wurzel-Funktion (in Python 3.x), die beendet werden soll in allen Fällen. Es beginnt mit einem Wert, der wesentlich näher an der Wurzel, so dauert es weniger Schritte. Beachten Sie, dass int.bit_length erfordert Python 3.1+. Fehlerprüfung Links für die Kürze.