[목차] == 개요 == {{{+2 階乘, Factorial }}} [[수학]] 용어. 영단어 factorial [fækˈtɔ:riəl]을 소리나는 대로 쓴 '팩토리얼'[* 간혹 '''펙'''토리얼이라고도 하며, 너무 길다 싶으니 팩이라고도 한다. 하지만 역시 정식 표현은 아니다.]이라고 표기하기도 한다. 기억이 안 나면 [[느낌표]]라고 표현하기도 한다. [[문화어]]로는 [[차례곱]]이라고 하는데 [math(1)]부터 차례대로 곱한다는 의미[* 후술하겠지만 [math(1)]씩 빼서 [math(1)]까지 차례로 곱한다는 뜻으로 외우는 것이 좋다.]이다. 자연수 [math(n)]을 이용하여 기호로는 간단하게 [math(n!)]로 나타내며 [math(1)]부터 [math(n)]까지의 자연수를 모두 곱하는 것을 의미한다. [math(\displaystyle n! = \prod_{k=1}^n k)]로 나타내기도 하는데, [math(k=1)]부터 [math(k=n)]까지 합 연산을 의미하는 [math(\displaystyle \sum_{k=1}^n)]처럼 [math(\displaystyle \prod)]는 곱연산을 의미한다. 고등학교 교육과정에서는 중복 순열 기호로 ~~왜 써야 하는지도 의문인~~ [math(\Pi)]를 쓰는 것도 있고, 여러개의 항을 곱하는 것을 거의 다루지 않다 보니 곱의 기호 [math(\displaystyle \prod)]를 가르치지 않기 때문에 계승을 접하는 [[확률과 통계]], [[수학(2015)|수학]] 과목에서는 [math(n!=1 \times 2 \times 3 \times \cdots \cdots \times (n-1) \times n)]으로 배운다. 그러나 이중 계승([math(!!=!_2)])[* [math(2)]씩 빼서 [math(2)]나 [math(1)]까지 차례로 곱하라는 기호.]이나 다중 계승([math(\overbrace{!!! \cdots\cdots !!}^k = !_k)])[* [math(k)]씩 빼서 차례로 곱하라는 기호.], 상승·하강 계승 등의 심화 개념을 이해하려면 식을 거꾸로 기억하는 것이 좋다. 그러니까 [math(\displaystyle n! = \prod_{i=0}^{n-1} \left(n-i\right) = n \left( n-1 \right) \left( n-2 \right) \cdots\cdots 3 \cdot 2 \cdot 1)], 즉 '''[math(\boldsymbol n)]부터 [math(\boldsymbol 1)]씩 빼서 [math(\boldsymbol 1)]까지 곱하는 것'''으로 기억하자. [[순열]]이나 [[조합]] 등 [[조합론]]의 여러 분야에서 빈번하게 쓰이는 기호이기 때문에 [math(n)]의 범위는 일반적으로 음이 아닌 정수로 확장, 즉 [math(n=0)]을 포함하는데, [math(0!)]은 특별히 [math(0!=1)]로 정의한다. 예를 들자면 서로 다른 [math(n)]개의 물건에서 [math(n)]개를 모두 뽑아 나열하는 경우의 수([math({}_n\mathrm P_n)])는 [math(n!)]인데, [math({}_n\mathrm P_r = \dfrac{n!}{\left( n-r \right)!})]이므로 [math({}_n\mathrm P_n = \dfrac{n!}{0!})]이며, 정의의 일관성을 유지하려면 [math(0!=1)]이어야 한다. 만약 [math(0! \ne 1)]이라면 순열 뿐만 아니라 조합론의 거의 모든 개념에서 일일이 경우를 나눠서 재정의 해야할 것이다. [math(n! = n \times \left( n-1 \right)!)] 등의 점화식 역시 [math(0!=1)]로 정의하면 자연수 범위에서 성립하는 걸로 만들 수 있다. 참고로 [math(1!=1)]이다.[* 1부터 1까지 차례대로 곱하는 것은 결국 곱하나 마나이기 때문이다.] 계승은 매우 빠른 속도로 증가한다. [math(n=10)]까지의 값은 다음과 같다. ||<table width=99%> [math(n)] || [math(0)] || [math(1)] || [math(2)] || [math(3)] || [math(4)] || [math(5)] || [math(6)] || [math(7)] || [math(8)] || [math(9)] || [math(10)] || || [math(n!)] || [math(1)] || [math(1)] || [math(2)] || [math(6)] || [math(24)] || [math(120)] || [math(720)] || [math(5040)] || [math(40320)] || [math(362,880)] || [math(3,628,800)] || 고작 10까지만 해도 벌써 백만 자리를 넘어간다. == [anchor(하강 계승)]하강 계승 / 상승 계승 == '''하강 계승(Falling Factorial)''' [math(n^{\underline{k}})]은 계승의 정의 [math(\displaystyle n! = \prod_{i=0}^{n-1}\left(n-i\right))]에서 [math(i=n-1)]까지가 아닌 [math(i=k-1)]까지의 곱으로 정의된다. 즉, || [math(\displaystyle n^{\underline{k}} = \prod_{i=0}^{k-1} \left(n-i\right) = n\left(n-1\right)\left(n-2\right)\cdots\cdots\left(n-k+2\right)\left(n-k+1\right) = \frac{n!}{(n-k)!})] || 과 같다. 그런데 [math(\dfrac{n!}{(n-k)!} = {}_n\mathrm P_k)]이므로 하강 계승은 곧 순열 [math({}_n\mathrm P_k)]와 동치임을 알 수 있다. 조합 기호 [math(\dbinom nk = \dfrac{{}_n\mathrm P_k}{k!})]을 이용하면 [math(n^{\underline{k}} = k!\dbinom nk)]로도 나타낼 수 있다. [anchor(상승 계승)] 이와 비슷하게 '''상승 계승(Rising Factorial)''' [math(n^{\overline{k}})]은 하강 계승의 부분곱 식에서 [math((n-i))]를 [math((n+i))]로 바꾼 식으로 정의된다. || [math(\displaystyle n^{\overline{k}} = \prod_{i=0}^{k-1} \left(n+i\right) = n\left(n+1\right)\left(n+2\right)\cdots\cdots\left(n+k-2\right)\left(n+k-1\right) = \frac{(n+k-1)!}{(n-1)!})] || 조합과 비슷하게 위 식은 중복 조합 [math(\left(\!\!\dbinom nk \!\!\right) = \dfrac{(n+k-1)!}{(n-1)!\cdot k!})]에서 등장하므로 [math(n^{\overline{k}} = k! \left(\!\!\dbinom nk \!\!\right))]로도 나타낼 수 있다. 하강 계승의 정의에서 [math(n)]에 [math(-n)]을 대입하면 다음과 같이 식이 바뀌면서 상승 계승에 대한 식으로 변한다. ||[math(\displaystyle \left(-n\right)^{\underline{k}} = \prod_{i=0}^{k-1}\left(-n-i\right) = \left(-1\right)^k \prod_{i=0}^{k-1} \left(n+i\right) = \left(-1\right)^k n^{\overline{k}})] || 즉 [math(n^{\overline{k}} = \left(-1\right)^k\left(-n\right)^{\underline{k}})]임을 알 수 있고, 반대로 [math(n^{\underline{k}} = \left(-1\right)^k\left(-n\right)^{\overline{k}})]도 성립한다. 상술한 바와 같이 하강 계승은 조합의 정의에서, 상승 계승은 중복 조합의 정의에서 등장하므로 위와 같은 관계는 조합과 중복 조합이 사실상 하나의 식으로 표현될 수 있음을 의미한다. 즉, [math(\left(\!\!\dbinom nk \!\!\right) = \left(-1\right)^k \dbinom{-n}k)]의 관계에 있다. [[제1종 스털링 수]], [[제2종 스털링 수]], [[라흐 수]]를 정의할 때 쓰인다. == 정의역의 확장 == 계승은 자연수에서만 정의되지만 [math(\Gamma)]로 표기하는 [[감마 함수]]를 이용하면 정의역을 복소수로 확장할 수 있다.[* 다만 이 경우에도 허수부가 [math(0)]이라면 실수부는 [math(0)] 이하의 정수가 될 수 없다.] 자세한 내용은 [[감마 함수]] 문서 참조. 그러니까 감마 함수를 이용하면 [math(1.5!)]같은 것도 계산할 수 있다는 것. 예를 들어 [math(\left(-\dfrac{1}{2}\right)!=\Gamma\left(\dfrac{1}{2}\right)=\sqrt\pi)]이다. 그래서 이를 통해 [[순열]]이나 [[조합]] 같은 것도 실수, 복소수로 일반화가 가능하다! 일반 공학용 계산기에 [math(1.5!)]따위를 넣으면 못 구해주지만, 어째서인지 [[구글]] 계산기나 일부 계산기에선 잘 구해준다. [math(n! = \Gamma\left(n+1\right))]를 이용해, 정수가 아닌 수를 넣으면 감마 함수로 구하도록 프로그래밍 되었을 것으로 추정된다. == 알고리즘 == 계승 알고리즘은 컴퓨터에서 두 가지 형태로 구현할 수 있다. {{{#!syntax cpp unsigned int fact_iter (unsigned int n) { // 계승은 음이 아닌 정수에 대해서만 정의된다. if (n <= 1) return 1; // 1! = 0! = 1이므로 1을 반환한다. int result = n; for (int i = n - 1; i > 1; i--) result *= i; // n부터 하나씩 값을 줄여가며 그 값을 결과값에 곱한다. return result; } }}} 반복문(iteration, loop) 형태의 알고리즘 {{{#!syntax cpp unsigned int fact_rcsv (unsigned int n) { if (n <= 1) return 1; // 1! = 0! = 1이므로 1을 반환한다. return n * fact_rcsv(n - 1); // n! = n * (n - 1)!이므로, n - 1에 대한 함수를 한 번 더 호출한다. } }}} 재귀(recursion) 형태의 알고리즘 두 알고리즘은 모두 시간복잡도가 [math(O(n))]이지만, 재귀 함수는 반복하여 호출할수록 메모리 공간을 더 차지하므로, 숫자가 커지면 반복문 알고리즘이 상대적으로 효율적이다. == 기타 == 이것을 기반으로 한 [[공대개그]]가 존재한다. 예를 들어 [math(3!)]를 '삼!'이라고 강하게 읽으면 일반인, '삼 팩토리얼'이라고 읽으면 공대생, [[중저모음#s-2.3|애]][[치경음#s-2.15|똑]]이라고 읽으면 [[이론언어학]] 전공자라는 식. --3'''쾅'''이라고 읽으면 [[수학 귀신]] 애독자-- 오랫동안 수학자들을 괴롭힌 [[P-NP 문제]]의 단골 소재 중 하나다. 숫자 뒤가 아닌 숫자 앞에 느낌표를 붙이게 되면([math(!n)]의 꼴, [math(n)]은 자연수) [math(n)]개의 원소에 대한 [[완전순열]](Derangement)의 수를 의미하게 되며, 이 때는 준계승(Subfactorial)이라 부르게 된다. 완전순열은 섞인 모자들 속에서 사람들이 아무도 자기 모자를 집어가지 않는 경우 등을 셀 때 쓰이며, [math(!n)]의 공식은 [math(n!)]보다 복잡하다. 자세한 내용은 [[순열 #s-6|완전순열]] 참고. == 관련 문서 == * [[수학 관련 정보]] * [[감마 함수]] * [[팍술]] * [[소수 계승]] [각주] [include(틀:문서 가져옴, title=계승, version=82)] [[분류: 산술]]