Frage von ooga13, 119

Welche Programmiersprache ist die Beste, um mathematische Berechnungen zu lösen?

Hilfreichste Antwort - ausgezeichnet vom Fragesteller
von hypergerd, Community-Experte für Mathematik, 65

Habe mal Geschwindigkeiten für das Potenzieren sehr großer Zahlen verglichen:

http://www.lamprechts.de/gerd/BisZuWelcherNKalleStringKombi.htm

Tabelle unten.

Alles größer 3 hoch 1 Mrd. ist fast nur noch mit c oder c++ lösbar.

Auch der Weltrekordler der Pi-Nachkommastellen-Berechnung (13,3 TByte)

konnte nur mit c++ alles aus neuen 64 Bit CPUs herausholen:

Multitasking (da fallen schon die ersten Sprachen weg)

Compiler statt Interpreter (spätestens hier fällt c# raus)

direktes Ansprechen des RAM (16 GB oder mehr) ohne Umwege

AVX-Befehle (können 256-Bit Befehle z.B. beim i7 )

Alle Grundrechenarten oder Potenzieren ganzer Zahlen bis 1000 Stellen geht relativ gut mit fast allen Sprachen. Danach wächst die Rechenzeit enorm an!

Kommentar von hypergerd ,

Das bezog sich nur auf Geschwindigkeit! Da man sehr hardware-nahe arbeiten muss, geht Übersichtlichkeit verloren!

Allein die scheinbar primitive Multiplikation sehr großer Zahlen optimiert mit FFT-Multiplikation und 

https://de.wikipedia.org/wiki/Karazuba-Algorithmus

ist enorm viel "Drumherum".

Mathematiker abreiten auch gern mit Programmen wie Mathematica, wo bereits Teile wie numerische Integration optimiert sind. Das ist dann mehr Konfigurieren als Programmieren...

(Nachteil: sehr teuer)

Dann gibt es in JAVA fertige Funktionen wie 

BigInteger.nextProbablePrime()

wo man in sekundenschnelle 5000 stellige Primzahlen finden kann!

Diese Funktion ist bereits optimiert, da braucht man nicht alles "neu erfinden" mit c...

Kommentar von ooga13 ,

Ich programmiere aktuell mit eclipse, also javabasiert. Ich komme damit auch super zurecht, nur dauern die Rechnungen teilweise ewig.. Meinen Sie, dass eine Mathe-Libraries helfen könnte?

Kommentar von hypergerd ,

"Mathe-Libraries" ist so ein "Denglisch" -> nichts konkretes.

Es gibt hunderte ... jeder kleine Programmierer hat seine eigene(n)

"Libraries".

Mal ganz konkret: was genau willst Du auf wieviele (Nachkomma-)Stellen berechnen?

Allein bei JAVA gibt es zig Hersteller (angefangen bei Oracle) von Interpretern...

bis hin zu Compilern!
Die BigInteger-Befehle von Oracle sind bereits gut optimiert.

Dann gibt es oft Abkürzungs-Algorithmen z.B. bei den Fibonacci-Zahlen, die JAVA richtig schnell machen können...

Kommentar von ooga13 ,

Ich programmiere bereits mit BigDecimal, die Ergebnisse sind auch sehr genau. Die Berechnung dauert nur eben ewig. Teil der Berechnungen sind sehr große Potenzen, die in einer Summe addiert werden.  

Kommentar von hypergerd ,

Immer noch zu ungenau: bitte konkretes Beispiel!

"...dauert ...ewig..." kann 10 min oder 10 Wochen sein

"große Potenzen" -> genaue Basis, Exponent, Nachkommastellen

BigDecimal ist universell (String mit Angabe von setScale und RoundingMode). Wenn man hier "zu genau" einstellt, rechet er mehr als nötig. Oft ist BigInteger schneller.

Nimm ein Beispiel, nenne Deine Rechenzeit (mindestens 3 min) und nenne Dein Ergebnis.

Dann kann ich vergleichen.

Kommentar von TeeTier ,

Sehr gute Antwort (inkl. der dazugehörigen Kommentare)! :)

konnte nur mit c++ alles aus neuen 64 Bit CPUs herausholen:

Nur mal aus Interesse: Benutzt du die BBP-Formel um parallel zu rechnen?

Und du speicherst ja verschieden lange Sequenzen von aufeinander folgenden Nachkommastellen in einer DB, aber in welcher Form speicherst du eigentlich den kompletten rohen Strom aller Zahlen? Du musst ja irgendwie Wahlfreien Zugriff darauf implementieren.

Ich habe das so gemacht, dass ich den DPD-Algorithmus (3 Dezimalzahlen pro 10 Bit) etwas abgewandelt habe, und pro 64 Bit 6 * 10 = 60 Bit zur Speicherung von 6 * 3 = 18 Dezimalziffern benutze, und die restlichen 4 Bit für eine 8-Bit Prüfsumme verwende, die auf ein Nibble "zusammengefaltet" wird.

Damit komme ich auf 1024^3 * 8 / 64 * 6 * 3 = 2415919104 Nachkommastellen pro Gigabyte des Speichermediums, habe fast ohne jeglichen Rechenaufwand Wahlfreien Zugriff und zur Sicherheit noch eine Prüfsumme pro 64 Bit Block.

Als reine BCD-Zahlen hätte ich ca. 20% des Platzes verschenkt, und keine Sicherheit, da keine Prüfsumme vorhanden.

Außerdem schreibe ich das alles als 512 Byte-Blöcke direkt auf den Datenträger, ohne Dateisystem und ohne Partitionstabelle, was die Schreib- und Lesegeschwindigkeit nochmal um ein paar ganze Prozent erhöht.

Deshalb wollte ich nur mal nachfragen, ob du da vielleicht eine noch viel elegantere Lösung verwendest - wie gesagt, nur für die Rohdaten. Und hast du evtl. mal mit dem Gedanken gespielt, die SQL-DB zu verwerfen, und ein eigenes System (z. B. einen Baum) direkt auf der Platte zu implementieren? Wäre das nicht deutlich schneller und Platzsparender, als SQL? Das würde mich mal interessieren. :)

Multitasking (da fallen schon die ersten Sprachen weg)

Kontextwechsel bei Prozessen und Threads sind ja extrem teuer, wenn man bedenkt, was dabei alles gepusht und gepopt werden muss.

Hast du mal versucht einen eigenen Linux-Kernel mit angepasster HZ-Konstante (Diffies) zu bauen, und beim Boot-Vorgang dem System nur einen einzigen Kern zuzuweisen?

Theoretisch würde dann der Kernel, die Dämonen und alle anderen Prozesse nur noch auf einem einzigen Kern laufen, deinem eigenen Programm kannst du aber trotzdem sämtliche restlichen freien Kerne und / oder CPUs zuweisen, sodass die darauf laufenden Prozesse exorbitant lange (Stichwort HZ) und deutlich unterbrechungsfreier laufen. Wenn man dabei nicht mindestens (!) 10% bis 20% mehr Leistung heraus bekommt, sollte es mich doch sehr wundern. :)

(Nachteil: sehr teuer)

Mathematica ist natürlich das Nonplusultra, aber für sehr viele Dinge reicht auch das kostenlose GNU Octave aus.

Das Matlab-kompatible isprime() arbeitet dabei ähnlich wie BigInteger.isProbablePrime(), hat aber auch einige andere Nachteile bzgl. der Typgröße.

Naja, schönen Abend noch! :)

Kommentar von TeeTier ,

Edit: Ich meine natürlich "Jiffies" und nicht "Diffies" ... das kommt davon, wenn man sich zuvor mit dem DH-Schlüsseltausch beschäftigt hat und die Gedanken nicht frei bekommt. :)

Kommentar von hypergerd ,

BBP -> nein
Ich bezog mich nur auf die Multiplikation.
Und wie bereits geschrieben, habe ich das
per FFT getan. Da sin- Werte nur 14 Stellen genau sind,
ist man auf etwa 500 Mio. Stellen begrenzt.
Dann Karazuba-Algorithmus zur Verdopplung.
Die Zahl liegt im Integer-Array.
FFT-Transformation und die Karazuba-Teilsummen
können gut parallelisiert werden.

Kann man mit GNU Octave
3 hoch 402653184 exakt berechnen?
Wenn JA, wie schnell?

Antwort
von eleteroj, 63

vor ein paar Jahren hätte man ohne zu überlegen gesagt: Fortran.

Aber inzwischen sind andere Entwicklungsumgebungen/Sprachen (allen voran Embarcadero RAD Studio mit Object-Pascal oder C++) erheblich komfortabler und bieten genug implementierte Mathe-Funktionen, um wirklich jede Aufgabe zu realisieren.

Daneben gibt es für besondere Mathe-Bereiche Spezial-Sprachen, zB für Statistik-Aufgaben die Sprache R oder für Symbolische Algebra die Mathematik-Umgebung "Euler Toolbox" mit Maxima.

Kommentar von hypergerd ,

Hört sich alles sehr interessant an. Ich suche noch zum Vergleich die genauen Rechenzeiten für Vergleiche von:

3 hoch 402653184

Ein Mathe-Prof. hatte mal Mathematica "virtuell" rechnen lassen und nur wenige Sekunden herausbekommen. Beim genauen Nachfragen für "echtes Rechnen auf Festplatte" kamen dann zig mal größere Zeiten heraus...

Kommentar von eleteroj ,

das ist hardwareabhängig und auch davon, wie optimiert der Compiler arbeitet, und wie effizient die eingesetzten Algorithmen für die x64bit Architektur sind; die Compilerhochsprache selbst hat darauf den geringsten Einfluss.

Benchmarks zu deiner Frage sind leider nicht bekannt.

Antwort
von Omnivore11, 11

Kommt ein wenig drauf an was genau du vorhast: Vielleicht beschäftigst du dich mal mit MatLab, R und einigen Optimierungsprogrammen. Je nachdem was du vor hast, eignet sich die eine Sprache besser als die andere.

Antwort
von Berny96, 71

An sich kann man mit jeder Sprache sowas machen. 
Wenn ich aber richtig gehört habe verwenden viel Mathematiker und Physiker F#. Soll für diese Zwecke gemacht worden sein.

Antwort
von Lilalaunebaer69, 57

ForTran ?

Antwort
von PhotonX, 73

Numerisch oder symbolisch?

Kommentar von ooga13 ,

numerisch

Antwort
von kingbongo, 65

Matlab für Mathematiker, R für Statistiker.

Keine passende Antwort gefunden?

Fragen Sie die Community