web-dev-qa-db-ja.com

SwiftでBigIntegerに相当しますか?

SwiftにはJavaのBigIntegerクラスに相当するものがありますか? UInt64の最大数よりも大きい正の整数でSwiftで大きな計算を行うことを決めています。これらの数を処理する最良の方法は何ですか?

30
liam923

CocoaのNSDecimalNumberクラスを使用できます。これは無限の精度ではありませんが、38桁の10進数の精度を表すことができます。これは、必要なものには十分かもしれません。

9
newacct

また、BigNumberライブラリを使用して、大きな数の計算を行うこともできます。実際には、ライブラリはGNU Multiple Precision(GMP)ライブラリに基づいており、Objective-C/Swiftラッパー。現在、多くの演算子のオーバーロードが可能です。コード例は次のようになります。

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

結果として:

Multiply 2 BigInts: bi1 * bi2 = 153933852140173822960829726365674325601913839520

ライブラリは次の場所にあります。 https://github.com/githotto/osxgmp

9
iOS-Coder

Swiftの大きな整数と大きな二重の実装を作成しました。追加のライブラリは必要ありません。プロジェクトにコピーするだけです。整数(BInt)と分数(BDouble)をサポートし、加算、減算、乗算、べき乗、モジュラス、除算などの一般的な数学演算子のほとんどを使用できます。階乗やgcdなどの最適化された数学関数も実装されています。

以下にコード例を示します。

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

あなたは私に信用を与えることなく自由にそれを使うことができます、そしてあなたが望むなら貢献してください。

ここにあります: https://github.com/mkrd/Swift-Big-Integer

6
Marcel K.

Swiftで大きな整数を使用できるようにするライブラリを作成しました。 JavaのBigIntegerと同様の方法で。作業をより便利にするための演算子のオーバーロードもあります。例:

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

https://github.com/kirsteins/BigInteger

5
Kirsteins

ここにあります。

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

実際、BigIntはその一部にすぎません。 BigIntに加えて、次のものが得られます。

  • 分子および分母としてInt8からBigIntの形式をとる汎用Rational
  • 整数(ガウス整数)または実数型のいずれかをとる一般的なComplex。DoubleおよびFloatだけでなくRationalも含みます。
  • 純粋にスウィフト。 OS X、iOS、tvOSだけでなく、Linuxでも実行できます。プレイグラウンドで楽しく動作します。

しかし何よりも、プロトコル指向であるため、次のように整数全体を拡張できます。

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)

ダン番号ジェネレーター

5
dankogai

公式のSwiftリポジトリ: https://github.com/Apple/Swift/blob/master/test/Prototypes/BigInt.Swift でBigIntのプロトタイプを見つけました=

おそらく、プロジェクトにコピーして使用することができます。いつかは標準ライブラリに追加されるでしょう。

4
Richard Venable