Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Аггоритм возведения в степень, сверхдлинного числа 
:(
    Опции темы
Kernigan
Дата 25.8.2006, 17:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 23
Регистрация: 18.6.2006

Репутация: нет
Всего: нет



Подскажите пожалуйста, как возвести в целую степень число, представленное строкой, более 100 символов.

PM MAIL   Вверх
nostromo
Дата 25.8.2006, 17:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 194
Регистрация: 23.3.2006

Репутация: 5
Всего: 10



Цитата

Подскажите пожалуйста, как возвести в целую степень число, представленное строкой, более 100 символов.


Наверное, сначала перейти от строки к более удобному представлению, а затем перемножить нужное число раз. Более удобным представлением может оказаться, скажем, хранение числа в виде списка цифр в системе счисления с основанием, которое хорошо ложиться в доступный integer. Для 32-битных целых это может быть 2^32 или, если хочется упростить вывод десятичного представления, например, 1000000000)
--------------------
На пыльных тропинках далеких планет останутся наши следы.
PM MAIL   Вверх
Mayk
Дата 25.8.2006, 17:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


^аВаТаР^ сообщение>>
****


Профиль
Группа: Участник
Сообщений: 2616
Регистрация: 22.5.2005
Где: за границей разум а

Репутация: 2
Всего: 134



Пораскладывать на составляющие? 
Пример для x^27:
Цитата

x3 = x*x*x
x9 = x3*x3*x3
x27 = x9*x9*x9
//6 умножений


Цитата

x2 = x*x
x4 = x2*x2
x8 = x4 * x4
x16 = x8 * x8
x27 = x16 * x8 * x2 * x
//7 умножений


Правда АФАИК нет хорошего алгоритма, который позволяет определять точную  оптимальную последовательностей перемножений. Но можно пораскладывать на нескольких приближенных алгоритмов и перемножать по лучшему результату.

Добавлено @ 17:55 
PS. Для возведения в x^-27 достаточно расчитать x^27, а потом 1/(x^27).


--------------------
 Здесь был кролик. Но его убили.
Человеки < кроликов, йа считаю.
PM MAIL WWW ICQ   Вверх
nostromo
Дата 25.8.2006, 17:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 194
Регистрация: 23.3.2006

Репутация: 5
Всего: 10



Цитата

Пораскладывать на составляющие?

Отличная идея. Упустил.
Цитата

Правда АФАИК нет хорошего алгоритма, который позволяет определять точную  оптимальную последовательностей перемножений.

Похоже на то. Нужно учитывать разложнеие числа N (показатель степени) на простые множители. Зато, по крайней мере, всегда можно обойтись [log N]+1, а это не много даже для весьма больших значений N.

--------------------
На пыльных тропинках далеких планет останутся наши следы.
PM MAIL   Вверх
maxim1000
Дата 25.8.2006, 18:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник
Сообщений: 3334
Регистрация: 11.1.2003
Где: Киев

Репутация: 33
Всего: 110



Цитата(Mayk @  25.8.2006,  16:49 Найти цитируемый пост)
Правда АФАИК нет хорошего алгоритма, который позволяет определять точную  оптимальную последовательностей перемножений

ну раз нет, то можно придумать smile
вводим набор переменных x1...xN
нам нужно вычислить xN
у нас есть x1
каждое перемножение двух известных степеней даёт нам третью (неизвестную на данный момент)
потом начинаем перебирать все возможные последовательности перемножений, из них находим кратчайшую
может, даже динамическое программирование удастся прикрутить
правда есть один недостаток: определение оптимального способа будет занимать больше времени, чем само возведение smile
так что, думаю, в качестве общего случая более выгодно возведение по степеням двойки - там получается 2*log2 n умножений
кроме того, сама степень может буть представлена длинным числом, а чаще всего бывает, что в двоичную систему длинное число переводить очень быстро (или вообще не надо)


--------------------
qqq
PM WWW   Вверх
esperant0
Дата 25.8.2006, 19:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 714
Регистрация: 20.5.2005

Репутация: 4
Всего: 14



=t

Это сообщение отредактировал(а) esperant0 - 25.8.2006, 19:23


--------------------
 
 Student->Teacher Assistant ->Research assistant->Microsoft Software Development Engineer 

Пользователь получил наказание за то, что проигнорировал замечание которое было написано модератором  а затем стерто и которое он - пользователь не мог видеть. 
PM MAIL   Вверх
Mayk
Дата 25.8.2006, 19:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


^аВаТаР^ сообщение>>
****


Профиль
Группа: Участник
Сообщений: 2616
Регистрация: 22.5.2005
Где: за границей разум а

Репутация: 2
Всего: 134



Цитата(maxim1000 @  25.8.2006,  22:49 Найти цитируемый пост)
правда есть один недостаток: определение оптимального способа будет занимать больше времени, чем само возведение

Поэтому я и написал "хорошего". Брутфорс никто не отменял  smile 
Но пожалуй да. В принципе для малых показателей N ( N < 1000  )
можно написать N оптимальных ф-ций возведений в степень ,
а для остальных использовать приближённое разложение (приближённые разложения).
(оптимальные писать не руками, естественно  smile )


Интересная кстати задачка. Может сделаем несколько общих решений для произвольных [но пусть 63 битных] N  и устроим небольшой турнир?  smile 



Это сообщение отредактировал(а) Mayk - 25.8.2006, 19:27


--------------------
 Здесь был кролик. Но его убили.
Человеки < кроликов, йа считаю.
PM MAIL WWW ICQ   Вверх
esperant0
Дата 25.8.2006, 22:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 714
Регистрация: 20.5.2005

Репутация: 4
Всего: 14



Да, тетта(лог N) это точная оценка.





--------------------
 
 Student->Teacher Assistant ->Research assistant->Microsoft Software Development Engineer 

Пользователь получил наказание за то, что проигнорировал замечание которое было написано модератором  а затем стерто и которое он - пользователь не мог видеть. 
PM MAIL   Вверх
mes
Дата 26.8.2006, 11:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


Профиль
Группа: Участник Клуба
Сообщений: 7954
Регистрация: 14.1.2006

Репутация: нет
Всего: 250



Цитата(Kernigan @  25.8.2006,  17:22 Найти цитируемый пост)
Подскажите пожалуйста, как возвести в целую степень число, представленное строкой, более 100 символов.



Легче всего возводить число в двоичной системе. То есть вначале надо перевести 100символьное число в двоичное представление.

Потом перейти к разложению степени на множетели, которые сами являются степенями 2. 

Например, степень 45 = (32+8+4+1) =  2^5 + 2^3 + 2^2 + 2^0

Тогда число a^45 =  а^(2^5) +а^(2^3) +а^ (2^2) +а^ (2^0)


Теперь, чтоб возвести двоичное число в такую (например, 2^5)) степень
нужно сдвинуть двоичное число "влево"  на значение степени нашей степени smile (то есть на 5 разрядов) 

Тогда: а^45 = (а shl 5) + (а shl 3) + (а shl 2) + (а shl 0) 


Вот и всё. 

а да:  (а shl 0) = a;









Это сообщение отредактировал(а) mes - 26.8.2006, 22:43


--------------------
PM MAIL WWW   Вверх
Silent
Дата 3.10.2006, 10:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 252
Регистрация: 3.10.2006

Репутация: 1
Всего: 9



Быстрое возведение в степень делается так:

long long s(int base, int n){ //основание, показатель
    long long a=1;
    while (n!=0){
        if (n&1==1) a*=base;
        base*=base;
                                n>>=1;
    }
    return a;
}

Нужно только переделать ее на длинную арифметику.
Или использовать, скажем, Java.
PM MAIL   Вверх
Akina
Дата 3.10.2006, 15:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Советчик
****


Профиль
Группа: Модератор
Сообщений: 20581
Регистрация: 8.4.2004
Где: Зеленоград

Репутация: 20
Всего: 454



Цитата(Mayk @  25.8.2006,  18:49 Найти цитируемый пост)
нет хорошего алгоритма, который позволяет определять точную  оптимальную последовательностей перемножений

Именно такой алгоритм - побитовое представление степени и получение соответствующих возведений в степени, равные степени двойки, с последующим их перемножением, и есть оптимум. Быстрее не получится. Это можно строго доказать, причем доказательство несложное и базируется на том, что нельзя за 1 атомарную операцию перемножить более 2 чисел.


--------------------
 О(б)суждение моих действий - в соответствующей теме, пожалуйста. Или в РМ. И высшая инстанция - Администрация форума.

PM MAIL WWW ICQ Jabber   Вверх
maxim1000
Дата 3.10.2006, 15:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник
Сообщений: 3334
Регистрация: 11.1.2003
Где: Киев

Репутация: 33
Всего: 110



Цитата(Akina @  3.10.2006,  14:29 Найти цитируемый пост)
Именно такой алгоритм - побитовое представление степени и получение соответствующих возведений в степени, равные степени двойки, с последующим их перемножением, и есть оптимум. Быстрее не получится. Это можно строго доказать, причем доказательство несложное и базируется на том, что нельзя за 1 атомарную операцию перемножить более 2 чисел. 

а пример Mayk'а?
если там всё правильно (ошибок я не увидел), то используя "троичный" способ умножений получается на 1 меньше...


--------------------
qqq
PM WWW   Вверх
esperant0
Дата 3.10.2006, 18:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 714
Регистрация: 20.5.2005

Репутация: 4
Всего: 14



Цитата(Akina @ 3.10.2006,  15:29)
Цитата(Mayk @  25.8.2006,  18:49 Найти цитируемый пост)
нет хорошего алгоритма, который позволяет определять точную  оптимальную последовательностей перемножений

Именно такой алгоритм - побитовое представление степени и получение соответствующих возведений в степени, равные степени двойки, с последующим их перемножением, и есть оптимум. Быстрее не получится. Это можно строго доказать, причем доказательство несложное и базируется на том, что нельзя за 1 атомарную операцию перемножить более 2 чисел.

Ваш алгоритм не ТОЧНЫЙ.

читайте выше.


--------------------
 
 Student->Teacher Assistant ->Research assistant->Microsoft Software Development Engineer 

Пользователь получил наказание за то, что проигнорировал замечание которое было написано модератором  а затем стерто и которое он - пользователь не мог видеть. 
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Алгоритмы"

maxim1000

Форум "Алгоритмы" предназначен для обсуждения вопросов, связанных только с алгоритмами и структурами данных, без привязки к конкретному языку программирования и/или программному продукту.


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, maxim1000.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Алгоритмы | Следующая тема »


 




[ Время генерации скрипта: 0.0838 ]   [ Использовано запросов: 20 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.