Wie die Berechnung der N-TEN Wurzel einer sehr großen ganzen Zahl
Ich brauche eine Möglichkeit zum berechnen der N-TEN Wurzel aus einer langen Ganzzahl in Python.
Versuchte ich pow(m, 1.0/n)
, aber es funktioniert nicht:
OverflowError: long int zu groß ist, um konvertieren zu schweben
Irgendwelche Ideen?
Durch long integer und ich meine WIRKLICH lange Ganzzahlen wie:
11968003966030964356885611480383408833172346450467339251
196093144141045683463085291115677488411620264826942334897996389
485046262847265769280883237649461122479734279424416861834396522
819159219215308460065265520143082728303864638821979329804885526
557893649662037092457130509980883789368448042961108430809620626
059287437887495827369474189818588006905358793385574832590121472
680866521970802708379837148646191567765584039175249171110593159
305029014037881475265618958103073425958633163441030267478942720
703134493880117805010891574606323700178176718412858948243785754
898788359757528163558061136758276299059029113119763557411729353
915848889261125855717014320045292143759177464380434854573300054
940683350937992500211758727939459249163046465047204851616590276
724564411037216844005877918224201569391107769029955591465502737
961776799311859881060956465198859727495735498887960494256488224
613682478900505821893815926193600121890632
Als David impliziert, pow(n, 1/3) geben Sie die kubische (also 3.) Wurzel von n ist.
Nein ist es nicht, da 1/3 == 0 in python < 3.
(Aber es wird nicht das sein, was der OP wollte, entweder).
Py3 nicht integer Einschränkungen... Sie wachsen können ewig bis der Speicher ausgeht. Getestet habe ich bei meiner installation. Ist das eine Lösung.
InformationsquelleAutor PiX | 2008-12-10
Du musst angemeldet sein, um einen Kommentar abzugeben.
Können Sie machen es etwas schneller durch die Vermeidung von while-Schleifen zu Gunsten der Einstellung niedrig bis 10 ** (len(str(x)) /n) und hoch zu niedrig * 10. Wahrscheinlich besser, zu ersetzen oder das len(str(x)) mit dem bit-Länge, und verwenden Sie eine bit-Verschiebung. Basierend auf meinen tests, ich Schätze 5% speedup aus der ersten und 25% speedup aus der zweiten. Wenn die int-Werte sind groß genug, das könnte Materie (und die Beschleunigungen können variieren). Vertrauen Sie nicht mein code ohne Tests gezielt. Ich habe einige grundlegende Tests durch, aber verpasst haben, ein Grenzfall. Auch diese Beschleunigungen variieren mit der gewählten Zahl.
Wenn die tatsächlichen Daten, die Sie verwenden, ist viel größer als das, was Sie hier gepostet, diese Veränderung kann sich lohnen.
Norm 0.626754999161
Alt 0.566340923309
Die Linie
low = high/2
solltelow = high // 2
wenn Sie wirklich wollen, eine ganze Zahl am Ende heraus.Ich schrieb es mit
low = high/2
bewusst, als ich direkt kopiert, die Antwort von Markus s Code als ein Mittel des benchmarking ist es, wenn im Vergleich zu meinem vorgeschlagenen Verbesserung. Ich werde beachten Sie, dass seit dann, Markus aktualisiert hat seinen code einen Fehler zu korrigieren und tzs beantwortet hat, mein code, es hat auch einen bug. Allerdings weiß ich nicht wirklich daran erinnern die details von dem problem noch von meiner Lösung, so dass ich nicht mehr das Gefühl zuständigen um diese Lücken zu schliessen.InformationsquelleAutor Brian
Wenn es eine WIRKLICH große Zahl. Könnte man eine binäre Suche.
Beispiel:
mid = (low + high) // 2
zumid = int((low + high) // 2) + 1
würde das beheben.Downvoted weil es bugs hat. Ich habe versucht
find_invpow(64, 3)
und bekam 3, auch wenn das Ergebnis hätte 4.Behoben
OK. Ich öffnete die downvote.
Die Linie
low = high/2
solltelow = high // 2
wenn Sie wirklich wollen, eine ganze Zahl am Ende heraus.InformationsquelleAutor Markus Jarderot
Gmpy ist ein C-codiert Python-extension-Modul umschließt, die die GMP-Bibliothek zu bieten, um Python-code schnell multiprecision-Arithmetik (integer -, rational -, und float) random number generation, erweiterten Nummer-theoretischen Funktionen, und mehr.
Umfasst eine
root
Funktion:Beispielsweise 20 Wurzel:
gmpy2
diese Ergebnisse, in:'mpz' object has no attribute 'root'
.gmpy2 verwendet eine neue mpfr-Typ basierend auf der MPFR-Bibliothek. gmpy2.root(x, n) -> mpfr Return n-te Wurzel von x an. Das Ergebnis ist immer ein "mpfr'.
gmpy2 hat
gmpy2.iroot
zu berechnen, ganze Wurzeln.InformationsquelleAutor gimel
Wenn Sie nach etwas suchen, das standard -, schnelle schreiben mit hoher Präzision. Ich würde die decimal und passen Sie die Genauigkeit (getcontext().prec) um mindestens die Länge von x.
Code (Python 3.0)
Antwort
x ist die kubische Zahl der 22873918786185635329056863961725521583023133411
451452349318109627653540670761962215971994403670045614485973722724603798
107719978813658857014190047742680490088532895666963698551709978502745901
704433723567548799463129652706705873694274209728785041817619032774248488
2965377218610139128882473918261696612098418
InformationsquelleAutor
Oh, für zahlen , dass groß ist, verwenden Sie den decimal-Modul.
ns: Ihre Zahl als string
und die Antwort ist: 2.287391878618402702753613056 E+305
TZ wies darauf hin, dass dies nicht richtig... und er hat Recht. Hier ist mein test.
Er ausgeschaltet ist um etwa 10**891
Dezimal ist in etwa so genau, wie Sie es brauchen... meine 0.333 string ist gerade für die Kürze.
tz... du hast Recht. Es Weg... naja. Die newton-Methode oben hat der rock aber!
InformationsquelleAutor Jim Carroll
Möglicherweise für Ihre Neugier:
http://en.wikipedia.org/wiki/Hensel_Lifting
Könnte dies die Technik, die Maple verwenden würde, um tatsächlich zu finden der N-TEN Wurzel der großen zahlen.
Pose die Tatsache, dass
x^n - 11968003.... = 0 mod p
, und gehen von dort aus...InformationsquelleAutor Calyth
In älteren Versionen von Python,
1/3
gleich 0 ist. In Python 3.0,1/3
gleich 0.33333333333 (und1//3
ist gleich 0).Also, entweder ändern Sie Ihren code so verwenden
1/3.0
oder wechseln Sie zu Python 3.0 .InformationsquelleAutor Brian
Kam ich mit meiner eigenen Antwort, das dauert @Mahmoud Kassem Idee, vereinfacht den code und macht es leichter wiederverwendbar:
Getestet habe ich es in Python 3.5.1 und Python 2.7.8, und es schien zu funktionieren.
Dem Ergebnis müssen so viele stellen, wie angegeben durch den dezimal-Kontext die Funktion ausgeführt, die in der Standardeinstellung ist 28 Dezimalstellen. Gemäß der Dokumentation für die
power
Funktion in derdecimal
Modul "Das Ergebnis ist gut definiert, aber nur "fast immer richtig rund".". Wenn Sie ein genaueres Ergebnis, es kann getan werden, wie folgt:InformationsquelleAutor Elias Zamaria
Versuchen Umwandlung des Exponenten in einem floating-Nummer, da die default-Verhalten /in Python integer-division
n**(1/float(3))
OverflowError: long int zu groß ist, um konvertieren zu schweben, es würde nur nicht funktionieren, weil die große Zahl konvertiert werden kann
Soweit ich das beurteilen kann, gab es keinen Hinweis darauf, dass es benutzt Python 2.
InformationsquelleAutor Manuel Ferreria
Gut, wenn Sie nicht besonders besorgt über die Präzision, die Sie konvertieren konnte es zu einem stechen, hauen Sie einige Ziffern, die Verwendung der exponent-Funktion, und dann multiplizieren Sie das Ergebnis mit der Wurzel, wie viel Sie abgeschnitten.
E. g. 32123 ist etwa gleich 32 * 1000, die kubische Wurzel ist über equak der kubischen Wurzel von 32 * kubische Wurzel von 1000. Letzteres kann berechnet werden durch Division der Anzahl der 0EN von 3.
Dies vermeidet die Notwendigkeit für die Verwendung von Erweiterungsmodulen.
Auch das konvertieren in string könnte problematisch werden mit riesigen zahlen.
Nicht in der definition von großen, gab er in der post. Auch, nicht genau wissen, welches format er akzeptiert die Eingabe, aber die grundlegende Idee für diese Art der Rundung wird in den meisten Formaten.
Er hat funktionierenden code, einfach nur die problem Präzision
InformationsquelleAutor Brian