-Подписка по e-mail

 

 -Поиск по дневнику

Поиск сообщений в community_coding

 -Статистика

Статистика LiveInternet.ru: показано количество хитов и посетителей
Создан: 29.12.2004
Записей:
Комментариев:
Написано: 536


Быстрый алгоритм для "частичного" возведения в степень

Воскресенье, 15 Января 2006 г. 00:25 + в цитатник
Килгор_Траут все записи автора Даются три целых положительных числа - x, y и n. Надо найти n-нную цифру числа (x^y) если считать справа. Пример: если x=7, y=11, n=5, ответ будет 2 (7^11=1977326743). Я знаю несколько разных способов (в духе x^y % 10^n), но загвоздка в том, что все должно работать в o(lg y), x и n принимаются за постоянные. Кто-нибудь знает достойный алгоритм?

АПДЕЙТ: Если кого-то здесь еще интересует эта задачка, предоставляю решение. Предупреждаю сразу - оно довольно-таки издевательское. Однако задача, как я уже упоминал, чисто теоретическая, и с теоретической точки зрения решение абсолютно правильное.

Итак, начинаем методически умножать число x на себя, получая x^2, x^3 и т. д. В каждом из этих чисел запоминаем последние n цифр. Рано или поздно эти цифры начнут повторяться. Как только это происходит, останавливаем процесс, запоминаем последнюю степень (назовем ее d) и считаем y%(d-s), где s является повтрояемой степенью. Затем вспоминаем какой была n-ная цифра справа у числа x^(y%(d-s)), и ответ у нас в кармане.

Пример: x=2, y=345, n=2

Число --> Последние 2 цифры
2^1 ----> 02
2^2 ----> 04
2^3 ----> 08
2^4 ----> 16
2^5 ----> 32
2^6 ----> 64
2^7 ----> 28
2^8 ----> 56
2^9 ----> 12
2^10 ---> 24
2^11 ---> 48
2^12 ---> 96
2^13 ---> 92
2^14 ---> 84
2^15 ---> 68
2^16 ---> 36
2^17 ---> 72
2^18 ---> 44
2^19 ---> 88
2^20 ---> 76
2^21 ---> 52
2^22 ---> 04 Сравните с 2^2 - то же самое! Здесь останавливаемся.
2^23 ---> 08
2^24 ---> 16 Дальше, естественно, все повторяется по новой.

Теперь находим 345 % (22-2) = 5. 2^5 дает 32, значет искомая цифра - 3.

Факт повторения последних цифр гарантируется ограниченным количеством комбинаций (10^n) и независимостью последних n цифр от цифр порядка n+1 и больше (это видно при умножении в столбик). Так как в алгоритме число y появляется лишь в конце, можно сказать что алгоритм работает в O(1) =) (вспомним, что x и n принимаются за постоянные). С практической точки зрения алгоритм практически бесполезен, так как для больших x и n нахождение закономерности может занять ОЧЕНЬ много времени. Проще сначала высчитать x^y, а потом уже найти n-ную цифру.
Рубрики:  вопросы

NemOFF   обратиться по имени Re: Быстрый алгоритм для "частичного" возведения в степень Воскресенье, 15 Января 2006 г. 01:33 (ссылка)
Придумать конечно можно... в принципе если числа большие - будет по сложней - используй "длинную арифметику" или к примеру...
году в 2000ом или в 01-ом была задачка такая на районной олимпиаде г. Н. Новгорода (и по некоторым данным ещё в пару городах):
Числа от 1 до n записаны по порядку без знаков препинания. Найдите i-ую цифру в данной записи
Решение примерно таково: Записываем все в файл, потом читаем...

Здесь тоже прокатит этот алгоритм.
Во-вторых, была где-то формула что степень выражаецца черех логарифм (арифметика школьная)...
если будут вопросы по этому поводу - могу ответить

LI 5.09.15
Ответить С цитатой В цитатник
kpt_Petia   обратиться по имени Воскресенье, 15 Января 2006 г. 11:45 (ссылка)
что означает сия загадочная запись "загвоздка в том, что все должно работать в o(lg y)" не понял...

формулу такую знаю.. a^b = Exp(b * Ln(a)).. не знаю поможет ли т.к. сути задачи не понял.
Ответить С цитатой В цитатник
lnl122   обратиться по имени Воскресенье, 15 Января 2006 г. 12:38 (ссылка)
во втором томе Кнута где-то была похожая задача, единственно что неудобно, в djvu листать все 600 страниц в ее поиске.. елси Кнута нет, полистай этот блог, там есть ссылки на первые три тома (по 6 Мб) и вьювер (2 Мб)
Ответить С цитатой В цитатник
kpt_Petia   обратиться по имени Воскресенье, 15 Января 2006 г. 12:43 (ссылка)
lnl122, те ссылки не работают уже ):
в смысле, пароль какой-то требуют
Ответить С цитатой В цитатник
lnl122   обратиться по имени Re: Ответ в community_coding; Быстрый алгоритм для "частичного" возведения в степень Воскресенье, 15 Января 2006 г. 12:47 (ссылка)
кому выслать -- пишите мыло в личку.

LI 5.8.22
Ответить С цитатой В цитатник
Килгор_Траут   обратиться по имени Воскресенье, 15 Января 2006 г. 22:34 (ссылка)
lnl122, вышли мне пожалуйста.
Ответить С цитатой В цитатник
Килгор_Траут   обратиться по имени Воскресенье, 15 Января 2006 г. 22:54 (ссылка)
NemOFF, kpt_Petia, даю дополнительные спецификации:

1) Это чисто теоретическая задача. Ни о каких реальных компьютерах и языках программирования речь не идет. В условии говорится об "абстрактной машине, оперирующей целыми числами". Разрешаются только 5 операций: сложение, вычитание, умножение, деление целых (например 2/5=0) и нахождение остатка (%). Все эти операции занимают одну единицу времени (вне зависимости от размера чисел!)

2) o(lg y) - это значит, что время выполнения алгоритма должно расти медленнее, чем логарифмическая функция f(y)=lg y. Еще раз обращаю внимание на то, что от x и n время выполнения не зависит, они принимаются за постоянные.

3) Желателен алгоритм, который находит n-ную цифру без возведения в степень x^y. Дело в том, что все алгоритмы возведения в степень, насколько я знаю, занимает lg y времени, а это недопустимо.
Ответить С цитатой В цитатник
NemOFF   обратиться по имени Re: Ответ в community_coding; Быстрый алгоритм для "частичного" возведения в степень Воскресенье, 15 Января 2006 г. 23:37 (ссылка)
Точно такого алгоритма не знаю, но подумать можно... вобсчем постараюсь в ближайшее время прислать наработки
В колонках играет: Anathema - Far Away (Acoustic) (Bonus)

LI 5.09.15
Ответить С цитатой В цитатник
Килгор_Траут   обратиться по имени Понедельник, 16 Января 2006 г. 05:44 (ссылка)
NemOFF, спасибо заранее.
Ответить С цитатой В цитатник
lnl122   обратиться по имени Re: Ответ в community_coding; Быстрый алгоритм для "частичного" возведения в степень Понедельник, 16 Января 2006 г. 08:31 (ссылка)
Исходное сообщение Килгор_Траут: lnl122, вышли мне пожалуйста.


мыло в личку.

будь готов к 2Мб вьювер, 3 части по 6 Мб -- первые тома..
В колонках играет: Tourex - - Thanks for loving me

LI 5.8.22
Ответить С цитатой В цитатник
lnl122   обратиться по имени Re: Ответ в community_coding; Быстрый алгоритм для "частичного" возведения в степень Понедельник, 16 Января 2006 г. 08:32 (ссылка)
Исходное сообщение Килгор_Траут: lnl122, вышли мне пожалуйста.


мыло в личку.

будь готов к 2Мб вьювер, 3 части по 6 Мб -- первые тома..
В колонках играет: Tourex - - Thanks for loving me

LI 5.8.22
Ответить С цитатой В цитатник
Комментировать К дневнику Страницы: [1] [Новые]
 

Добавить комментарий:
Текст комментария: смайлики

Проверка орфографии: (найти ошибки)

Прикрепить картинку:

 Переводить URL в ссылку
 Подписаться на комментарии
 Подписать картинку