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

#c# #swift #biginteger

Вопрос:

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

Как лучше всего обрабатывать эти числа в Swift?

Комментарии:

1. Десятичные типы, как правило, предназначены для финансовых расчетов, а не только для произвольной точности. В Java вам нужен BigInteger, как указано в вашем названии, а не BigDecimal, как указано в тексте вашего вопроса. Какао не включает в себя какой-либо тип BigInteger.

Ответ №1:

Вы можете использовать NSDecimalNumber класс из Какао. Это не бесконечная точность, но она может представлять 38 десятичных знаков точности, чего может быть достаточно для того, что вам нужно.

Комментарии:

1. Является ли это другой точностью Double ?

2. float32 имеет около sd 7, float 64 sd 16, float80 sd34

3. Теперь это десятичная структура 🙂

Ответ №2:

Я нашел прототип BigInt в официальном репозитории Swift: https://github.com/apple/swift/blob/master/test/Prototypes/BigInt.swift

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

Ответ №3:

Я также работаю над библиотекой больших чисел, с помощью которой вы можете выполнять некоторые вычисления больших чисел. На самом деле библиотека основана на библиотеке GNU Multiple Precision (GMP), и я написал оболочку Objective-C / Swift. В настоящее время возможна большая целочисленная математика, включая большую перегрузку операторов. Пример кода выглядит так:

 var err : NSError?
var bi1 = BigInt(nr: 12468642135797531)
var bi2 = BigInt(nr: "12345678901011121314151617181920", error: amp;err)
var res = bi1 * bi2
println("Multiply 2 BigInts: bi1 * bi2 = (res.toString())")
 

что приводит к:

 Multiply 2 BigInts: bi1 * bi2 = 153933852140173822960829726365674325601913839520
 

Вы можете найти библиотеку по адресу: https://github.com/githotto/osxgmp

Комментарии:

1. Можно ли его использовать в приложении, отправленном в Appstore? Я предполагаю, что это невозможно из-за лицензионных ограничений.

2. Я не эксперт в лицензиях/ограничениях GNU и AppStore, но ИМХО, пока вы сохраняете включенные ссылки нетронутыми, чтобы можно было идентифицировать оригинальных авторов, это не должно быть проблемой. Кстати, я рад слышать, что библиотека вам полезна! Может быть, вы поделитесь с нами, для каких целей он используется?!

3. Обычно GPL интерпретируются таким образом, что любое программное обеспечение, включая его (скомпилированное или связанное), также должно быть GPL. Для моей компании это запрет на использование любого кода GPL. Этого же мнения придерживаются и наши юристы.

4. может ли он конвертировать данные(NSData) в BigInt ?

5. Нет, он не может напрямую преобразовать дату(NSDate) в BigInt, но если вы попробуете что-то вроде: var дата: NSDate (), пусть dateAsInt = Int32(дата.время, интервалы времени, 1970 * 1000), var dateAsBigInt = BitInt(nr: dateAsInt), вы, вероятно, получите то, что хотите. Я уже пробовал это на своем компьютере, но, вероятно, именно так я бы это сделал. Надеюсь, это поможет.

Ответ №4:

Я написал реализацию big integer и big double для 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

Комментарии:

1. может ли он конвертировать данные(NSData) в BigInt ?

2. Отличная библиотека… простое перетаскивание… работает и для двойника.

Ответ №5:

Вот он.

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

На самом деле BigInt-это только часть этого. В дополнение к BigInt вы получаете:

  • общее рациональное, которое принимает форму от 8 до 8 в качестве числителя и знаменателя
  • универсальный комплекс, который принимает либо целые числа (целые числа Гаусса), либо типы действительных чисел, не только двойные и плавающие, но и рациональные.
  • Чисто быстро. Работает не только на 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)
 

Дэн Генератор чисел

Комментарии:

1. может ли он конвертировать данные(NSData) в BigInt ?

Ответ №6:

Я написал библиотеку, которая позволяет работать с большими целыми числами в Swift. Таким же образом, как BigInteger Java. Существуют также перегрузки оператора, чтобы сделать работу более удобной. Пример:

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

https://github.com/kirsteins/BigInteger

Комментарии:

1. Работает ли это также на iOS для arm64? Также есть ли какие-либо шаги по включению этого в проект iOS, указанный где-нибудь?

2. Да, это работает на arm64. Вот хорошее руководство о том, как добавить зависимость от фреймворка github.com/stephencelis/SQLite.swift#installation . Вы можете использовать это руководство с BigInteger.

3. Спасибо, я пытаюсь следовать предложенным вами шагам , но я не могу импортировать его в свой код после добавления. Не могли бы вы записать видео или перечислить шаги со скриншотами?

4. Обратите внимание, что вам не нужно создавать фреймворк отдельно или путем создания приложения, чтобы подсветка синтаксиса работала. Постараюсь записать видео, когда у меня будет немного времени.

5. @Kirsteins Как скрыть данные в BigInteger с помощью вашей библиотеки ?