В настоящее время я заимствует java.math.BigInteger
из J #-библиотек, как описано здесь. Никогда не использовав библиотеку для работы с большими целыми числами раньше, это кажется медленным, порядка 10 раз медленнее, даже для чисел длины ulong
. У кого-нибудь есть лучшие (предпочтительно свободные) библиотеки или нормальный уровень производительности?
Большие целые числа в С#
Ответ 1
Начиная с .NET 4.0 вы можете использовать класс System.Numerics.BigInteger. Смотрите здесь: http://msdn.microsoft.com/en-us/library/system.numerics.biginteger(v=vs.110).aspx
Другой альтернативой является класс IntX.
IntX - произвольная точность целочисленная библиотека, написанная на чистом С# 2.0 с быстрым - O (N * log N) - алгоритмы умножения/деления реализация. Он предоставляет все основные операции с целыми числами добавление, умножение, сравнение, побитовое смещение и т.д.
Ответ 2
F#
также поставляется с одним. Вы можете получить его на Microsoft.FSharp.Math
.
Ответ 3
Класс System.Numerics.BigInteger
в .NET 4.0 основан на Microsoft.SolverFoundation.Common.BigInteger
в Microsoft Research.
Класс Solver Foundation BigInteger
выглядит очень эффектно. Я не уверен, какая лицензия выпущена, но вы можете получить здесь (скачать и установить Solver Foundation и найти Microsoft.Solver.Foundation.dll).
Ответ 4
Я считаю, что вы можете оптимизировать реализацию, если вы выполняете все операции над BigInts, которые будут возвращать результаты, меньшие, чем собственный тип (например, int64), для родных типов и только иметь дело с большим массивом, если вы собираетесь переполнение.
изменить Эта реализация на codeproject кажется всего лишь в 7 раз медленнее... Но с указанной выше оптимизацией вы могли бы заставить ее выполнять почти идентично с родными типами для небольшие числа.
Ответ 5
Вот несколько реализаций BigInteger в С#. Я использовал реализацию Mono BigInteger, работает довольно быстро (я использовал его в CompactFramework)
Ответ 6
Я не уверен в производительности, но у IronPython также есть класс BigInteger. Он находится в пространстве имен Microsoft.Scripting.Math.
Ответ 7
Да, он будет медленным, а разница в 10 раз - о том, чего я ожидаю. BigInt использует массив для представления произвольной длины, и все операции должны выполняться вручную (в отличие от большинства вычислений, которые могут выполняться непосредственно с ЦП)
Я даже не знаю, будет ли ручное кодирование в сборке давать вам большую выгоду от производительности более 10 раз, что довольно сложно. Я бы искал другие способы его оптимизации - иногда в зависимости от вашей математической проблемы есть небольшие трюки, которые вы можете сделать, чтобы сделать это быстрее.
Ответ 8
Я использовал Biginteger в предыдущем задании. Я не знаю, какая производительность вам нужна. Я не использовал его в ситуации с высокой интенсивностью, но никогда не имел с этим никаких проблем.
Ответ 9
Это может показаться странным предложением, но вы проверили десятичный тип, чтобы узнать, как быстро он работает?
Десятичный диапазон составляет ± 1,0 × 10 ^ -28 до ± 7,9 × 10 28, поэтому он может быть недостаточно большим, но он больше, чем улонг.
Предполагалось, что в .NET 3.5 должен быть класс BigInteger, но он обрезается.
Ответ 10
Это вам не поможет, но должен был быть класс BigInteger в .Net 3.5; он был сокращен, но из заявлений, сделанных в PDC, он будет в .Net 4.0. По-видимому, они потратили много времени на его оптимизацию, поэтому производительность должна быть намного лучше, чем то, что вы получаете сейчас.
Кроме того, этот вопрос по существу является дубликатом Как я могу представить очень большое целое число в .NET?
Ответ 11
См. ответы в этой теме . Вам нужно будет использовать одну из сторонних больших целочисленных библиотек/классов или ждать С# 4.0, которая будет содержать собственный тип данных BigInteger.
Ответ 12
Это выглядит очень многообещающим. Это С# Wrapper над GMP.
http://web.rememberingemil.org/Projects/GnuMpDotNet/GnuMpDotNet.html
Существуют также другие опции BigInteger для .Net здесь, в частности Mpir.Net
Ответ 13
Вы также можете использовать пакет Math.Gmp.Native Nuget, который я написал. Его исходный код доступен на GitHub, а документация доступна здесь. Он предоставляет .NET всю функциональность библиотеки GMP, которая известна как высоко оптимизированная арифметическая библиотека произвольной точности.
Целое число произвольной точности представлено типом mpz_t. Все операции над этими целыми числами начинаются с префикса mpz_
. Например, mpz_add или mpz_cmp. Примеры исходного кода приведены для каждой операции.