Actuellement, j'emprunte java.math.BigInteger
des bibliothèques J # comme décrit ici . N'ayant jamais utilisé de bibliothèque pour travailler avec de grands nombres entiers auparavant, cela semble lent, de l'ordre de 10 fois plus lent, même pour les nombres de longueur ulong
. Quelqu'un a-t-il de meilleures bibliothèques (de préférence gratuites) ou ce niveau de performance est-il normal?
Réponses
Trop de publicités?MS va introduire la classe System.Numerics.BigInteger dans .NET 4.0
Jusque-là, regardez la classe IntX .
IntX est une bibliothèque d'entiers de précision arbitraire écrite en C # 2.0 pur avec la mise en œuvre d'algorithmes rapides - O (N * log N) - multiplication / division. Il fournit toutes les opérations de base sur les entiers comme l’addition, la multiplication, la comparaison, le décalage au niveau du bit, etc.
La classe System.Numerics.BigInteger dans .NET 4.0 est basée sur Microsoft.SolverFoundation.Common.BigInteger de Microsoft Research.
La classe BigInteger de la fondation Solver semble très performante. Je ne suis pas sûr de la licence sous laquelle il est publié, mais vous pouvez l'obtenir ici (téléchargez et installez Solver Foundation et trouvez le fichier Microsoft.Solver.Foundation.dll).
Je pense que vous pourriez optimiser la mise en œuvre si vous effectuez toutes les opérations sur BigInts qui vont retourner des résultats plus petit qu'un type natif (par exemple. int64) sur les types natifs et ne portent que sur le grand tableau, si vous allez à débordement.
modifier Cette mise en œuvre sur codeproject, semble seulement 7 fois plus lent ... Mais avec le dessus de l'optimisation, vous pouvez l'obtenir pour presque identique pour les types natifs pour les petits nombres.