Actualmente estoy borrowing java.math.BigInteger
from the J# libraries as described here. Nunca antes había usado una biblioteca para trabajar con enteros grandes, esto parece lento, del orden de 10 veces más lento, incluso para números de longitud ulong
. ¿Alguien tiene bibliotecas mejores (preferiblemente gratuitas), o es este nivel de rendimiento normal?enteros grandes en C#
Respuesta
A partir de .NET 4.0, puede utilizar la clase System.Numerics.BigInteger. Consulte la documentación aquí: http://msdn.microsoft.com/en-us/library/system.numerics.biginteger(v=vs.110).aspx
Otra alternativa es la clase IntX.
IntX es una biblioteca de precisión arbitraria enteros escrito en C# puro 2.0 con rapidez - O (N log N *) - multiplicación/división algoritmos aplicación. Proporciona todas las operaciones básicas con números enteros como suma, multiplicación, comparando, bit a bit cambiando etc.
Para el registro, el ensamblaje 'System.Numerics' no se referencia de manera predeterminada en los proyectos nuevos, por lo que debe agregarse antes de poder utilizar' BigInteger'. –
En el Explorador de soluciones, haga clic con el botón derecho en Referencias> Agregar referencia> Buscar numéricos y verifique la referencia encontrada. Ahora puede agregar "using System.Numerics"; en la parte superior de su archivo .cs – Jan
No estoy seguro del rendimiento, pero IronPython también tiene una clase BigInteger. Está en el espacio de nombres Microsoft.Scripting.Math.
Sí, será lento, y la diferencia de 10 veces es lo que esperaba. BigInt usa una matriz para representar una longitud arbitraria, y todas las operaciones deben realizarse manualmente (a diferencia de la mayoría de las matemáticas que se pueden hacer directamente con la CPU)
Ni siquiera sé si codificar manualmente en el ensamblaje le dará una ganancia de rendimiento de más de 10 veces, eso es bastante cercano. Buscaría otras formas de optimizarlo; a veces, dependiendo de su problema matemático, hay pequeños trucos que puede hacer para hacerlo más rápido.
Utilicé Biginteger en un trabajo anterior. No sé qué tipo de rendimiento necesita. No lo usé en una situación de alto rendimiento, pero nunca tuve ningún problema con eso.
Esto puede sonar como una sugerencia extraña, pero ¿ha probado el tipo decimal para ver qué tan rápido funciona?
El rango decimal es ± 1.0 × 10^-28 a ± 7.9 × 10^28, por lo que aún no es lo suficientemente grande, pero es más grande que un ulong.
Se suponía que debía haber una clase BigInteger en .NET 3.5, pero it got cut.
Sí, vi ese anuncio cuando originalmente buscaba una biblioteca BigInt. Me pone triste. Oh bien. –
Tendría que tener cuidado: usar un decimal podría causar problemas de redondeo. – Blorgbeard
Decimal no causa errores de redondeo. No es un punto flotante. – Kibbee
Creo que podría optimizar la implementación si realiza todas las operaciones en BigInts que van a devolver resultados más pequeños que un tipo nativo (por ejemplo, int64) en los tipos nativos y solo trata con la gran matriz si va sobrepasar.
edición Este implementation on codeproject, parece sólo 7 veces más lento ... Pero con la optimización mencionada anteriormente podría conseguir que se realice de manera casi idéntica a tipos nativos para los números pequeños.
Creo que la biblioteca J # usa Byte internamente, tiene una función ToByteArray() al menos, y ninguna otra función ToArray(). Esta podría ser una idea si quería hacer mi propia versión, aunque tampoco estoy demasiado emocionado con esa idea. –
¿Con qué tamaño de datos está trabajando, en general? ¿Las cosas desbordan el tamaño de Int64 de forma regular, o es una excepción? –
Lo hago principalmente caso por caso, estableciéndolo en BigInt cuando me encuentro con un desbordamiento con un bloque {} marcado. Si lo hace una vez, es muy probable que lo haga repetidas veces. –
Esto no lo ayudará, pero se suponía que debía haber una clase BigInteger en .Net 3.5; se cortó, pero de las declaraciones hechas en PDC, estará en .Net 4.0. Al parecer, han dedicado mucho tiempo a optimizarlo, por lo que el rendimiento debería ser mucho mejor que el que obtendrás ahora.
Además, esta cuestión es esencialmente un duplicado de How can I represent a very large integer in .NET?
BigInteger está en 3.5 pero es una clase interna.;) Es simplemente que no está listo para el horario de máxima audiencia. –
Ver las respuestas en este thread. Tendrá que usar una de las librerías/clases de enteros grandes de terceros disponibles o esperar C# 4.0 que incluirá un tipo de datos BigInteger nativo.
F#
también se envía con uno. Puede obtenerlo al Microsoft.FSharp.Math
.
La clase System.Numerics.BigInteger
en .NET 4.0 se basa en Microsoft.SolverFoundation.Common.BigInteger
de Microsoft Research.
La clase BigInteger
de la Solver Foundation tiene un aspecto muy bueno. No estoy seguro de la licencia bajo la que se publica, pero puede obtenerlo here (descargue e instale Solver Foundation y busque Microsoft.Solver.Foundation.dll).
Aquí hay varias implementaciones de BigInteger en C#. He usado BigInteger aplicación de Mono, funciona bastante rápido (lo he usado en CompactFramework)
Esto se ve muy prometedor. Es una envoltura C# sobre GMP.
http://web.rememberingemil.org/Projects/GnuMpDotNet/GnuMpDotNet.html
También hay otras opciones para BigInteger .Net here en particular, Mpir.Net
Mpir.NET se basa en parte en el contenedor GMP de Emil. La otra parte es X-MPIR y, fusionada, se obtiene la conveniencia de la envoltura de Emil y el rendimiento de X-MPIR. –
- 1. enteros arbitrariamente grandes en C#
- 2. Manejo de enteros "grandes" en C#
- 3. C++ manejo de enteros muy grandes
- 4. ¿Cómo definimos enteros grandes?
- 5. Javascript sumando enteros grandes
- 6. grandes literales enteros negativos
- 7. Cómo manejar enteros arbitrariamente grandes
- 8. enteros grandes con longitud fija
- 9. extremadamente grandes números enteros en PHP
- 10. Almacenamiento de enteros muy grandes en MySQL
- 11. Aritmética con enteros arbitrariamente grandes en PHP
- 12. Cálculo de números enteros muy grandes
- 13. Multiplicación rápida de enteros muy grandes
- 14. Operaciones bit a bit con enteros grandes
- 15. acelerar la "conversión base" para enteros grandes
- 16. Concatenar enteros en C#
- 17. ¿Cómo declarar y usar grandes matrices de mil millones de enteros en C?
- 18. Definir rangos enteros en C
- 19. Eliminar duplicados de una matriz de enteros grandes utilizando Java
- 20. ¿Hay memset() que acepta números enteros más grandes que char?
- 21. Entender el algoritmo de Schönhage-Strassen (multiplicación de enteros grandes)
- 22. de error de desbordamiento de VB6 con grandes números enteros
- 23. ¿Manejar números grandes en C++?
- 24. banderas grandes enumeraciones en C#
- 25. argumentos enteros para C++
- 26. Manejar enteros de longitud arbitraria en C++
- 27. ¿Cómo se multiplican los números enteros en C++?
- 28. C# deserializing enumeraciones de enteros
- 29. enteros sin signo en C++ para bucles
- 30. 2 bytes representan 3 enteros en C
buen enlace. Un par de gemas allí. –
El único problema es que requieren que se instalen los redistribuibles J #. El hecho de que J # está casi muerto (no fue en VS 2008 al menos) probablemente no ayude a promover eso. –
J # es solo para facilitar la migración de proyectos Java existentes a .NET. Definitivamente no incorporaría ninguna de sus bibliotecas en un nuevo proyecto. – MusiGenesis