200! за 20 шагов!!!?????
От: programmer_kia  
Дата: 20.03.03 09:30
Оценка:
может кто подскажет, как посчитать 200!(факториал) за количество шагов не >20????
если за шаг считать одно умножение!!!

20.03.03 13:35: Перенесено модератором из 'Алгоритмы' — _MM_
Re: 200! за 20 шагов!!!?????
От: orangy Россия
Дата: 20.03.03 09:37
Оценка:
Здравствуйте, programmer_kia, Вы писали:

PK>может кто подскажет, как посчитать 200!(факториал) за количество шагов не >20????

PK>если за шаг считать одно умножение!!!
Использовать сложение
А что за задача такая странная?
... << RSDN@Home 1.0 beta 6a | Сейчас четверг, 15:03, слушаю тишину >>
"Develop with pleasure!"
Re: 200! за 20 шагов!!!?????
От: mrhru Россия  
Дата: 20.03.03 09:50
Оценка: 4 (1)
Здравствуйте, programmer_kia, Вы писали:

PK>может кто подскажет, как посчитать 200!(факториал) за количество шагов не >20????

PK>если за шаг считать одно умножение!!!

По формуле Стирлинга. 1 шаг
Евгений
Re: 200! за 20 шагов!!!?????
От: ilnar Россия  
Дата: 20.03.03 10:22
Оценка:
Здравствуйте, programmer_kia, Вы писали:

PK>может кто подскажет, как посчитать 200!(факториал) за количество шагов не >20????

PK>если за шаг считать одно умножение!!!

подсказка:
200! = (100!)^2*2^100. последний множитель вычисляется простым сдвигом
100! = (50!)^2*2^50
50! = (25!)^2*2^25
25! = 25*(12!)^2*2^12
12! = (6!)^2*2^6
6! = (3!)^2*2^3
3! = 6
а алгоритм наверно понял
Re[2]: 200! за 20 шагов!!!?????
От: Аноним  
Дата: 20.03.03 10:28
Оценка:
Здравствуйте, ilnar, Вы писали:

i>6! = (3!)^2*2^3


720 = 6! = (3!)^2*2^3 = 6^2 * 8 = 36 * 8 = 288.
720 = 288.
Re: 200! за 20 шагов!!!?????
От: TomRay  
Дата: 20.03.03 10:31
Оценка:
Здравствуйте, programmer_kia, Вы писали:

PK>может кто подскажет, как посчитать 200!(факториал) за количество шагов не >20????

PK>если за шаг считать одно умножение!!!

Предварительно создать таблицу факториалов (скажем до 1000). А потом ЗА ОДИН ШАГ найти 200!
Re[2]: 200! за 20 шагов!!!?????
От: Михаил Можаев Россия www.mozhay.chat.ru
Дата: 20.03.03 10:32
Оценка:
Здравствуйте, ilnar, Вы писали:

I>подсказка:

I>200! = (100!)^2*2^100. последний множитель вычисляется простым сдвигом
I>100! = (50!)^2*2^50
I>50! = (25!)^2*2^25
I>25! = 25*(12!)^2*2^12
I>12! = (6!)^2*2^6
I>6! = (3!)^2*2^3
I>3! = 6
I>а алгоритм наверно понял

Неправда. Взять хотя бы строку:
6! = (3!)^2*2^3

Левая часть:
1*2*3*4*5*6

Правая часть:
1*2*3*1*2*3*2*2*2 = 1*2*3*2*4*6

Итого:
1*2*3*4*5*6 != 1*2*3*2*4*6

А жаль...
... << RSDN@Home 1.0 beta 5 >>
Re[3]: 200! за 20 шагов!!!?????
От: ilnar Россия  
Дата: 20.03.03 10:37
Оценка:
Здравствуйте, Михаил Можаев, Вы писали:

ММ>Здравствуйте, ilnar, Вы писали:


I>>подсказка:

I>>200! = (100!)^2*2^100. последний множитель вычисляется простым сдвигом
I>>100! = (50!)^2*2^50
I>>50! = (25!)^2*2^25
I>>25! = 25*(12!)^2*2^12
I>>12! = (6!)^2*2^6
I>>6! = (3!)^2*2^3
I>>3! = 6
I>>а алгоритм наверно понял

ММ>Неправда. Взять хотя бы строку:

ММ>6! = (3!)^2*2^3

ММ>Левая часть:

ММ>1*2*3*4*5*6

ММ>Правая часть:

ММ>1*2*3*1*2*3*2*2*2 = 1*2*3*2*4*6

ММ>Итого:

ММ>1*2*3*4*5*6 != 1*2*3*2*4*6

ММ>А жаль...


лажанулся, ведь даже не подумал об этом,
но факториал можно еще за один шаг вычислить с помощью шаблонов, тогда конечно компилятор будет париться
Re: 200! за 20 шагов!!!?????
От: Кодт Россия  
Дата: 20.03.03 10:53
Оценка: 62 (7)
Здравствуйте, programmer_kia, Вы писали:

PK>может кто подскажет, как посчитать 200!(факториал) за количество шагов не >20????

PK>если за шаг считать одно умножение!!!

Невозможно, по той причине, что на отрезке [1, 200] больше 20 простых чисел (и каждое из них присутствует в разложении числа 200! хотя бы в степени 1).
Перекуём баги на фичи!
Re: Решение: 200! за 20 шагов!!!?????
От: Димчанский Литва http://dimchansky.github.io/
Дата: 20.03.03 11:55
Оценка: 26 (2)
Здравствуйте, programmer_kia, Вы писали:

PK>может кто подскажет, как посчитать 200!(факториал) за количество шагов не >20????

PK>если за шаг считать одно умножение!!!

200! = 2^197 * 3^97 * 5^49 * 7^32 * 11^19 * 13^16 * 17^11 * 19^10 * 23^8 * 29^6 * 31^6 * 37^5 * 41^4 * 43^4 * 47^4 * 53^3 * 59^3 * 61^3 * 67^2 * 71^2 * 73^2 * 79^2 * 83^2 * 89^2 * 97^2 * 101 * 103 * 107 * 109 * 113 * 127 * 131 * 137 * 139 * 149 * 151 * 157 * 163 * 167 * 173 * 179 * 181 * 191 * 193 * 197 * 199

Нельзя умножить менее, чем за 20 шагов.

Разложение факториала числа в такой вид можно сделать по следующему скрипту (для MatLab):
N = 200;
p = primes(N); % находим все простые числа до N
s = zeros(1,length(p));
for i=2:N,   
    primes_factor = factor(i); % раскладываем на простые множители
    for j=1:length(primes_factor),
        indx = find(p==primes_factor(j));
        s(indx) = s(indx) + 1;
    end
end
% выводим результат
fprintf(['%d! = '],N);
for i=1:length(p),   
    if s(i)~=0,
        if i~=1,
            fprintf([' * ']);
        end
        if s(i)>1,
            fprintf([' %d^%d'],p(i),s(i));
        else
            fprintf([' %d'],p(i));            
        end
    end
end

Примеры вычислений:
10! = 2^8 * 3^4 * 5^2 * 7
20! = 2^18 * 3^8 * 5^4 * 7^2 * 11 * 13 * 17 * 19
30! = 2^26 * 3^14 * 5^7 * 7^4 * 11^2 * 13^2 * 17 * 19 * 23 * 29
100! = 2^97 * 3^48 * 5^24 * 7^16 * 11^9 * 13^7 * 17^5 * 19^5 * 23^4 * 29^3 * 31^3 * 37^2 * 41^2 * 43^2 * 47^2 * 53 * 59 * 61 * 67 * 71 * 73 * 79 * 83 * 89 * 97
Re: 200! за 20 шагов!!!?????
От: vvaizh http://izh-test.sourceforge.net/
Дата: 20.03.03 12:58
Оценка:
Здравствуйте, programmer_kia, Вы писали:

PK>может кто подскажет, как посчитать 200!(факториал) за количество шагов не >20????

PK>если за шаг считать одно умножение!!!

Забей таблицу констант!
http://izh-test.sourceforge.net/russian/introduction.html
Re[2]: 200! за 20 шагов!!!?????
От: Pushkin Россия www.linkbit.com
Дата: 20.03.03 13:00
Оценка:
Здравствуйте, vvaizh, Вы писали:

V>Забей таблицу констант!


А лучше просто забей
Re[2]: 200! за 20 шагов!!!?????
От: mrhru Россия  
Дата: 22.03.03 03:56
Оценка:
Здравствуйте, Кодт, Вы писали:

К>Здравствуйте, programmer_kia, Вы писали:


PK>>может кто подскажет, как посчитать 200!(факториал) за количество шагов не >20????

PK>>если за шаг считать одно умножение!!!

К>Невозможно, по той причине, что на отрезке [1, 200] больше 20 простых чисел (и каждое из них присутствует в разложении числа 200! хотя бы в степени 1).


ИМХО, условие задачи сформулировано несколько расплывчато.

если условие задачи уточнить — не использовать изначально числа > 200, то

200! = X ^ N + Y

с учётом того, что 200! ~= 10^375
200! ~= 200^162

X = 200
N = 162, и 200^162 вычисляется за 7 умножений (и 2 сложения)
Оставшиеся 12 умножений с лихвой хватит на вычисление остатка Y = 200! — 200^162

Евгений
Re[2]: 200! за 20 шагов!!!?????
От: FireShock Россия  
Дата: 23.03.03 21:06
Оценка:
Здравствуйте, TomRay, Вы писали:

TR>Предварительно создать таблицу факториалов (скажем до 1000). А потом ЗА ОДИН ШАГ найти 200!


Кто в .NET работает? Там нет таблиц всяких (факториалы, простые числа ...)?

... Вера. Безоговорочное приятие того, что люди незнающие рассказывают о вещах небывалых. — А. Бирс
...
Instagram
Re[3]: 200! за 20 шагов!!!?????
От: Кодт Россия  
Дата: 24.03.03 10:49
Оценка:
Здравствуйте, FireShock, Вы писали:

FS>Кто в .NET работает? Там нет таблиц всяких (факториалы, простые числа ...)?


Факториалы

13! = 6'227'020'800 > 2^32 = 4'294'967'296

А таблицу из 12 чисел заполнить от руки легко (а то и вычислять на ходу).
Перекуём баги на фичи!
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.