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


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

12 64

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) - алгоритмы умножения/деления реализация. Он обеспечивает все основные операции по целые числа, такие как сложение, умножение, сравнение, побитовый сдвиг и т. д.

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

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

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

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

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

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

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

моно

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

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

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

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

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

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

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

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

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

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

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

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

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