Быстрое возведение в степень

2

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

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

Теги:
performance
algorithm
exponentiation

3 ответа

13
Лучший ответ

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

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

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

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

  • 0
    Отличный ответ.
  • 0
    +1. Очень интересно.
2

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

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

0

Проверьте это: IntX для работы с целыми числами LARGE. Возможно, вам придется написать свою собственную реализацию власти, но, поскольку поддерживается умножение, это не должно быть так сложно.

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

  • 0
    Я бы посоветовал использовать более зрелую библиотеку, чем IntX, если результаты вычислений вообще важны. Написание правильной библиотеки для произвольной точности сложнее, чем кажется - и многие из небольших проектов еще не имели возможности выявлять и решать типы проблем, которые мешают большинству реализаций.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню