Große Zahlen in C #
-
05-07-2019 - |
Frage
Zur Zeit bin ich borgen java.math.BigInteger
von den J # Bibliotheken wie hier beschrieben . Mit noch nie zuvor eine Bibliothek für die Arbeit mit großen ganzen Zahlen verwendet wird, scheint dies in der Größenordnung von 10 mal langsam, langsamer, auch für ulong
Länge Zahlen. Hat jemand irgendwelche besseren (vorzugsweise kostenlos) Bibliotheken, oder ist das Leistungsniveau normal?
Lösung
Wie von .NET 4.0 können Sie die System.Numerics.BigInteger Klasse. Siehe Dokumentation hier: http: // msdn.microsoft.com/en-us/library/system.numerics.biginteger(v=vs.110).aspx
Eine weitere Alternative ist die Klasse rel="noreferrer">.
IntX ist eine beliebige Genauigkeit Integer-Bibliothek in reinem C # geschrieben 2.0 mit schnellem - O (N · log N) - Multiplikation / Division Algorithmen Implementierung. Es bietet alle Grundoperationen auf ganze Zahlen wie Addition, Multiplikation, Vergleichen, bitweise Verschiebung usw.
Andere Tipps
F#
auch Schiffe mit ein. Sie können ihn unter Microsoft.FSharp.Math
erhalten.
Die System.Numerics.BigInteger
Klasse in .NET 4.0 basierend auf Microsoft.SolverFoundation.Common.BigInteger
von Microsoft Research.
Die BigInteger
Klasse Solver-Stiftung sieht sehr performant. Ich bin nicht sicher, welche Lizenz sie unter freigegeben wird, aber Sie können es bekommen hier (download und Solver Foundation installieren Sie das Microsoft.Solver.Foundation.dll).
Ich rechne damit Sie die Implementierung optimieren könnte, wenn Sie alle Vorgänge auf BigInts durchführen, die Ergebnisse kleiner als ein nativer Typ (z. B. int64) auf die einheimischen Arten und nur befassen sich mit dem großen Array zurück gehen, wenn Sie wollen Überlauf.
Bearbeiten Diese Implementierung auf Codeproject , scheint nur 7-mal langsamer ... Aber mit dem oben Optimierung könnte man es fast identisch mit nativen Typen für kleine Zahlen auszuführen bekommen.
Ich bin mir nicht sicher über die Leistung, aber Ironpython hat auch eine BigInteger-Klasse. Es ist im Microsoft.Scripting.Math Namespace.
Ja, es wird langsam sein, und 10x Unterschied ist, über das, was ich erwarten würde. BigInt verwendet ein Array eine beliebige Länge darzustellen, und alle Vorgänge manuell durchgeführt werden müssen (im Gegensatz zu den meisten math gegenüber, die direkt mit der CPU durchgeführt werden kann)
Ich weiß nicht einmal, ob Hand-Codierung wird es in der Montage gibt Ihnen viel von einem Performance-Gewinn über 10x, das ist verdammt nah. Ich würde nach anderen Wegen suchen, um es zu optimieren - manchmal abhängig von Ihrem mathematischen Problem gibt es kleine Tricks, die Sie tun können, um es schneller
.Ich benutzte BigInteger bei einem früheren Job. Ich weiß nicht, welche Art von Performance-Anforderungen Sie haben. Ich habe es nicht in einer leistungsintensive Situation nutzen, aber hatte nie Probleme mit ihm.
Das mag wie ein seltsamer Vorschlag klingen, aber haben Sie testen die dezimal Typ, um zu sehen, wie schnell es funktioniert?
Dezimalbereich beträgt ± 1,0 × 10 ^ -28 7,9 × 10 ^ 28 bis ±, so ist es immer noch nicht groß genug sein kann, aber es ist größer als eine ULONG.
Es sollte eine BigInteger-Klasse in .NET 3.5, aber es wird geschnitten .
Dies wird nicht helfen, aber es sollte eine BigInteger-Klasse in .NET 3.5 sein; es wurde geschnitten, sondern von Aussagen bei PDC gemacht, wird es in .Net 4.0 sein. Sie haben offenbar viel Zeit zu optimieren es ausgegeben, so sollte die Leistung viel besser als das, was Sie bekommen jetzt.
Ferner diese Frage ist im Wesentlichen ein Duplikat von Wie kann ich vertrete eine sehr große ganze Zahl in .NET?
Sehen Sie die Antworten in dieser Thread . Sie werden eine der Dritt großer Integer-Bibliotheken / Klassen zur Verfügung, oder warten Sie für C # 4.0 verwenden müssen, die ein native BigInteger Datentyp enthalten werden.
Das sieht sehr vielversprechend aus. Es ist ein C # Wrapper über GMP .
http://web.rememberingemil.org/Projects/GnuMpDotNet/GnuMpDotNet.html
Es gibt auch andere BigInteger Optionen für .Net Mpir.Net
Sie können auch die Math.Gmp.Native Nuget Paket, das ich geschrieben habe. Sein Quellcode ist auf GitHub und Dokumentation ist hier . Es macht die gesamte Funktionalität des GMP Bibliothek .NET, die als hochoptimierte beliebiger Genauigkeit arithmetische bekannt ist Bibliothek.
beliebige Genauigkeit ganz Zahl wird von dem mpz_t Typ. Operationen auf diesen ganzen Zahlen alle mit dem mpz_
Präfix beginnen. Für Beispiele, mpz_add oder mpz_cmp . Quellcode-Beispiele werden für jede Operation gegeben.