BigInteger equivalent in Swift?

26,707

Solution 1

You can use the NSDecimalNumber class from Cocoa. It is not infinite precision, but it can represent 38 decimal digits of precision, which may be enough for what you need.

Solution 2

I found a prototype of BigInt in the official Swift repository: https://github.com/apple/swift/blob/master/test/Prototypes/BigInt.swift

You can probably just copy it into your project and use it. Maybe some day it will be added to the standard library.

Solution 3

I'm also working on a BigNumber library with which you can do some big number calculations. Actually the library is based on the GNU Multiple Precision (GMP) library and I wrote an Objective-C / Swift wrapper. Currently big integer mathematics, including a lot of operator overloading, is possible. A code example goes like:

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

which results in:

Multiply 2 BigInts: bi1 * bi2 = 153933852140173822960829726365674325601913839520

You can find the library at: https://github.com/githotto/osxgmp

Solution 4

Here it is.

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

Actually BigInt is just a part of it. In addition to BigInt you get:

  • generic Rational that takes form Int8 to BigInt as numerator and denominator
  • generic Complex that takes either integers (gaussian integers) or real number types not only Double and Float but also Rational.
  • Purely swift. Runs not only on OS X, iOS and tvOS but also Linux. Works happily in Playground.

But the best of all, it is protocol-oriented so you can extend whole integer like:

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 the Number Generator

Solution 5

I have written a big integer and big double implementation for swift, that doesn't require any additional library. Just copy it into your project. It supports whole Numbers (BInt) and Fractions (BDouble) with most of the common math operators like addition, subtraction, multiplication, exponentiation, modulus and division. Some optimized math functions like factorial or gcd are also implemented.

Here are some code examples:

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

You can use it freely without giving me credit, and please contribute if you want.

You can find it here: https://github.com/mkrd/Swift-Big-Integer

Share:
26,707

Related videos on Youtube

liam923
Author by

liam923

Updated on July 09, 2022

Comments

  • liam923
    liam923 almost 2 years

    Is there an equivalent to Java's BigInteger class in Swift? I am tying to do large calculations in Swift with positive integers larger than UInt64 maximum valye.

    What is the best way to handle these numbers in Swift?

    • bames53
      bames53 over 9 years
      Decimal types are generally for financial calculation, not just arbitrary precision. In Java you want BigInteger, as your title indicates, not BigDecimal as your question body indicates. Cocoa does not include any BigInteger type.
  • Kirsteins
    Kirsteins over 9 years
    Can it be used in app submitted to Appstore? I guess it be cannot due to license restrictions.
  • real 19
    real 19 over 9 years
    Does this also work on iOS for arm64? Also are there any steps on how to include this in the iOS project listed somewhere?
  • Kirsteins
    Kirsteins over 9 years
    Yes, it works on arm64. Here is a good guide on how to add the framework dependency github.com/stephencelis/SQLite.swift#installation. You can use this guide with BigInteger.
  • real 19
    real 19 over 9 years
    Thanks, I trying following the steps you suggested , but I am unable to import it in my code after adding it. Could you record a video or list the steps with screenshots?
  • Kirsteins
    Kirsteins over 9 years
    Take a not that you have to build the framework either separately or by by building the app in order for syntax highlighting to work. Will try to record a video when I have some time.
  • iOS-Coder
    iOS-Coder over 9 years
    I'm not an expert in GNU- and AppStore-licence/restrictions, but IMHO as long as you keep the included references intact, such that the original authors can be identified, it should be no problem. By the way I'm happy to hear that the library is of use to you! Maybe you can share with us for what purposes it is used?!
  • nhgrif
    nhgrif about 8 years
    Is this a different precision to Double?
  • vikingosegundo
    vikingosegundo almost 8 years
    Usually the GPLs are interpreted in a way, that any software including it (compiled or linked) need to be GPL'd too. For my company this is a no-go for using any GPL'd code. This is also the opinion of our lawyers.
  • μολὼν.λαβέ
    μολὼν.λαβέ over 7 years
    float32 has about sd 7, float 64 sd 16, float80 sd34
  • Varun Naharia
    Varun Naharia over 6 years
    @Kirsteins How to covert Data into BigInteger using your library ?
  • Varun Naharia
    Varun Naharia over 6 years
    can it convert Data(NSData) to BigInt ?
  • Varun Naharia
    Varun Naharia over 6 years
    can it convert Data(NSData) to BigInt ?
  • Varun Naharia
    Varun Naharia over 6 years
    can it convert Data(NSData) to BigInt ?
  • iOS-Coder
    iOS-Coder over 6 years
    No it can not directly convert Date(NSDate) to BigInt, but if you try something like: var date: NSDate() let dateAsInt = Int32(date.timeIntervalSince1970 * 1000) var dateAsBigInt = BitInt(nr: dateAsInt) you should probably get wat you want. I have tried this on my computer yet, but this is probably the way I would do it. Hope this helps.
  • Ahmad F
    Ahmad F over 5 years
    Now it is Decimal struct :)
  • jeet.chanchawat
    jeet.chanchawat over 4 years
    Great lib... simple drag n drop... works for double as well.
  • Bohdan Savych
    Bohdan Savych about 2 years
    Decimal doesn't work correctly, for example, the factorial of 45 is 119622220865480194561963161495657715064383733760000000000 but code with Decimal produces 119622220865480194561963161495657715064000000000000000000
  • newacct
    newacct about 2 years
    @BohdanSavych: I did say it's not infinite precision