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