it-swarm.com.de

Big Integer in C #

Derzeit bin ich Ausleihe Java.math.BigInteger aus den J # -Bibliotheken wie hier beschrieben . Da eine Bibliothek noch nie für die Arbeit mit großen Ganzzahlen verwendet wurde, scheint dies langsam zu sein, in der Größenordnung von 10-mal langsamer, selbst für ulong -Zahlen. Hat jemand bessere (vorzugsweise kostenlose) Bibliotheken oder ist dieses Leistungsniveau normal?

64

Ab .NET 4.0 können Sie die System.Numerics.BigInteger-Klasse verwenden. Siehe Dokumentation hier: http://msdn.Microsoft.com/en-us/library/system.numerics.biginteger (v = vs.110) .aspx

Eine andere Alternative ist die IntX Klasse.

IntX ist eine Integer-Bibliothek mit willkürlicher Genauigkeit, die in reinem C # 2.0 mit einer Implementierung von Fast-O (N * log N) -Multiplikations-/Divisionsalgorithmen geschrieben wurde. Es bietet alle grundlegenden Operationen für Ganzzahlen wie Addition, Multiplikation, Vergleichen, bitweises Verschieben usw.

64
Davorin

F# Wird auch mit einem ausgeliefert. Sie können es bei Microsoft.FSharp.Math Bekommen.

9
Steve Severance

Das System.Numerics.BigInteger Klasse in .NET 4.0 basiert auf Microsoft.SolverFoundation.Common.BigInteger von Microsoft Research.

Die Klasse BigInteger der Solver Foundation sieht sehr performant aus. Ich bin nicht sicher, unter welcher Lizenz es veröffentlicht wird, aber Sie können es bekommen hier (Solver Foundation herunterladen und installieren und die Microsoft.Solver.Foundation.dll finden).

8
Rasmus Faber

Ich gehe davon aus, dass Sie die Implementierung optimieren können, wenn Sie alle Operationen auf BigInts ausführen, die auf den nativen Typen Ergebnisse zurückgeben, die kleiner als ein nativer Typ (z. B. int64) sind, und sich nur mit dem großen Array befassen, wenn Sie überlaufen.

edit Diese Implementierung in CodeProject scheint nur siebenmal langsamer zu sein ... Aber mit der obigen Optimierung könnten Sie sie zum Laufen bringen fast identisch mit einheimischen Typen für kleine Zahlen.

4
Sam Saffron

Hier sind einige Implementierungen von BigInteger in C #. Ich habe die BigInteger-Implementierung von Mono verwendet und arbeite ziemlich schnell (ich habe sie in CompactFramework verwendet)

Hüpfburg

Mono

4
Vadym Stetsiak

Ich bin mir nicht sicher über die Leistung, aber IronPython hat auch eine BigInteger-Klasse. Es befindet sich in dem Microsoft.Scripting.Math-Namespace.

3
Daniel Plaisted

Ja, es wird langsam und der 10-fache Unterschied ist ungefähr das, was ich erwarten würde. BigInt verwendet ein Array, um eine beliebige Länge darzustellen, und alle Vorgänge müssen manuell ausgeführt werden (im Gegensatz zu den meisten Berechnungen, die direkt mit der CPU ausgeführt werden können).

Ich weiß nicht einmal, ob die Handcodierung in Assembly einen großen Leistungszuwachs über das 10-fache bringt, das ist ziemlich nah. Ich würde nach anderen Möglichkeiten suchen, um es zu optimieren - manchmal gibt es abhängig von Ihrem mathematischen Problem kleine Tricks, die Sie tun können, um es schneller zu machen.

2
Bill K

Ich habe Biginteger bei einem früheren Job verwendet. Ich weiß nicht, welche Art von Leistung Sie benötigen. Ich habe es nicht in einer leistungsintensiven Situation verwendet, hatte aber nie Probleme damit.

2
Jason Jackson

Das mag sich nach einem seltsamen Vorschlag anhören, aber haben Sie den Typ decimal getestet, um zu sehen, wie schnell es funktioniert?

Der Dezimalbereich liegt zwischen ± 1,0 × 10 ^ −28 und ± 7,9 × 10 ^ 28, ist also möglicherweise noch nicht groß genug, aber größer als ein ulong.

Es sollte eine BigInteger-Klasse in .NET 3.5 geben, aber es wurde abgeschnitten .

2
Powerlord

Siehe die Antworten in diesem Thread . Sie müssen eine der verfügbaren Big-Integer-Bibliotheken/-Klassen von Drittanbietern verwenden oder auf C # 4.0 warten, das einen systemeigenen BigInteger-Datentyp enthält.

1
Scott Dorman

Dies wird Ihnen nicht helfen, aber es sollte eine BigInteger-Klasse in .Net 3.5 geben. es wurde abgeschnitten, aber nach Aussagen von PDC wird es in .Net 4.0 sein. Sie haben anscheinend viel Zeit damit verbracht, es zu optimieren, daher sollte die Leistung viel besser sein als das, was Sie jetzt bekommen.

Außerdem ist diese Frage im Wesentlichen ein Duplikat von Wie kann ich in .NET eine sehr große Ganzzahl darstellen?

1
technophile

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 hier , insbesondere Mpir.Net

1

Sie können auch das von mir geschriebene Math.Gmp.Native Nuget-Paket verwenden. Sein Quellcode ist verfügbar auf GitHub und Dokumentation ist verfügbar hier . Es stellt .NET die gesamte Funktionalität der Bibliothek GMP zur Verfügung, die als hochoptimierte Arithmetikbibliothek mit beliebiger Genauigkeit bekannt ist.

Ganzzahlen mit beliebiger Genauigkeit werden durch den Typ mpz_t dargestellt. Operationen auf diesen ganzen Zahlen beginnen alle mit dem mpz_ Präfix. Zum Beispiel mpz_add oder mpz_cmp . Quellcodebeispiele werden für jede Operation angegeben.

0
RobertBaron