¿BigInteger equivalente en Swift?

¿Existe un equivalente a la clase BigInteger de Java en Swift? Estoy tratando de hacer grandes cálculos en Swift con enteros positivos mayores que el número máximo de UInt64. ¿Cuál es la mejor manera de manejar estos números?

También estoy trabajando en una biblioteca BigNumber con la que puedes hacer algunos cálculos de números grandes. En realidad, la biblioteca se basa en la biblioteca GNU Multiple Precision (GMP) y escribí un contenedor Objective-C / Swift. Actualmente son posibles las matemáticas de números enteros grandes, incluida la sobrecarga de operadores. Un ejemplo de código es como:

var err : NSError? var bi1 = BigInt(nr: 12468642135797531) var bi2 = BigInt(nr: "12345678901011121314151617181920", error: &err) var res = bi1 * bi2 println("Multiply 2 BigInts: bi1 * bi2 = \(res.toString())") 

lo que resulta en:

 Multiply 2 BigInts: bi1 * bi2 = 153933852140173822960829726365674325601913839520 

Puede encontrar la biblioteca en: https://github.com/githotto/osxgmp

Puede usar la clase NSDecimalNumber desde Cocoa. No es una precisión infinita, pero puede representar 38 dígitos decimales de precisión, que pueden ser suficientes para lo que necesita.

Escribí una biblioteca que te permite trabajar con enteros grandes en Swift. De manera similar a BigInteger de Java. También hay sobrecargas de operadores para hacer el trabajo más conveniente. Ejemplo:

 let a = BigInteger("111111111111111111111111111111111111111111111110000000001")! let b = 999_999_999 let c = a + b // 111111111111111111111111111111111111111111111111000000000 

https://github.com/kirsteins/BigInteger

He escrito un gran número entero y una gran implementación doble para swift, que no requiere ninguna biblioteca adicional. Solo cópialo en tu proyecto. Es compatible con números enteros (BInt) y fracciones (BDouble) con la mayoría de los operadores matemáticos comunes como sum, resta, multiplicación, exponenciación, módulo y división. También se implementan algunas funciones matemáticas optimizadas como factorial o gcd.

Aquí hay algunos ejemplos de código:

 // Create a new number: let num = BInt(232) print(num) // prints "232" // You can also use Strings to create a number: let veryBig = BInt("-827846184963421874362418746238453267452971345218746328715380000000000") // Every standard math operator works well, even with normal Integers // Visit the github page for more informations let v0 = (BInt(5) + BInt(4)) - BInt(3) let v1 = veryBig * 1000 let v2 = vergBig ^ num let v3 = (veryBig ^ 50000) / (BInt(2) ^ 900) + 1 let v4 = gcd(abs(veryBig), num) // BDouble is very similar, you can find a detailed description on Github let fraction = BDouble("27", over: "31") print(fraction) // prints "27/31" 

Puede usarlo libremente sin darme crédito, y por favor contribuya si lo desea.

Puede encontrarlo aquí: https://github.com/mkrd/Swift-Big-Integer

Aquí está.

https://github.com/dankogai/swift-pons

En realidad, BigInt es solo una parte de eso. Además de BigInt obtienes:

  • Racional genérico que toma la forma Int8 a BigInt como numerador y denominador
  • Complejo genérico que toma enteros (enteros gaussianos) o tipos de números reales no solo dobles y flotantes sino también racionales.
  • Puramente rápido. Funciona no solo en OS X, iOS y TVOS sino también en Linux. Funciona felizmente en Playground.

Pero lo mejor de todo es que está orientado al protocolo, por lo que puedes extender un entero entero como:

 import PONS func fib(n:T)->T { // with a little better algorithm if n < T(2) { return n } var (a, b) = (T(0), T(1)) for _ in 2...n { (a, b) = (b, a+b) } return b } let F11 = fib(11 as Int8) let F13 = fib(13 as UInt8) let F23 = fib(23 as Int16) let F24 = fib(24 as UInt16) let F46 = fib(46 as Int32) let F47 = fib(47 as UInt32) let F92 = fib(92 as Int64) let F93 = fib(93 as UInt64) let F666 = fib(666 as BigInt) 

Dan el generador de números

Encontré un prototipo de BigInt en el repository oficial de Swift: https://github.com/apple/swift/blob/master/test/Prototypes/BigInt.swift

Probablemente solo puedas copiarlo en tu proyecto y usarlo. Tal vez algún día se agregará a la biblioteca estándar.