Больших чисел в C#

в настоящее время я займы java.math.BigInteger из библиотек J#, как описано здесь. Никогда раньше не использовал библиотеку для работы с большими целыми числами, это кажется медленным, порядка 10 раз медленнее, даже для ulong числа длина. У кого-нибудь есть лучшие (желательно бесплатные) библиотеки, или этот уровень производительности нормальный?

12 ответов


начиная с .NET 4.0 вы можете использовать систему.Численные данные.Класс типа BigInteger. См. документацию здесь: http://msdn.microsoft.com/en-us/library/system.numerics.biginteger(v=vs. 110).aspx

Другой альтернативой является IntX класса.

IntX-произвольная точность целые библиотеки написаны на C# 2.0 с fast-O (N * log N) - алгоритмы умножения/деления реализация. Он обеспечивает все основные операции целые числа, такие как сложение, умножение, сравнение, побитовое смещение etc.


F# также поставляется с одним. Вы можете получить его в Microsoft.FSharp.Math.


на System.Numerics.BigInteger класс в .NET 4.0 основан на Microsoft.SolverFoundation.Common.BigInteger из Microsoft Research.

основы расчета BigInteger класс выглядит очень мощно. Я не уверен, под какой лицензией он выпущен, но вы можете его получить здесь (загрузите и установите Solver Foundation и найдите Microsoft.Решатель.Основа.файл DLL.)


Я считаю, что вы можете оптимизировать реализацию, если выполните все операции над BigInts, которые будут возвращать результаты меньше, чем собственный тип (например. int64) на собственных типах и иметь дело только с большим массивом, если вы собираетесь переполнить.

редактировать Это реализация на codeproject вроде только 7 раз медленнее ... Но с вышеуказанной оптимизацией вы можете заставить его выполнять почти идентично собственным типам для небольших чисел.


вот несколько реализаций BigInteger в C#. Я использовал реализацию BigInteger Mono, работает довольно быстро (я использовал его в CompactFramework)

Надувной Замок

моно


Я не уверен в производительности, но IronPython также имеет класс BigInteger. Это в Microsoft.Описание.Пространство имен Math.


Да, это будет медленно, и 10-кратная разница-это то, что я ожидал. BigInt использует массив для представления произвольной длины, и все операции должны выполняться вручную (в отличие от большинства математических операций, которые могут быть выполнены непосредственно с CPU)

Я даже не знаю, даст ли ручное кодирование его в сборке большую часть прироста производительности по сравнению с 10x, это довольно близко. Я бы поискал другие способы его оптимизации-иногда в зависимости от вашей математической задачи есть маленькие трюки, которые вы может сделать, чтобы сделать это быстрее.


Я Biginteger на предыдущей работе. Я не знаю, какое представление вам нужно. Я не использовал его в ситуации с интенсивной производительностью, но никогда не имел с ним проблем.


Это может показаться странным предложением, но вы протестировали decimal введите, чтобы увидеть, как быстро он работает?

десятичный ряд ±1.0 × 10^-28 к ±7.9 × 10^28, поэтому он может все еще не быть большой достаточно, но он больше чем улонг.

в .NET 3.5 должен был быть класс BigInteger, но он порезался.


Это не поможет вам, но в .Net 3.5 должен был быть класс BigInteger; он был сокращен, но из операторов, сделанных в PDC, он будет в .Net 4.0. Они, видимо, потратили много времени на оптимизацию, поэтому производительность должна быть намного лучше, чем вы получаете сейчас.

далее, этот вопрос по существу является дубликатом как я могу представить очень большое целое число в .NET?


см. ответы в этом нить. Вам нужно будет использовать одну из сторонних больших целых библиотек / классов или дождаться C# 4.0, который будет включать собственный тип данных BigInteger.


Это выглядит очень многообещающим. Это обертка C# поверх GMP.

http://web.rememberingemil.org/Projects/GnuMpDotNet/GnuMpDotNet.html

есть и другие параметры BigInteger для .Net здесь в частности, Mpir.Net