Больших чисел в 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.
на 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