Реализация быстрого возведения в степень

Может ли кто-нибудь указать сайт, где я могу найти алгоритм для эффективного вычисления целочисленного возведения в степень до больших степеней с использованием С#?

например. Я хочу вычислить 2^60000 или 3^12345


person Hugo    schedule 27.10.2009    source источник


Ответы (3)


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

Я бы рекомендовал использовать одну из существующих арифметических библиотек произвольной точности, например GMP, большинство из которых иметь библиотеки для доступа к ним из C#.

F# поддерживает арифметику произвольной точности с использованием класса BigInt (к которому вы также можете получить доступ из C#, если импортируете сборку, в которой он находится). Однако я не знаю, насколько оптимизировано возведение в степень BigInt.

Если вы просто пытаетесь узнать об эффективных алгоритмах возведения в степень, вы можете заглянуть в Square-And- Алгоритм умножения возведения в степень.

person LBushkin    schedule 27.10.2009

Целочисленное возведение в степень можно эффективно вычислить с помощью метода, известного как "Возведение в степень путем возведения в квадрат" ссылка.

Этот метод также можно использовать для вычисления модульного возведения в степень link, которое используется в некоторых асимметричных шифрованиях. такие методы, как RSA.

person midtiby    schedule 27.10.2009

Проверьте это: IntX для работы с БОЛЬШИМИ целыми числами. Возможно, вам придется написать свою собственную реализацию мощности, но поскольку умножение поддерживается, это не должно быть так сложно.

Редактировать 280Z28: еще одна реализация, которая включает в себя быстрое тестирование Pow, ModPow и простоту, это BigInteger (Code Project), который я использовал в прошлом для задач Project Euler, хотя сейчас я работаю с .NET 4.0 и использую его System.Numerics.BigInteger.

person Manu    schedule 27.10.2009
comment
Я бы посоветовал использовать более зрелую библиотеку, чем IntX, если результаты вычислений вообще важны. Написать правильную библиотеку для произвольной точности сложнее, чем кажется, и многие небольшие проекты еще не имели возможности обнаруживать и решать типы проблем, от которых страдает большинство реализаций. - person LBushkin; 27.10.2009