¿BigInteger equivalente en Swift?
largenumber (6)
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<T:POInteger>(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
¿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?
Encontré un prototipo de BigInt en el repositorio 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.
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
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 suma, 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
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.
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