Подтвердить что ты не робот

Эквивалент BigInteger в Swift?

Есть ли эквивалент класса Java BigInteger в Swift? Я связываю большие вычисления в Swift с положительными целыми числами, большими, чем максимальное число UInt64. Каков наилучший способ обработки этих чисел?

4b9b3361

Ответ 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

https://github.com/kirsteins/BigInteger

Ответ 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

Возможно, вы можете просто скопировать его в свой проект и использовать его. Может быть, когда-нибудь он будет добавлен в стандартную библиотеку.