Как научиться быстро возводить в степень


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

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

Но прежде, чем начать, почему бы не реализовать обычное возведение? Правильно, нет причин себе в этом отказывать, поехали!

Функция возведения числа в степень

Методом «в лоб», пробежимся в цикле и перемножим число само на себя сколько нужно раз. Работает за O(deg) где deg степень.




 //Возводит число num в степень deg простым циклом long power(long num, long deg) {     long result = 1;     for(long i = 0; i < deg; i++) {         result *= num;     }     return result; } 

Для возведения по модулю достаточно будет передать этот модуль в функцию и на каждой итерации брать результат по модулю.

Функция возведения числа в отрицательную степень

Небольшое улучшение, добавим возможность возводить число в отрицательную степень. Реализуется легко, изменяем возвращаемое значение и рассматриваем два случая: для положительной степени делаем все как обычно, а для отрицательной возвращаем 1 / result.

 //Возводит число num в степень deg простым циклом(степень может быть отрицательной) double power(long num, long deg) {     double result = 1;     if(deg < 0) {         deg = -deg;         for(long i = 0; i < deg; i++) {             result *= num;         }         return 1 / result;     }     else {         for (long i = 0; i < deg; i++) {             result *= num;         }         return result;     } } 

Функция быстрого возведения числа в степень

Ее еще называют бинарным возведением. Алгоритм построен на очевидной формуле

An = (An/2)2 = An/2 * An/2

То есть для четного n можно получить результат выполнив всего log2n перемножений, что уже дает логарифмическую сложность. А в случае, когда n нечетно, приведем его к четному виду с помощью еще одной очевидной формулы

An = An-1 * An

Реализация выглядит следующим образом.

 //Быстрое возведение числа num в степень deg long powerFast(long num, long deg) {     long result = 1;     while(deg) {         if (deg % 2 == 0) {             deg /= 2;             num *= num;         }         else {             deg--;             result *= num;         }     }     return result; } 

Функция быстрого возведения в отрицательную степень

Можно реализовать воспользовавшись аналогичным приемом, как и в простом умножении — делим алгоритм на две ветки.

 //Быстрое возведение числа num в степень deg(в том числе может быть отрицательной) double powerFast(long num, long deg) {     double result = 1;     if(deg < 0) {         deg = -deg;         while(deg) {             if (deg % 2 == 0) {                 deg /= 2;                 num *= num;             }             else {                 deg--;                 result *= num;             }         }         return 1 / result;     }     else {         while(deg) {             if (deg % 2 == 0) {                 deg /= 2;                 num *= num;             }             else {                 deg--;                 result *= num;             }         }         return result;     } } 

Заключение

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

c - Как WolframAlpha может так быстро возводить в степень числа?

Переполнение стека
  1. Около
  2. Товары
  3. Для команд
  1. Переполнение стека Общественные вопросы и ответы
  2. Переполнение стека для команд Где разработчики и технологи делятся частными знаниями с коллегами
.

ios - как возвести в степень действительно большие числа в Objective-C?

Переполнение стека
  1. Около
  2. Товары
  3. Для команд
  1. Переполнение стека Общественные вопросы и ответы
  2. Переполнение стека для команд Где разработчики & amp
.

java - Расчет вероятностей цепи Маркова со значениями, слишком большими для возведения в степень

Переполнение стека
  1. Около
  2. Товары
  3. Для команд
  1. Переполнение стека Общественные вопросы и ответы
  2. Переполнение стека для команд Где разработчики и технологи делятся частными знаниями с коллегами
  3. Вакансии Программирование и связанные с ним технические возможности карьерного роста
  4. Талант Нанимайте технических специалистов и создавайте свой бренд работодателя
  5. Реклама Обратитесь к разработчикам и технологам со всего мира
  6. О компании
.

Как быстро вычислить проценты

Как вычислить проценты может быть проще, чем вы можете себе представить. Прочтите несколько простых трюков.

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

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

См. Также: 3 часто задаваемых вопроса о процентах

Купить сейчас

Как партнер Amazon и книжный магазин.org, QDT зарабатывает на соответствующих покупках.

Резюме

: что такое проценты?

Чтобы убедиться, что мы все на одной странице, давайте начнем с того, что на минутку напомним несколько ключевых фактов о процентах. Начнем с самого главного вопроса: что такое проценты? Возможно, наиболее проясняющим моментом является то, что слово «процент» на самом деле представляет собой сложенную вместе фразу «процент». А поскольку «цент» здесь означает 100 (как в «столетии»), мы видим, что слово «процент» означает просто «на 100».Другими словами, 10% означает «10 на 100», что совпадает с дробью 10/100 или 1/10.

Это отличная новость, так как позволяет легко вычислить много процентов. В частности, легко вычислить 10% от любого числа, поскольку это всего лишь 1/10 от числа. Почему это так полезно? Потому что это означает, что вы можете быстро вычислить 10% числа, просто переместив десятичную запятую на 1 позицию влево.

А как насчет вычисления примерно 36% от 25? А может 250% из 20? В этих случаях наш трюк с использованием мощности 10% не помогает - так что же мы можем сделать?

Как быстро рассчитать проценты

Уловка, которая часто помогает быстро вычислить эти типы процентов, заключается в использовании того факта, что x процентов от y совпадает с y процентов от x.А? Я знаю, что это может показаться странным, но на самом деле это довольно просто. Если взять наш предыдущий пример, это правило гласит, что 36% от 25 равно 25% от 36. Как это нам помогает? Итак, поскольку 25% - это то же самое, что и дробь 1/4, мы видим, что 25% от 36 должно быть 36/4 или 9. Таким образом, 25% от 36 равно 9, и 36% от 25 также должны быть 9.

Прелесть этого трюка в том, что каждый раз, когда вы решаете одну проблему, вы фактически решаете две! И это особенно полезно, когда одну из проблем решить намного проще, чем другую, как это было здесь.

Полезно уделить минуту, чтобы понять, почему этот, казалось бы, волшебный трюк работает. Как я упоминал ранее, 36% эквивалентно дроби 36/100. Поскольку мы можем записать дробь 1/100 как десятичное число 0,01, мы видим, что дробь 36/100 также может быть записана 0,01 x 36. Это означает, что 36% от 25 должны быть равны (0,01 x 36) x 25. А теперь самое интересное: ассоциативное свойство умножения говорит нам, что мы можем умножать несколько чисел в любом порядке. Это означает, что (0.01 x 36) x 25 = (0,01 x 25) x 36. Но 0,01 x 25 - это то же самое, что и 25%, что означает, что это равно 25% от 36. Таким образом, 36% от 25 равно 25% от 36. Это не волшебство, это математика! Довольно круто, правда?

Страниц

.

Смотрите также