Большие целые числа в С#

В настоящее время я заимствует 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)

Bouncy Castle

Mono

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

Ответ 13

Вы также можете использовать пакет Math.Gmp.Native Nuget, который я написал. Его исходный код доступен на GitHub, а документация доступна здесь. Он предоставляет .NET всю функциональность библиотеки GMP, которая известна как высоко оптимизированная арифметическая библиотека произвольной точности.

Целое число произвольной точности представлено типом mpz_t. Все операции над этими целыми числами начинаются с префикса mpz_. Например, mpz_add или mpz_cmp. Примеры исходного кода приведены для каждой операции.