Frage von MorsGER, 86

Taschenrechner für (extrem) große Zahlen?

Hallo Community,

ich habe derzeit mit einem Problem zu kämpfen, dass ich mit eigenen Mitteln nicht lösen kann. Ich arbeite in einem eigenen Programm mit ziemlich großen Zahlen. Diese haben im Durchschnitt über 175 Millionen Ziffern. (Also nicht nur z.b. 9 wie bei der Zahl: 893247584)

Ich habe bereits mit Basic-Programmiersprachen probiert ein Programm zu schreiben, welches mit diesen Zahlen umgehen kann (multiplizieren, dividieren, usw.), bin dabei aber bisher gescheitert.

Kennt jemand von euch ein Taschenrechner-Programm, welches mit solchen großen Zahlen umgehen (rechnen!) kann? Oder hat vielleicht jemand von euch eins selbst geschrieben?

Hinweis am Rande: Online Taschenrechner o.ä. helfen da nicht viel, da sie nicht im Stande sind die Zahl anzuzeigen, welche zudem durchaus 200MB groß ist.

Hinweis 2: Das Programm muss auch nicht unbedingt per Nummerneingabe funktionieren. Mir liegen die Zahlen als TXT-Dateien vor.

Ich bedanke mich für jede Hilfe.

Hilfreichste Antwort - ausgezeichnet vom Fragesteller
von hypergerd, 52

Bei solch große Zahlen spricht man nicht mehr von Taschenrechner (da keiner über 100 Mio. Ziffern per Hand eingibt) sondern von Programmen. Neben dem sehr teuren Mathematica gibt es auch kostenlose Lösungen im Netz: siehe Antwort von Orsovai

Was viele nicht beachten: die Laufzeit wächst bei Rechnungen oberhalb 100 Mio. und komplizierter als Addition exponentiell an.

Da Du Basic kennst, schau Dir mal 

http://purebasic.fr/german/viewtopic.php?f=16&t=28723

an. Das ist ein echter 64 Bit Compiler -> aber noch nicht schnell genug!

Unter http://www.gerdlamprecht.de/BisZuWelcherNKalleStringKombi.htm

habe ich mal "3 hoch x" mit verschiedenen Programmen untersucht (Tabelle unten).

Neben dem fertigen 

https://www.gnu.org/software/bc/

oder

bigAl 2.4 (in JAVA)

kann man natürlich auch direkt mit JAVA's bigInt rechnen lassen.

Richtig schnell wird's erst, wenn man per c++ alles aus der CPU herausholt:

- 256 Bit AVX-Befehle

- FFT Multiplikation

- Multitasking

- Karazuba Multiplikation

- 16 GB RAM + Datei-Splittung

Hinweis: bereits bei der Multiplikation zweier Zahlen ist es ein gewaltiger Unterschied, ob nur 1 Zahl über 100 Mio. Ziffern hat, oder beide!!!

Antwort
von Schachpapa, 50

Brauchst du die Zahlen in voller Genauigkeit, z.B. für Teilbarkeitsbetrachtungen oder andere Aufgaben aus der Zahlentheorie?

Ansonsten reicht doch eigentlich für die allermeisten Aufgaben, dass man die ersten 5-15 Stellen weiß und die Größenordnung als 10er Potenz, z.B.
69! = 1,71122e+98

Wenn volle Genauigkeit:

Python hat eine recht einfache Syntax und rechnet mit Ganzzahlen von (im Prinzip) beliebiger Länge. Das Quadrieren einer Zahl mit 1-Mio-Stellen geht ratzfatz, das Zählen der Stellen dauert allerdings einen Moment, weil dafür vom 2er ins Dezimalsystem umgerechnet werden muss.

Wenn du Basic kannst, kannst du auch schnell Python. Probier's aus, du willst hinterher nichts anderes mehr ;-)

Antwort
von Orsovai, 47

Es gibt spezielle Progammiersprachen oder Bibliothekten für Langzahlarithmetik.

Hier findest Du einige: https://de.m.wikipedia.org/wiki/Langzahlarithmetik

Antwort
von androhecker, 45

Mit welchen Zahlen arbeitest du denn? Normalerweise sind nur die ersten Stellen wichtig, den Rest macht man mit Potenzen.
(So arbeiten auch die Zahlentypen double und float, nur nicht in solchen Ausmaßen)

Falls du exakte Zahlen willst musst du selbst mit byte Arrays rechnen, oder Funktionen wie BigDecimal/BigInteger in Java nutzen.

Ich kann mir aber nicht vorstellen, für was man eine Genauigkeit von so vielen Stellen benötigt.

Antwort
von Geograph, 41

Ich kann Dir leider gar nicht helfen :-(

Aber mich würde sehr interessieren, in welcher naturwssenschaftliche Disziplin Du mit diesen "ziemlich großen Zahlen.... mit im Durchschnitt über 175 Millionen Ziffern." konfrontiert bist?

Kommentar von MorsGER ,

Danke trotzdem für das Teilhaben an der "Diskussion".

Hier handelt es sich um einen Teilbereich der Kryptographie. :)

Kommentar von Geograph ,

Danke

Antwort
von LeonardM, 58

Benutze statt 32bit integer werten 64bit integerwwerte. je machdem ob sie positiv oder negativ sind noch unbedingt unsigned oder signed (erhöht die max mögliche zahl).

In 64bit integer variablen können zahlen gespeichert werden von 2^(64)

Kommentar von PerfectMuffin ,

175 Millionen Ziffern

Kommentar von LeonardM ,

Achja.. ziffern.. da war was.. :D sorry falsch gelesen

Kommentar von MorsGER ,

Das Speichern als Integer ist nicht das Problem. Die Zahl kann ich in meinem Programm (im Arbeitsspeicher) haben. Nur die Rechenoperationen werden nicht ausgeführt (sondern nur bis 15-Stellige Zahlen).

Antwort
von PerfectMuffin, 48

Mit Byte-Arrays lassen sich beliebig große Zahlen darstellen.

Man kann mittels double dabble-Algorithmus Binär und Dezimal ineinander umrechnen.

Kommentar von MorsGER ,

Erstmal danke. Aber das Darstellen ist nicht das Problem. Das Rechnen mit diesen Zahlen ist es.

Das Programm führt komplexe Rechenoperationen (z.B. Multiplikation) von Zahlen mit mehr als 15 Stellen einfach nicht mehr aus.

Kommentar von PerfectMuffin ,

Multiplikation ist einfach, mach dir ein Programm, das 8bit-Zahlen multipliziert(ohne MAL-Zeichen) und skaliere es dann hoch.

Aber viel Spaß mit Division.

Viele Frameworks haben Datenstrukturen wie Javas BigInteger, in denen sowas implementiert sein kann.

Keine passende Antwort gefunden?

Fragen Sie die Community