Как быстрее сосчитать число двоек в разложении факториала?

Автор темы xenia1996 
ОбъявленияПоследний пост
ОбъявлениеПравила и принципы форума «Высшая математика»28.10.2009 15:17
ОбъявлениеОткрыта свободная публикация вакансий для математиков26.09.2019 16:34
ОбъявлениеКниги по математике и экономике в добрые руки!10.08.2023 09:45
03.04.2011 12:28
Как быстрее сосчитать число двоек в разложении факториала?
Обычно я пользуюсь следующим алгоритмом, до которого, кстати, сама докопалась.

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

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

двойки.

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

А как сосчитать быстрее? Для $2011!$ данный алгоритм ещё более-менее приемлем, а как, скажем, быть с $(2011!)!$? Есть какая-то формула?
03.04.2011 20:31
новый способ
Если записать множители факториала в десятичном и двоичном виде, то можно легко увидеть, сколько каждый множитель добавляет двоек в результат. Например, множители 18!:
$01|00001$
$02|00010$
$03|00011$
$04|00100$
$05|00101$
$06|00110$
$07|00111$
$08|01000$
$09|01001$
$10|01010$
$11|01011$
$12|01100$
$12|01101$
$14|01110$
$15|01111$
$16|10000$
$17|10001$
$18|10010$
...

Таким образом, по одной двойке добавляют множители 2, 6, 10, 14, 18, по две - 4, 12, по три - 8, по четыре - 16. Итого 16 двоек. Просматривается зависимость:
$1 \cdot round(\frac{18}{4}) + 2 \cdot round(\frac{18}{8}) + 3 \cdot round(\frac{18}{16}) + 4 \cdot round(\frac{18}{32})$. Или в общем виде:
$\sum_{i=1}^{\infty} i \cdot round(\frac{m}{2^{i+1}})$, где $m - основание факториала$.
Сложность вашего алгоритма $O(m)$, а этого $O(log_2 m)$



Редактировалось 1 раз(а). Последний 03.04.2011 20:34.
03.04.2011 21:49
Оценка сложности
Оценивая сложность своего алгоритма г. Hlopchik учитывал сложность записи всех чисел от 1 до m в двоичной системе?
03.04.2011 22:13
оценка сложности
Цитата
museum
Оценивая сложность своего алгоритма г. Hlopchik учитывал сложность записи всех чисел от 1 до m в двоичной системе?
Нет, количество слагаемых, если развернуть знак суммы. Если формулу реализовать на какой-нибудь машине, то количество простых шагов, чтобы получить решение, будет равно $\log m \cdot С$, где С - некоторая константа



Редактировалось 1 раз(а). Последний 04.04.2011 00:37.
04.04.2011 00:19
Русский текст в формулах
Hlopchyk, текст в формулах надо заключать внутрть тега \mbox{...}, тогда будет не вот так $это текст$, а вот так $\mbox{это текст}$. Если будет нужен отступ, то пробелы должны быть внутри этого тега. У нас в отдельной теме с примерами это написано. Поправьте.
Извините, только зарегистрированные пользователи могут публиковать сообщения в этом форуме.

Кликните здесь, чтобы войти