Как посчитать факториал 100 без калькулятора
Перейти к содержимому

Как посчитать факториал 100 без калькулятора

  • автор:

Как быстро вычислить факториал?

Как калькуляторы вычисляют факториалы? Найдите факториал числа на научном калькуляторе, введите номер и нажмите «х!» ключ. Для этого может потребоваться сначала нажать «shift», «2nd» или «alpha» в зависимости от вашей модели калькулятора и расположения символа. Нажмите «=», чтобы получить результат.

Похожие страницы:Блог

Сколько секунд в месяце? В некоторых месяцах разное количество секунд?

Какие есть 3 вида налогов?

Как найти среднюю точку между двумя точками?

Как вы делаете кадровые прогнозы?

Можно ли умножать факториалы? Факториалы, обозначаемые a. … Вы также можете умножить факториалы вручную. Самый простой способ сделать это — вычислить каждый факториал по отдельности, а затем перемножить их произведения вместе. Вы также можете использовать определенные правила факториалов для извлечения общих множителей, что может упростить процесс умножения.

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

  1. Инициализировать переменную и N.
  2. Проведите итерацию от N-1 до 1, используя переменную i, и сделайте следующее: Инициализируйте переменную sum значением 0. Проведите итерацию от 0 до i-1, используя переменную j, и добавьте к сумме число ans. Прибавьте сумму к годам.
  3. Распечатать ans.

Как решить 5 факториалов?

Чтобы найти факториал 5 или 5!, просто используйте формулу; то есть перемножьте все целые числа от 5 до 1. Когда мы используем формулу для нахождения 5!, мы получаем 120. Итак, 5! = 120.

тогда можно ли умножать факториалы? Факториалы, обозначаемые a. … Вы также можете умножить факториалы вручную. Самый простой способ сделать это — вычислить каждый факториал по отдельности, а затем перемножить их произведения вместе. Вы также можете использовать определенные правила факториалов для извлечения общих множителей, что может упростить процесс умножения.

Как факториалы факториалы?

Как вы делаете факториалы в Java?

Факториальная программа с использованием цикла в java

  1. class FactorialExample <
  2. public static void main (String args []) <
  3. int i, fact = 1;
  4. int number = 5; // Это число для вычисления факториала.
  5. for (i = 1; i <= number; i ++) <
  6. факт = факт * я;
  7. >
  8. System.out.println («Факториал« + число + »:« + факт »);

Чему равен факториал 100000? 100000! =100000×99999×99998×99997×… × 3 × 2 × 1 .

Что такое факториальное правило?

Проще говоря, факториальная функция говорит умножить все целые числа из выбранного числа на единицу. Говоря более математическим языком, факториал числа (n!) равен n(n-1). Например, если вы хотите вычислить факториал для четырех, вы должны написать: 4! = 4 х 3 х 2 х 1 = 24.

Чему равно произведение 2 факториалов? единственный известный факториал, который является произведением двух факториалов: 10! =6!

Можете ли вы распределить факториалы?

Факторное распределение имеет место, когда набор переменных — независимые события. Другими словами, переменные вообще не взаимодействуют; Учитывая два события x и y, вероятность x не изменится, если вы умножите y. Следовательно, вероятность x при условии, что произошло y — P(x|y) — будет такой же, как P(x).

Как сделать факториал без калькулятора?

Как разделить факториалы?

Как посчитать факториал 100? 0

Насколько велик факториал 52?

52! является приблизительно 8.0658e67. Чтобы получить точное представление, просмотрите факториальную таблицу или попробуйте калькулятор «новой школы», который понимает длинные целые числа.

Как вы делаете факториалы в математике? факториал в математике произведение всех положительных целых чисел, меньших или равных заданному положительному целому числу и обозначается этим целым числом и восклицательным знаком. Таким образом, факториал семь записывается как 7!, что означает 1 × 2 × 3 × 4 × 5 × 6 × 7.

Как решить фактор?

Процесс решения по факторингу потребует четырех основных шагов:

  1. Переместите все члены в одну сторону уравнения, обычно влево, с помощью сложения или вычитания.
  2. Полностью разложите уравнение на множители.
  3. Установите каждый коэффициент равным нулю и решите.
  4. Перечислите каждое решение из шага 3 как решение исходного уравнения.

Кто изобрел факториал? Одной из самых основных концепций перестановок и комбинаций является использование факториальной записи. Используя понятие факториалов, многие сложные вещи упрощаются. Использование! был начат Кристиан Крамп в 1808 году.

Умеете ли вы делить факториалы?

Разделение факториалов — это именно то, что он утверждает. Это задача на деление с факториалами в числителе и/или знаменателе. Например, следующее выражение представляет собой деление факториалов: 6���� ���� 4!

Что такое факториал 1? Это по-прежнему считается способом организации, поэтому по определению нулевой факториал равен единице, как 1! равно единице, потому что существует только одно возможное расположение этого набора данных.

Куда идут факториалы в порядке операций?

Факториалы стоят перед экспонентами.

В PEMDAS нет буквы F (для факториала), поэтому математики согласились, что факториалы между скобками и показателями в порядке действий, но эта часть правила обычно не преподается в школе.

Как посчитать факториал 100 без калькулятора

Теперь как найти Факториал 100!
Задача решения факториала оказалась настолько сложной, что точной формулы его нахождения нет до сих пор, но можно привести формулу Стирлинга для приблизительного вычисления факториала:

Она дает результат: 100! ≈ 9,33×10157

Факториал

Как найти факториал

n n!
1 1 1 1
2 2 x 1 = 2 x 1! = 2
3 3 x 2 x 1 = 3 x 2! = 6
4 4 x 3 x 2 x 1 = 4 x 3! = 24
5 5 x 4 x 3 x 2 x 1 = 5 x 4! = 120
6 и так далее и так далее
  • Чтобы вычислить 6!, нужно 5!=120 умножить на 6, получается 720
  • Чтобы вычислить 8!, нужно 7!=5040 умножить на 8, получается 40.320

Факториал нуля

(-1/2)! √π
(1/2)! (1/2)√π
(3/2)! (3/4)√π
(5/2)! (15/8)√π

P(2, 10)
P(2, 6) * P(7, 10)
( P(2, 4) * P(5, 6) ) * ( P(7, 8) * P(9, 10) )
( (P(2, 3) * P(4) ) * P(5, 6) ) * ( P(7, 8) * P(9, 10) )
( ( (2 * 3) * (4) ) * (5 * 6) ) * ( (7 * 8) * (9 * 10) )
( ( 6 * 4 ) * 30 ) * ( 56 * 90 )
( 24 * 30 ) * ( 5 040 )
720 * 5 040
3 628 800

Получается своеобразное дерево, где множители находятся в узлах, а результат получается в корне
Дерево вычисления факториала

10! = 2 8 * 3 4 * 5 2 * 7 1 = 3 628 800

Все алгоритмы тестировались для N равном 1 000, 2 000, 5 000, 10 000, 20 000, 50 000 и 100 000 десятью итерациями. В таблице указано среднее значение времени работы в миллисекундах.
Таблица результатов

График с линейной шкалой
График с линейной шкалой

График с логарифмической шкалой
График с логарифмической шкалой

Алгоритмы быстрого вычисления факториала

Понятие факториала известно всем. Это функция, вычисляющая произведение последовательных натуральных чисел от 1 до N включительно: N! = 1 * 2 * 3 *… * N. Факториал — быстрорастущая функция, уже для небольших значений N значение N! имеет много значащих цифр.

Попробуем реализовать эту функцию на языке программирования. Очевидно, нам понадобиться язык, поддерживающий длинную арифметику. Я воспользуюсь C#, но с таким же успехом можно взять Java или Python.

Наивный алгоритм

Итак, простейшая реализация (назовем ее наивной) получается прямо из определения факториала:

На моей машине эта реализация работает примерно 1,6 секунд для N=50 000.

Далее рассмотрим алгоритмы, которые работают намного быстрее наивной реализации.

Алгоритм вычисления деревом

Первый алгоритм основан на том соображении, что длинные числа примерно одинаковой длины умножать эффективнее, чем длинное число умножать на короткое (как в наивной реализации). То есть нам нужно добиться, чтобы при вычислении факториала множители постоянно были примерно одинаковой длины.

Пусть нам нужно найти произведение последовательных чисел от L до R, обозначим его как P(L, R). Разделим интервал от L до R пополам и посчитаем P(L, R) как P(L, M) * P(M + 1, R), где M находится посередине между L и R, M = (L + R) / 2. Заметим, что множители будут примерно одинаковой длины. Аналогично разобьем P(L, M) и P(M + 1, R). Будем производить эту операцию, пока в каждом интервале останется не более двух множителей. Очевидно, что P(L, R) = L, если L и R равны, и P(L, R) = L * R, если L и R отличаются на единицу. Чтобы найти N! нужно посчитать P(2, N).

Посмотрим, как будет работать наш алгоритм для N=10, найдем P(2, 10):

P(2, 10)
P(2, 6) * P(7, 10)
( P(2, 4) * P(5, 6) ) * ( P(7, 8) * P(9, 10) )
( (P(2, 3) * P(4) ) * P(5, 6) ) * ( P(7, 8) * P(9, 10) )
( ( (2 * 3) * (4) ) * (5 * 6) ) * ( (7 * 8) * (9 * 10) )
( ( 6 * 4 ) * 30 ) * ( 56 * 90 )
( 24 * 30 ) * ( 5 040 )
720 * 5 040
3 628 800

Получается своеобразное дерево, где множители находятся в узлах, а результат получается в корне
Дерево вычисления факториала

Реализуем описанный алгоритм:

Для N=50 000 факториал вычисляется за 0,9 секунд, что почти вдвое быстрее, чем в наивной реализации.

Алгоритм вычисления факторизацией

Второй алгоритм быстрого вычисления использует разложение факториала на простые множители (факторизацию). Очевидно, что в разложении N! участвуют только простые множители от 2 до N. Попробуем посчитать, сколько раз простой множитель K содержится в N!, то есть узнаем степень множителя K в разложении. Каждый K-ый член произведения 1 * 2 * 3 *… * N увеличивает показатель на единицу, то есть показатель степени будет равен N / K. Но каждый K 2 -ый член увеличивает степень еще на единицу, то есть показатель становится N / K + N / K 2 . Аналогично для K 3 , K 4 и так далее. В итоге получим, что показатель степени при простом множителе K будет равен N / K + N / K 2 + N / K 3 + N / K 4 +…

Для наглядности посчитаем, сколько раз двойка содержится в 10! Двойку дает каждый второй множитель (2, 4, 6, 8 и 10), всего таких множителей 10 / 2 = 5. Каждый четвертый дает четверку (2 2 ), всего таких множителей 10 / 4 = 2 (4 и 8). Каждый восьмой дает восьмерку (2 3 ), такой множитель всего один 10 / 8 = 1 (8). Шестнадцать (2 4 ) и более уже не дает ни один множитель, значит, подсчет можно завершать. Суммируя, получим, что показатель степени при двойке в разложении 10! на простые множители будет равен 10 / 2 + 10 / 4 + 10 / 8 = 5 + 2 + 1 = 8.

Если действовать таким же образом, можно найти показатели при 3, 5 и 7 в разложении 10!, после чего остается только вычислить значение произведения:

10! = 2 8 * 3 4 * 5 2 * 7 1 = 3 628 800

Осталось найти простые числа от 2 до N, для этого можно использовать решето Эратосфена:

Эта реализация также тратит примерно 0,9 секунд на вычисление 50 000!

Библиотека GMP

Как справедливо отметил pomme скорость вычисления факториала на 98% зависит от скорости умножения. Попробуем протестировать наши алгоритмы, реализовав их на C++ с использованием библиотеки GMP. Результаты тестирования приведены ниже, по ним получается что алгоритм умножения в C# имеет довольно странную асимптотику, поэтому оптимизация дает относительно небольшой выигрыш в C# и огромный в C++ с GMP. Однако этому вопросу вероятно стоит посвятить отдельную статью.

Сравнение производительности

Все алгоритмы тестировались для N равном 1 000, 2 000, 5 000, 10 000, 20 000, 50 000 и 100 000 десятью итерациями. В таблице указано среднее значение времени работы в миллисекундах.
Таблица результатов

График с линейной шкалой
График с линейной шкалой

График с логарифмической шкалой
График с логарифмической шкалой

Идеи и алгоритмы из комментариев

Хабражители предложили немало интересных идей и алгоритмов в ответ на мою статью, здесь я оставлю ссылки на лучшие из них

Как посчитать факториал 100 без калькулятора

Как калькуляторы вычисляют факториалы? Найдите факториал числа на научном калькуляторе, введите номер и нажмите «х!» ключ. Для этого может потребоваться сначала нажать «shift», «2nd» или «alpha» в зависимости от вашей модели калькулятора и расположения символа. Нажмите «=», чтобы получить результат.

Похожие страницы:Блог
Какие есть 3 вида налогов?
Как найти среднюю точку между двумя точками?
Как вы делаете кадровые прогнозы?
Как найти начальную скорость, зная только время?

Можно ли умножать факториалы? Факториалы, обозначаемые a. … Вы также можете умножить факториалы вручную. Самый простой способ сделать это — вычислить каждый факториал по отдельности, а затем перемножить их произведения вместе. Вы также можете использовать определенные правила факториалов для извлечения общих множителей, что может упростить процесс умножения.

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

  1. Инициализировать переменную и N.
  2. Проведите итерацию от N-1 до 1, используя переменную i, и сделайте следующее: Инициализируйте переменную sum значением 0. Проведите итерацию от 0 до i-1, используя переменную j, и добавьте к сумме число ans. Прибавьте сумму к годам.
  3. Распечатать ans.

Как решить 5 факториалов?

Чтобы найти факториал 5 или 5!, просто используйте формулу; то есть перемножьте все целые числа от 5 до 1. Когда мы используем формулу для нахождения 5!, мы получаем 120. Итак, 5! = 120.

тогда можно ли умножать факториалы? Факториалы, обозначаемые a. … Вы также можете умножить факториалы вручную. Самый простой способ сделать это — вычислить каждый факториал по отдельности, а затем перемножить их произведения вместе. Вы также можете использовать определенные правила факториалов для извлечения общих множителей, что может упростить процесс умножения.

Как факториалы факториалы?

Как вы делаете факториалы в Java?

Факториальная программа с использованием цикла в java

  1. class FactorialExample
  2. System.out.println («Факториал« + число + »:« + факт »);

Чему равен факториал 100000? 100000! =100000×99999×99998×99997×… × 3 × 2 × 1 .

Что такое факториальное правило?

Проще говоря, факториальная функция говорит умножить все целые числа из выбранного числа на единицу. Говоря более математическим языком, факториал числа (n!) равен n(n-1). Например, если вы хотите вычислить факториал для четырех, вы должны написать: 4! = 4 х 3 х 2 х 1 = 24.

Чему равно произведение 2 факториалов? единственный известный факториал, который является произведением двух факториалов: 10! =6!

Можете ли вы распределить факториалы?

Факторное распределение имеет место, когда набор переменных — независимые события. Другими словами, переменные вообще не взаимодействуют; Учитывая два события x и y, вероятность x не изменится, если вы умножите y. Следовательно, вероятность x при условии, что произошло y — P(x|y) — будет такой же, как P(x).

Как сделать факториал без калькулятора?

Как разделить факториалы?

Как посчитать факториал 100? 0

Насколько велик факториал 52?

52! является приблизительно 8.0658e67. Чтобы получить точное представление, просмотрите факториальную таблицу или попробуйте калькулятор «новой школы», который понимает длинные целые числа.

Как вы делаете факториалы в математике? факториал в математике произведение всех положительных целых чисел, меньших или равных заданному положительному целому числу и обозначается этим целым числом и восклицательным знаком. Таким образом, факториал семь записывается как 7!, что означает 1 × 2 × 3 × 4 × 5 × 6 × 7.

Как решить фактор?

Процесс решения по факторингу потребует четырех основных шагов:

  1. Переместите все члены в одну сторону уравнения, обычно влево, с помощью сложения или вычитания.
  2. Полностью разложите уравнение на множители.
  3. Установите каждый коэффициент равным нулю и решите.
  4. Перечислите каждое решение из шага 3 как решение исходного уравнения.

Кто изобрел факториал? Одной из самых основных концепций перестановок и комбинаций является использование факториальной записи. Используя понятие факториалов, многие сложные вещи упрощаются. Использование! был начат Кристиан Крамп в 1808 году.

Умеете ли вы делить факториалы?

Разделение факториалов — это именно то, что он утверждает. Это задача на деление с факториалами в числителе и/или знаменателе. Например, следующее выражение представляет собой деление факториалов: 6���� ���� 4!

Что такое факториал 1? Это по-прежнему считается способом организации, поэтому по определению нулевой факториал равен единице, как 1! равно единице, потому что существует только одно возможное расположение этого набора данных.

Куда идут факториалы в порядке операций?

Факториалы стоят перед экспонентами.

В PEMDAS нет буквы F (для факториала), поэтому математики согласились, что факториалы между скобками и показателями в порядке действий, но эта часть правила обычно не преподается в школе.

Сколько нулей в конце факториала 100?

Факториал одной сотни записывается как 100! Это произведение всех натуральных чисел до ста включительно. Иногда запись факториала имеет такой вид:

100 х 99 х 98 х 97 х … х 4 х 3 х 2 х 1

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

387 000 х 12 900 = 5 027 131 727

Вам не кажется, что здесь есть что-то забавное? Ведь при перемножении двух круглых чисел, то есть тех, которые оканчиваются на нули, невозможно получить некруглое число. Это нарушило бы закон сохранения конечных нулей (закон, который я только что вывел, но, тем не менее, он является верным). Произведение всегда унаследует нулевые окончания своих составляющих. Вот несколько верных примеров этого:

10 х 10 = 100
7 х 20 = 140
30 х 400 = 12 000

Из сомножителей факториала 100 десять заканчиваются на ноль: 10, 20, 30, 40, 50, 60, 70, 80, 90 и 100 (заканчивается на два 0). Это дает уже как минимум одиннадцать конечных нулей, которые 100! обязательно унаследует.
Предупреждение: следование только этому правилу иногда побуждает некоторых кандидатов в своем ответе заявить, что в конце факториала 100 стоят одиннадцать нулей. Такой ответ является неверным. Иногда можно умножить два числа, не заканчивающихся на ноль, и получить произведение, имеющее в конце один или несколько нулей. Вот несколько примеров этого рода:

2 х 5 = 10
5 х 8 = 40
6 х 15 = 90
8 х 125 = 1000

Все, кроме последней пары, входят в сотню составляющих факториала 100. Поэтому ваша работа не закончилась. Теперь мы подходим к закону «сосисок и булочек». Представьте себе ситуацию, когда на пикник одни люди приносят сосиски (в упаковках по десять штук), другие — булочки (упакованные по восемь штук), а некоторые — и то, и другое. Есть единственный способ, позволяющий определить, сколько хотдогов из этих продуктов можно приготовить. Сосчитайте сосиски, сосчитайте булочки и выберите меньшее число из двух.

Тот же самый закон следует использовать и отвечая на наш вопрос. Для этого надо заменить «сосиски» и «булочки» на «сомножители на 2» и «сомножители на 5».

В каждом из приведенных выше уравнений число, которое делится на 2, умножается на число, которое делится на 5. Сомножители на 2 и на 5 при их перемножении «совместно» дают идеальную десятку, что добавляет еще один ноль к общему произведению. Посмотрите на последний пример, где в конце, можно сказать, из воздуха возникает три нуля.

8 х 125 = (2 х 2 х 2) х (5 х 5 х 5)
= (2 х 5) х (2 х 5) х (2 х 5)
= 10 х 10 х 10
= 1000

Поэтому надо составить пары из двоек и пятерок. Возьмем, к примеру, число, равное 692 978 456 718 000 000.

Оно оканчивается на шесть нулей. Это означает, что его можно записать следующим образом:

692 978 456 718 х 10 х 10 х 10 х 10 х 10 х 10,

692 978 456 718 х (2 х 5) х (2 х 5) х (2 х 5) х (2 х 5) х (2 х 5) х (2 х 5).

Первая часть, 692 978 456 718, не делится на 10. В ином случае она бы оканчивалась на ноль, и можно было бы эту часть уменьшить еще в 10 раз. К тому же здесь есть шесть сомножителей, равных 10 (или 2 х 5), что соответствует шести нулям в конце числа 692 978 456 718 000 000. Ну как, убедительно?

Это дает нам надежную систему для определения количества нулей в конце любого большого числа. Выделите сомножители 2 и 5. Составьте из них пары и перемножьте их: (2 х 5) х (2 х 5) х (2 х 5) х … Число пар из двоек и пятерок равно количеству нулей в конце. Закройте глаза на все, что осталось слева.

В целом слева у вас останется двойка или пятерка, для которых не нашлось пары. Обычно это двойки. Более того, когда вы имеете дело с факториалом, это всегда двойки. (В факториалах имеется больше четных множителей, чем множителей, которые делятся на 5.) Поэтому узким местом является число пятерок. Из этого следует, что вопрос можно сформулировать по-другому: сколько раз 100! можно разделить без остатка на 5?

Эту арифметическую операцию можно легко проделать даже в голове. В диапазоне от 1 до 100 есть 20 чисел, которые делятся на пятерку: 5, 10, 15, …, 95, 100. Обратите внимание, что 25 дает 2 множителя, равные 5 (25 = 5 х 5), и к тому же в этой группе есть еще три числа, в состав которых входит 25: 50, 75 и 100. В совокупности это добавляет еще четыре пятерки, а всего их 24. 24 множителя на пять дают 24 пары с равным числом двоек, в результате чего получается 24 множителя на 10 (оставляя слева еще множество двоек, для которых не оказалось пары). Таким образом, в конце 100! будет 24 нуля.

Если вам любопытно узнать точный ответ, то значение факториала 100 равно:

93 326 215 443 944 152 681 699 238 856 266 700 490 715 968 264 381 621 468 592 963 895 217 599 993 229 915 608 941 463 976 156 518 286 253 697 920 827 223 758 251 185 210 916 864 000 000 000 000 000 000 000 000.

Разбор по книге «Действительно ли Вы достаточно умны, чтобы работать в Google?»

Алгоритмы быстрого вычисления факториала

Понятие факториала известно всем. Это функция, вычисляющая произведение последовательных натуральных чисел от 1 до N включительно: N! = 1 * 2 * 3 *… * N. Факториал — быстрорастущая функция, уже для небольших значений N значение N! имеет много значащих цифр.

Попробуем реализовать эту функцию на языке программирования. Очевидно, нам понадобиться язык, поддерживающий длинную арифметику. Я воспользуюсь C#, но с таким же успехом можно взять Java или Python.

Наивный алгоритм

Итак, простейшая реализация (назовем ее наивной) получается прямо из определения факториала:

На моей машине эта реализация работает примерно 1,6 секунд для N=50 000.

Далее рассмотрим алгоритмы, которые работают намного быстрее наивной реализации.

Алгоритм вычисления деревом

Первый алгоритм основан на том соображении, что длинные числа примерно одинаковой длины умножать эффективнее, чем длинное число умножать на короткое (как в наивной реализации). То есть нам нужно добиться, чтобы при вычислении факториала множители постоянно были примерно одинаковой длины.

Пусть нам нужно найти произведение последовательных чисел от L до R, обозначим его как P(L, R). Разделим интервал от L до R пополам и посчитаем P(L, R) как P(L, M) * P(M + 1, R), где M находится посередине между L и R, M = (L + R) / 2. Заметим, что множители будут примерно одинаковой длины. Аналогично разобьем P(L, M) и P(M + 1, R). Будем производить эту операцию, пока в каждом интервале останется не более двух множителей. Очевидно, что P(L, R) = L, если L и R равны, и P(L, R) = L * R, если L и R отличаются на единицу. Чтобы найти N! нужно посчитать P(2, N).

Посмотрим, как будет работать наш алгоритм для N=10, найдем P(2, 10):

P(2, 10)
P(2, 6) * P(7, 10)
( P(2, 4) * P(5, 6) ) * ( P(7, 8) * P(9, 10) )
( (P(2, 3) * P(4) ) * P(5, 6) ) * ( P(7, 8) * P(9, 10) )
( ( (2 * 3) * (4) ) * (5 * 6) ) * ( (7 * 8) * (9 * 10) )
( ( 6 * 4 ) * 30 ) * ( 56 * 90 )
( 24 * 30 ) * ( 5 040 )
720 * 5 040
3 628 800

Получается своеобразное дерево, где множители находятся в узлах, а результат получается в корне
Дерево вычисления факториала

Реализуем описанный алгоритм:

Для N=50 000 факториал вычисляется за 0,9 секунд, что почти вдвое быстрее, чем в наивной реализации.

Алгоритм вычисления факторизацией

Второй алгоритм быстрого вычисления использует разложение факториала на простые множители (факторизацию). Очевидно, что в разложении N! участвуют только простые множители от 2 до N. Попробуем посчитать, сколько раз простой множитель K содержится в N!, то есть узнаем степень множителя K в разложении. Каждый K-ый член произведения 1 * 2 * 3 *… * N увеличивает показатель на единицу, то есть показатель степени будет равен N / K. Но каждый K 2 -ый член увеличивает степень еще на единицу, то есть показатель становится N / K + N / K 2 . Аналогично для K 3 , K 4 и так далее. В итоге получим, что показатель степени при простом множителе K будет равен N / K + N / K 2 + N / K 3 + N / K 4 +…

Для наглядности посчитаем, сколько раз двойка содержится в 10! Двойку дает каждый второй множитель (2, 4, 6, 8 и 10), всего таких множителей 10 / 2 = 5. Каждый четвертый дает четверку (2 2 ), всего таких множителей 10 / 4 = 2 (4 и 8). Каждый восьмой дает восьмерку (2 3 ), такой множитель всего один 10 / 8 = 1 (8). Шестнадцать (2 4 ) и более уже не дает ни один множитель, значит, подсчет можно завершать. Суммируя, получим, что показатель степени при двойке в разложении 10! на простые множители будет равен 10 / 2 + 10 / 4 + 10 / 8 = 5 + 2 + 1 = 8.

Если действовать таким же образом, можно найти показатели при 3, 5 и 7 в разложении 10!, после чего остается только вычислить значение произведения:

10! = 2 8 * 3 4 * 5 2 * 7 1 = 3 628 800

Осталось найти простые числа от 2 до N, для этого можно использовать решето Эратосфена:

Эта реализация также тратит примерно 0,9 секунд на вычисление 50 000!

Библиотека GMP

Как справедливо отметил pomme скорость вычисления факториала на 98% зависит от скорости умножения. Попробуем протестировать наши алгоритмы, реализовав их на C++ с использованием библиотеки GMP. Результаты тестирования приведены ниже, по ним получается что алгоритм умножения в C# имеет довольно странную асимптотику, поэтому оптимизация дает относительно небольшой выигрыш в C# и огромный в C++ с GMP. Однако этому вопросу вероятно стоит посвятить отдельную статью.

Сравнение производительности

Все алгоритмы тестировались для N равном 1 000, 2 000, 5 000, 10 000, 20 000, 50 000 и 100 000 десятью итерациями. В таблице указано среднее значение времени работы в миллисекундах.
Таблица результатов

График с линейной шкалой
График с линейной шкалой

График с логарифмической шкалой
График с логарифмической шкалой

Идеи и алгоритмы из комментариев

Хабражители предложили немало интересных идей и алгоритмов в ответ на мою статью, здесь я оставлю ссылки на лучшие из них

Вычислите факториал 100 со всеми цифрами

столкнулся с проблемой расчета 100 факториал.

Вот что я попробовал первым в Perl вычислять 100! :

Но это дает мне 9.33262154439441e+157 .

Мне нужен ответ со всеми цифрами.

задан 21 марта ’13, 18:03

3 ответы

Двойники (которые использует большинство Perls) имеют только

16 цифр точности. Вам нужно использовать другую систему, чтобы получить 158 цифр точности, которые вам нужны.

Это заставит Perl автоматически обрабатывать все числа в вашем скрипте как Math::BigInt объекты.

Если вам нужен более точный контроль (для обработки некоторых чисел как BigInt и некоторые числа с плавающей запятой), затем посмотрите решение Кришначандры Шармы и явно используйте Math::BigInt конструктор.

Math::BigInt кстати, имеет встроенную факториальную функцию:

Двойники (которые использует большинство Perls) имеют только

16 цифр точности. Вам нужна другая система, чтобы получить 158 цифр точности, которые вам нужны. Попробуйте использовать Math::BigInt .

ответ дан 21 мар ’13, в 19:03

По определению, bigint работает, перегружая обработку целых чисел и литералов с плавающей запятой, преобразовывая их в объекты Math::BigInt. Итак, с помощью простого for цикла мы можем получить факториал очень больших целых чисел.

Это дает следующий вывод:

тогда как нормальная программа, подобная этой, дрожала бы без значимого вывода

ответ дан 16 окт ’15, 13:10

Не тот ответ, который вы ищете? Просмотрите другие вопросы с метками perl factorial bigint or задайте свой вопрос.

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *