2008-10-07 4 views
64

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

+0

хорошая ссылка. Несколько драгоценных камней. – 2008-10-07 00:34:36

+3

Единственная проблема заключается в том, что они требуют, чтобы J # распространяемые компоненты были установлены. Тот факт, что J # почти мертв (это было не в VS 2008 atleast), вероятно, не помогает в продвижении этого. – 2008-10-07 00:39:22

+0

J # просто для облегчения переноса существующих Java-проектов на .NET. Я определенно не буду включать какие-либо из его библиотек в новый проект. – MusiGenesis 2008-10-07 01:44:05

ответ

63

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

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

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

3

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

2

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

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

2

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

2

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

Десятичный диапазон ± 1,0 × 10^-28 до ± 7,9 × 10^28, поэтому он может быть не достаточно большим, но он больше, чем улунг.

Предполагалось, что в .NET 3.5 должен быть класс BigInteger, но it got cut.

+0

Да, я видел это объявление, когда первоначально искал библиотеку BigInt. Заставляет меня грустить. Ну что ж. – 2008-10-07 00:34:10

4

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

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

1

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

Кроме того, этот вопрос по существу дублирует How can I represent a very large integer in .NET?

1

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

9

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

8

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

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

4

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

Bouncy Castle

Mono