Анализ данных • 23 декабря 2024 • 5 мин чтения

Что такое факториал и как его вычислить

O(n!) — сложность алгоритма, которую боится и программист, и компьютер. Рассказываем о функции, которая появилась в глубокой древности и широко используется сегодня в анализе данных.

Что такое факториал?

Факториал числа — это фундаментальная математическая функция, обозначаемая символом восклицательного знака (!) после числа. Если n — это натуральное число, его факториал (n!) определяется как произведение всех целых чисел от 1 до n. Формально:

n!=n(n-1)(n-2)...1.

Например:

5!=5⋅4⋅3⋅2⋅1=120.

Первыми начали использовать факториалы древнеиндийские математики. С их помощью на рубеже между 300 г. до н. э. и 400 г. н. э. уже умели считать перестановки. Но восклицательный знак стал ассоциироваться с факториалами значительно позже, это обозначение ввели только в 1808 г.

Сейчас же эта функция всё ещё очень актуальна, ибо лежит в основе многих распределений теории вероятностей, а следовательно, повсеместно встречается в Data Science. Но помимо неё, конечно, исследователям, нужно разбираться в линейной алгебре, математическом анализе и обязательно — в статистике. Этому можно научиться на курсе «Математика для анализа данных».

Свойства факториала

1. Быстрый рост

Факториал n! растёт чрезвычайно быстро по мере увеличения n.

Например:

5!=120;
10!=3 628 800;
20!=2,432902⋅10^18.

Это свойство делает факториал важным объектом в теории чисел и аналитической математике. Однако оно также приводит к быстрому переполнению памяти в компьютерных системах при работе с большими значениями n.

2. Чётность

Факториал любого числа n при n > 1 является чётным числом, поскольку
n!=n(n-1)...2⋅1, то есть в числе множителей всегда будет число 2.

3. Нулевая основа

Определение 0! = 1 является аксиоматическим и обусловлено необходимостью согласования математических формул. Например, формула расчёта числа комбинаций и биномиальных коэффициентов:

была бы некорректной без этой аксиомы.

4. Связь с числами комбинаций

Исторически функция факториала появилась как средство для подсчёта числа перестановок. Перестановка — это один из возможных способов упорядочить элементы множества. Например, если имеется три элемента, то число их перестановок равно 3!=3⋅2⋅1=6. В более общем виде факториал даёт ответ на вопрос, сколько есть способов, чтоб упорядочить n элементов.

Все возможные перестановки трёх элементов

5. Асимптотическое поведение

Факториал демонстрирует определённые закономерности при стремлении к бесконечности:

где ln(n!) растёт линейно относительно n⋅ln(n). Это свойство используется в аналитической теории чисел.

6. Обобщение через гамма-функцию

Факториал целого числа n является частным случаем гамма-функции:

n!=Γ(n+1).

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

7. Остатки факториала

Факториал обладает интересными свойствами в теории чисел, связанными с делением на простые числа. Например, если p — простое число, то:

(p-1)!≡-1(mod p).

Это свойство известно как теорема Вильсона и является основой для доказательства простоты конкретных чисел.

Формулы для вычисления факториала

Факториал может быть вычислен разными способами в зависимости от задачи и доступных инструментов. Рассмотрим основные подходы.

1. Рекурсия

Рекурсия — это метод, при котором факториал числа вычисляется через факториал меньших чисел.

n!=n⋅(n-1)!

Базовым случаем здесь является 0!=1!=1. Такой подход удобен для программирования, но может быть ресурсоёмким для больших значений n.

2. Итеративный метод

Итеративное вычисление основывается на последовательном умножении чисел от 1 до n:

n!=1⋅2⋅3⋅...⋅n.

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

3. Формула Стирлинга

Для приближённых вычислений факториала больших чисел используется формула Стирлинга:

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

4. Обобщение через гамма-функцию

В теории функций факториал обобщается с использованием гамма-функции, которая определена следующим образом:

n!=Γ(n+1).

Здесь Γ(x) (или Gamma(x)) — это гамма-функция, которая расширяет определение факториала на все вещественные и комплексные числа, кроме чисел с неположительной вещественной частью. Определяется она следующим образом:

где z — комплексное число с положительной вещественной частью.

5. Табличные значения

Для небольших значений n факториалы часто хранятся в таблицах или вычисляются заранее. Например:

0! = 1;
1! = 1;
2! = 2;
3! = 6;
4! = 24;
5! = 120.

Таблицы позволяют сократить время вычислений в прикладных задачах.

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

Попробуем оценить 10! с использованием формулы Стирлинга:

Рассчитав приблизительное значение, получаем:

10! ≈ 3 598 696.

Для сравнения, точное значение 10! = 3 628 800, что показывает высокую точность формулы Стирлинга, поскольку погрешность составила менее 1%.

Подсчёт же точных значений факториала интереснее рассматривать на примерах, связанных с программированием. К примеру, вот так можно посчитать факториал числа n с помощью Python:

factorial = 1
for i in range(2, n+1):
factorial *= i

В цикле for числа поочерёдно домножаются к результату, в котором по окончании работы цикла и будет содержаться нужное число

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

def factorial(n):
if n == 1:
return 1
return factor

Хотя данный подход и выглядит красиво, его использование чревато переполнением стека — это происходит, когда не отработанные до конца функции «съедают» всю память на стеке настолько, что негде разместить новый функциональный вызов.

В прикладных задачах лучше всего для подсчёта факториала использовать готовые функции из оптимизированных математических библиотек.

import math
n=int(input())
print(math.factorial(n))

На других языках, например на C++, если нет библиотечной функции для подсчёта факториала, можно реализовать вычисления через готовую гамма-функцию.

#include <iostream>
#include <cmath> //здесь содержится гамма функция

// Считаем факториал через гамма функцию
double factorial(int n) {
if (n < 0) {
std::cerr << "Factorial is not defined for negative integers." << std::endl;
return -1; // Error case
}
return tgamma(n + 1);
}

int main() {
int num;
std::cout << "Введите неотрицательное целое число: ";
std::cin >> num;

if (num < 0) {
std::cout << "Неверный ввод." << std::endl;
} else {
double result = factorial(num);
std::cout << "Факториал числа " << num << " равен: " << result << std::endl;
}

return 0;
}

Где применяется факториал

В комбинаторике факториал используется для подсчёта числа перестановок, сочетаний и размещений. Например:
● Число перестановок n элементов равно n!.
● Формула для сочетаний с использованием факториала:

Эта формула позволяет найти число способов выбрать k элементов из n.

2. Теория вероятностей

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

где k — ожидаемое число успехов в n испытаниях, вероятность успеха в каждом равна p.

3. Математический анализ

В математическом анализе факториал появляется в разложениях функций в ряды. Например, разложение экспоненты в ряд Тейлора имеет вид:

Здесь факториал в знаменателе играет роль нормализующего множителя.

4. Статистика

В статистике, как и в теории вероятностей, факториал применяется при вычислении различных распределений для случайных процессов, например пуассоновского. Формула для вероятности в этом распределении включает n! в знаменателе:

где k — количество событий, λ — математическое ожидание случайной величины.

Статью подготовили:
Богдан Сиротич
Яндекс Практикум
Редактор
Анастасия Павлова
Яндекс Практикум
Иллюстратор
Полина Овчинникова
Яндекс Практикум
Иллюстратор

Дайджест блога: ежемесячная подборка лучших статей от редакции

Поделиться
Угадайте, где правда, а где фейк про IT, и получите скидку на курсы Практикума
Tue Feb 11 2025 15:24:41 GMT+0300 (Moscow Standard Time)