2014 dxdy logo

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

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


Правила форума


В этом разделе нельзя создавать новые темы.

Если Вы хотите задать новый вопрос, то не дописывайте его в существующую тему, а создайте новую в корневом разделе "Помогите решить/разобраться (М)".

Если Вы зададите новый вопрос в существующей теме, то в случае нарушения оформления или других правил форума Ваше сообщение и все ответы на него могут быть удалены без предупреждения.

Не ищите на этом форуме халяву, правила запрещают участникам публиковать готовые решения стандартных учебных задач. Автор вопроса обязан привести свои попытки решения и указать конкретные затруднения.

Обязательно просмотрите тему Правила данного раздела, иначе Ваша тема может быть удалена или перемещена в Карантин, а Вы так и не узнаете, почему.



Начать новую тему Ответить на тему На страницу 1, 2, 3  След.
 
 Антифакториал
Сообщение29.07.2008, 20:30 
Аватара пользователя


23/01/08
565
Две независимые задачи.

1. Определить, является ли заданное число факториалом.
2. Требуется по факториалу найти исходное число.

 Профиль  
                  
 
 
Сообщение29.07.2008, 20:43 
Заслуженный участник
Аватара пользователя


18/05/06
13438
с Территории
Решение перебором столь ненамного длиннее самого условия задачи, что и говорить не о чем.

 Профиль  
                  
 
 
Сообщение29.07.2008, 21:11 
Аватара пользователя


23/01/08
565
Хм... Думал, в качестве альтернативы, может как-нибудь через формулу Стирлинга, например.

 Профиль  
                  
 
 
Сообщение29.07.2008, 22:15 
Заслуженный участник
Аватара пользователя


22/11/06
1096
Одесса, ОНУ ИМЭМ
Можно, конечно, приблизительно обратить формулу Стирлинга, получить приближенный "антифакториал" и попробовать подставить числа в пределах погрешности. Но это достаточно трудоемкая операция ИМХО: даже в простейшем случае надо разрешать уравнение вида $n(\ln n-1)+{1\over2}\ln n = {\rm const}$, применяя численные методы.

Я бы сделал иначе: подсчитал бы число нулей, на которое заканчивается проверяемое число. По числу нулей однозначно выяснил бы (не то, чтобы это было совсем просто, но...) возможное значение антифакториала с погрешностью $\pm2$ и проверил бы эти числа.

 Профиль  
                  
 
 
Сообщение29.07.2008, 22:49 


13/06/08
43
Мне вот что пришло на ум:
Исходить из определения факториала.
Получается, что число должно представляться в виде множителей, причём каждый не более одного раза. Они должны быть последовательные. Проверку на это начать лучше с наибольшего возможного.


Я не до конца правда эту идею продумал. Подумаю ещё может что и выйдет из этого (или не выйдет).

 Профиль  
                  
 
 
Сообщение29.07.2008, 23:05 
Заслуженный участник
Аватара пользователя


22/11/06
1096
Одесса, ОНУ ИМЭМ
Цитата:
Я не до конца правда эту идею продумал.

Ваша идея, по-видимому, потребует полного разложения на множители. Эта задача является весьма трудоемкой и для проверки числа $n$ потребует $O(\sqrt n)$ шагов. В то же время простой перебор факториалов, не превосходящих $N$, продлится не более $O(\ln n)$.

 Профиль  
                  
 
 
Сообщение29.07.2008, 23:13 
Заслуженный участник
Аватара пользователя


07/03/06
1898
Москва
Отсеивать числа, не являющиеся факториалом, можно.
У факториала степень двойки определяется:
$ord_2N!=\sum\limits_{i=1}^{\lfloor\frac{\ln N}{ln 2}\rfloor}\lfloor \frac{N}{2^i}\rfloor$,
степень тройки:
$ord_3N!=\sum\limits_{i=1}^{\lfloor\frac{\ln N}{ln 3}\rfloor}\lfloor \frac{N}{3^i}\rfloor$.
Причем, порядок двойки мало отличается от самого $N$.

 Профиль  
                  
 
 
Сообщение29.07.2008, 23:14 


13/06/08
43
Цитата:
Эта задача является весьма трудоемкой

Ну Я ответил что первое пришло на ум.

А вот ещё идея:

для случая когда число больше трёх
делим целочисленно на два наше число и проверяем
если произведение (число/2) * (число/2 -1)> число то
делим ещё раз и так далее
а если меньше значит у нас появится возможный промежуток, в котором искомый ответ задачи.

этот алгоритм возможно не полно описан я его ещё не протестировал хорошенько
может что не учёл тут

 Профиль  
                  
 
 
Сообщение29.07.2008, 23:21 
Заслуженный участник
Аватара пользователя


22/11/06
1096
Одесса, ОНУ ИМЭМ
Цитата:
Отсеивать числа, не являющиеся факториалом, можно.

Вообщем-то, мое предложение считать нули в десятичной системе счисления эквивалентно подсчету ${\rm ord}_5 n!$.
Цитата:
для случая когда число больше трёх
делим целочисленно на два наше число и проверяем
если произведение (число/2) * (число/2 -1)> число то
делим ещё раз и так далее
а если меньше значит у нас появится возможный промежуток, в котором искомый ответ задачи.

Что-то я не уловил. Неравенство $\lfloor n/2 \rfloor\lfloor n/2 -1\rfloor > n $ верно при всех $n\ge8$.

 Профиль  
                  
 
 
Сообщение29.07.2008, 23:25 


13/06/08
43
Цитата:
Неравенство $\lfloor n/2 \rfloor\lfloor n/2 -1\rfloor > n $ верно при всех $n\ge8$.

Да, действительно.
Тогда наверное нужно с увеличением числа увеличивать и делитель.
А насколько велико число можно по степени 10, например судить.

 Профиль  
                  
 
 
Сообщение29.07.2008, 23:31 
Заслуженный участник
Аватара пользователя


22/11/06
1096
Одесса, ОНУ ИМЭМ
Цитата:
Тогда наверное нужно с увеличением числа увеличивать и делитель.

Вы не могли бы разъяснить предлагаемый вами алгоритм подробнее? Я не понимал, чего вы добиваетесь, деля на 2, а теперь и вовсе потерял нить рассуждений.

 Профиль  
                  
 
 
Сообщение29.07.2008, 23:38 


23/07/08
14
Можно воспользоваться итерационной формулой

x_n = x_n_-_1/n

x_1 - это число, которое мы проверяем. На каждом шаге:
1. Если x_n = n+1, то x_1 = x_n!.
2. Если не делится без остатка, то х_1 не является факториалом.

Прошу прощения за столь вольное изложение:).

 Профиль  
                  
 
 
Сообщение29.07.2008, 23:44 
Заслуженный участник
Аватара пользователя


07/03/06
1898
Москва
Бодигрим писал(а):
Вообщем-то, мое предложение считать нули в десятичной системе счисления эквивалентно подсчету ${\rm ord}_5 n!$.

Дело в том, что ${\rm ord_2 N!}<N$ и мало от него отличается при относительно небольших $N$ (а для практических расчетов и совсем мало). Соответственно, зная порядок $N$, используем степень тройки уже как проверочную.

 Профиль  
                  
 
 
Сообщение30.07.2008, 00:00 
Заслуженный участник
Аватара пользователя


22/11/06
1096
Одесса, ОНУ ИМЭМ
Вообще при практической реализации ИМХО тут главная задача - как можно быстрее уйти от "длинной арифметики" или по крайней мере сделать вычисления как можно более простыми с точки зрения используемого технического обеспечения. В этом плане прямой перебор плох, алгоритм Sergei Suvorov'а несколько лучше (правда он использует деление, которое более трудоемко, чем умножение)... Для бинарных компьютеров, наверное, в качестве первой проверки действительно стоит подсчитать $ord_2 N!$... Короче, это уже вопросы реализации.

 Профиль  
                  
 
 
Сообщение30.07.2008, 17:15 
Аватара пользователя


23/01/08
565
Бодигрим под бинарными Вы имеете ввиду обычные x86 совместимые? И что значит $ord_2 N$?

Sergei Suvorov у Вас вроде как тоже перебор, и, скорее всего, потребуется вводить длинные числа.

Мне тут удалось узнать еще такой вариант для случая не совсем больших чисел, который знакомые как-то раз применили на ACM: просто посчитали заранее и загнали в таблицу, а потом оттуда брали.

А вообще идея с нулями интересная, сам так пытался сделать, но не получилось определить этот самый интервал из пяти чисел :( .

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

 Профиль  
                  
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 40 ]  На страницу 1, 2, 3  След.

Модераторы: Модераторы Математики, Супермодераторы



Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group