2014 dxdy logo

Научный форум dxdy

Математика, Физика, Computer Science, Machine Learning, LaTeX, Механика и Техника, Химия,
Биология и Медицина, Экономика и Финансовая Математика, Гуманитарные науки




 
 Как быстрее сосчитать число двоек в разложении факториала?
Сообщение03.04.2011, 11:28 
Обычно я пользуюсь следующим алгоритмом, до которого, кстати, сама докопалась.

Число n двоек в разложении числа $m!$ на простые множители равно $[\frac{m}{2}]+[\frac{m}{4}]+[\frac{m}{8}]+\dots +[\frac{m}{2^k}]+\dots$
Например, в числе $2011!$ будет

$[\frac{2011}{2}]+[\frac{2011}{4}]+[\frac{2011}{8}]+\dots +[\frac{2011}{2^k}]+\dots=2002$

двойки.

При этом n, как правило, не намного отличается от m.

А как сосчитать быстрее? Для $2011!$ данный алгоритм ещё более-менее приемлем, а как, скажем, быть с $(2011!)!$? Есть какая-то формула?

 
 
 
 
Сообщение03.04.2011, 11:34 
Аватара пользователя
В теории сложности алгоритмов, как проедешь первые определения, на обочине стоит серый могильный камень с надписью:
"Он пытался получить ответ быстрее, чем можно его записать".

 
 
 
 Re:
Сообщение03.04.2011, 11:38 
ИСН в сообщении #430669 писал(а):
В теории сложности алгоритмов, как проедешь первые определения, на обочине стоит серый могильный камень с надписью:
"Он пытался получить ответ быстрее, чем можно его записать".

Если Вы о Колмогоровской сложности, то это не так. Скажем, бесконечную последовательность 1010101010... может породить программа, которую даже я смогу написать, хотя программировать не умею :D

 
 
 
 
Сообщение03.04.2011, 11:43 
Аватара пользователя
Нет, это другое. Я о той сложности, которая фигурирует в "P=NP".

 
 
 
 Re:
Сообщение03.04.2011, 11:44 
ИСН в сообщении #430675 писал(а):
Нет, это другое. Я о той сложности, которая фигурирует в "P=NP".

Дык, вроде ж до сих пор открытая проблема?

 
 
 
 
Сообщение03.04.2011, 11:45 
Аватара пользователя
Проблему я упомянул только как указатель того, из какой это области.

 
 
 
 Re:
Сообщение03.04.2011, 11:50 
ИСН в сообщении #430678 писал(а):
Проблему я упомянул только как указатель того, из какой это области.

Давайте сформулируем вопрос по-другому.
На олимпиаде меня спрашивают, сколько двоек в разложении $2011!$? Я тупо беру листочек и считаю. Теперь мне задают такой же вопрос об очень большом числе и я могу лишь ответить, что число двоек приблизительно равно самому числу. А как точно посчитать?

 
 
 
 
Сообщение03.04.2011, 12:00 
Аватара пользователя
Ответ сам представляет собой очень большое число, которое даже записать быстро не получится (т.е. даже если уже его знаешь). Это возвращает нас к моему первому замечанию.

 
 
 
 
Сообщение03.04.2011, 12:30 
Для $m=2^k$ число двоек равно $n=2^k-1$. А в общем случае разность $m-n$ равна количеству единиц в двоичной записи числа $m$.

 
 
 
 
Сообщение03.04.2011, 12:42 
Аватара пользователя
Xenia1996 в сообщении #430680 писал(а):
На олимпиаде меня спрашивают ...

Возможно они хотят услышать тождество $\lfloor\frac{a}{bc}\rfloor=\lfloor\frac{\lfloor\frac{a}{b}\rfloor}{c}\rfloor$?
C его помощью каждое слагаемое суммы получается делением предыдущего с округлением вниз.

 
 
 
 Re:
Сообщение03.04.2011, 12:45 
Vince Diesel в сообщении #430702 писал(а):
Для $m=2^k$ число двоек равно $n=2^k-1$. А в общем случае разность $m-n$ равна количеству единиц в двоичной записи числа $m$.

Спасибо!

В принципе, то же самое, ибо количество единичных битов мы считаем по такому же алгоритму, каждый раз делим пополам и берём целую часть. Только там складывать не надо, просто писать единичку, если не делится пополам, и 0, если делится.

-- Вс апр 03, 2011 12:48:55 --

bot в сообщении #430708 писал(а):
Xenia1996 в сообщении #430680 писал(а):
На олимпиаде меня спрашивают ...

Возможно они хотят услышать тождество $\lfloor\frac{a}{bc}\rfloor=\lfloor\frac{\lfloor\frac{a}{b}\rfloor}{c}\rfloor$?
C его помощью каждое слагаемое суммы получается делением предыдущего с округлением вниз.

(Оффтоп)

В любом случае, правильный ответ они обязаны засчитать.

 
 
 [ Сообщений: 11 ] 


Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group