Есть ли эквивалент класса Java BigInteger в Swift? Я связываю большие вычисления в Swift с положительными целыми числами, большими, чем максимальное число UInt64. Каков наилучший способ обработки этих чисел?
Эквивалент BigInteger в Swift?
Ответ 1
Вы можете использовать класс NSDecimalNumber
из Cocoa. Это не бесконечная точность, но она может представлять собой 38 десятичных цифр точности, которых может быть достаточно для того, что вам нужно.
Ответ 2
Я также работаю над библиотекой 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
Ответ 3
Я написал библиотеку, которая позволяет работать с большими целыми числами в Swift. Аналогично Java BigInteger. Существуют также перегрузки операторов, чтобы сделать работу более удобной. Пример:
let a = BigInteger("111111111111111111111111111111111111111111111110000000001")!
let b = 999_999_999
let c = a + b // 111111111111111111111111111111111111111111111111000000000
Ответ 4
Я написал большую целую и большую двойную реализацию для быстрой, что не требует дополнительной библиотеки. Просто скопируйте его в свой проект. Он поддерживает целые числа (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
Ответ 5
Вот он.
https://github.com/dankogai/swift-pons
На самом деле BigInt является лишь частью этого. В дополнение к BigInt вы получаете:
- общий Rational, который принимает форму Int8 в BigInt как числитель и знаменатель
- generic 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)
Дэн генератор чисел
Ответ 6
Я нашел прототип BigInt в официальном репозитории Swift: https://github.com/apple/swift/blob/master/test/Prototypes/BigInt.swift
Возможно, вы можете просто скопировать его в свой проект и использовать его. Может быть, когда-нибудь он будет добавлен в стандартную библиотеку.