SwiftにはJavaのBigIntegerクラスに相当するものがありますか? UInt64の最大数よりも大きい正の整数でSwiftで大きな計算を行うことを決めています。これらの数を処理する最良の方法は何ですか?
CocoaのNSDecimalNumber
クラスを使用できます。これは無限の精度ではありませんが、38桁の10進数の精度を表すことができます。これは、必要なものには十分かもしれません。
また、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
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"
あなたは私に信用を与えることなく自由にそれを使うことができます、そしてあなたが望むなら貢献してください。
Swiftで大きな整数を使用できるようにするライブラリを作成しました。 JavaのBigIntegerと同様の方法で。作業をより便利にするための演算子のオーバーロードもあります。例:
let a = BigInteger("111111111111111111111111111111111111111111111110000000001")!
let b = 999_999_999
let c = a + b // 111111111111111111111111111111111111111111111111000000000
ここにあります。
https://github.com/dankogai/Swift-pons
実際、BigIntはその一部にすぎません。 BigIntに加えて、次のものが得られます。
しかし何よりも、プロトコル指向であるため、次のように整数全体を拡張できます。
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)
ダン番号ジェネレーター
公式のSwiftリポジトリ: https://github.com/Apple/Swift/blob/master/test/Prototypes/BigInt.Swift でBigIntのプロトタイプを見つけました=
おそらく、プロジェクトにコピーして使用することができます。いつかは標準ライブラリに追加されるでしょう。