web-dev-qa-db-fra.com

Équivalent BigInteger dans Swift?

Existe-t-il un équivalent de la classe BigInteger de Java dans Swift? Je tente de faire de gros calculs en Swift avec des entiers positifs plus grands que le nombre maximum d'UInt64. Quelle est la meilleure façon de gérer ces nombres?

30
liam923

Vous pouvez utiliser la classe NSDecimalNumber de Cocoa. Ce n'est pas une précision infinie, mais elle peut représenter 38 chiffres décimaux de précision, ce qui peut être suffisant pour ce dont vous avez besoin.

9
newacct

Je travaille également sur une bibliothèque BigNumber avec laquelle vous pouvez faire des calculs de grand nombre. En fait, la bibliothèque est basée sur la bibliothèque GNU Multiple Precision (GMP) et j'ai écrit un wrapper Objective-C/Swift. Actuellement de gros nombres entiers, y compris un beaucoup de surcharge d'opérateur, est possible. Un exemple de code va comme:

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())")

ce qui se traduit par:

Multiply 2 BigInts: bi1 * bi2 = 153933852140173822960829726365674325601913839520

Vous pouvez trouver la bibliothèque sur: https://github.com/githotto/osxgmp

9
iOS-Coder

J'ai écrit un gros entier et une grande double implémentation pour Swift, qui ne nécessite aucune bibliothèque supplémentaire. Copiez-le simplement dans votre projet. Il prend en charge les nombres entiers (BInt) et les fractions (BDouble) avec la plupart des opérateurs mathématiques courants comme l'addition, la soustraction, la multiplication, l'exponentiation, le module et la division. Certaines fonctions mathématiques optimisées comme factorielle ou gcd sont également implémentées.

Voici quelques exemples de code:

// 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"

Vous pouvez l'utiliser librement sans me donner de crédit, et veuillez contribuer si vous le souhaitez.

Vous pouvez le trouver ici: https://github.com/mkrd/Swift-Big-Integer

6
Marcel K.

J'ai écrit une bibliothèque qui vous permet de travailler avec de gros nombres entiers dans Swift. De manière similaire à BigInteger de Java. Il existe également des surcharges d'opérateur pour rendre le travail plus pratique. Exemple:

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

https://github.com/kirsteins/BigInteger

5
Kirsteins

C'est ici.

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

En fait, BigInt n'en est qu'une partie. En plus de BigInt, vous obtenez:

  • rational générique qui prend la forme Int8 à BigInt comme numérateur et dénominateur
  • complexe générique qui prend soit des entiers (entiers gaussiens) soit des types de nombres réels non seulement Double et Float mais aussi Rational.
  • Purement rapide. Fonctionne non seulement sur OS X, iOS et tvOS mais aussi Linux. Fonctionne joyeusement dans Playground.

Mais le meilleur de tous, il est orienté protocole afin que vous puissiez étendre un entier entier comme:

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 le générateur de nombres

5
dankogai

J'ai trouvé un prototype de BigInt dans le dépôt officiel Swift: https://github.com/Apple/Swift/blob/master/test/Prototypes/BigInt.Swift =

Vous pouvez probablement simplement le copier dans votre projet et l'utiliser. Peut-être qu'un jour, il sera ajouté à la bibliothèque standard.

4
Richard Venable