문서:계승(수학)

역사 raw
대문 랜덤 문서 최근 토론
분류
1. 개요2. [anchor(하강 계승)]하강 계승 / 상승 계승3. 정의역의 확장4. 알고리즘5. 기타6. 관련 문서

1. 개요

階乘, Factorial
수학 용어. 영단어 factorial [fækˈtɔ:riəl]을 소리나는 대로 쓴 '팩토리얼'[1]이라고 표기하기도 한다. 기억이 안 나면 느낌표라고 표현하기도 한다. 문화어로는 차례곱이라고 하는데 [math(1)]부터 차례대로 곱한다는 의미[2]씩 빼서 [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)]를 가르치지 않기 때문에 계승을 접하는 확률과 통계, 수학 과목에서는 [math(n!=1 times 2 times 3 times cdots cdots times (n-1) times n)]으로 배운다.
그러나 이중 계승([math(!!=!_2)])[3]씩 빼서 [math(2)]나 [math(1)]까지 차례로 곱하라는 기호.]이나 다중 계승([math(overbrace{!!! cdotscdots !!}^k = !_k)])[4]씩 빼서 차례로 곱하라는 기호.], 상승·하강 계승 등의 심화 개념을 이해하려면 식을 거꾸로 기억하는 것이 좋다.

그러니까 [math(displaystyle n! = prod_{i=0}^{n-1} left(n-iright) = n left( n-1 right) left( n-2 right) cdotscdots 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({}_nmathrm P_n)])는 [math(n!)]인데, [math({}_nmathrm P_r = dfrac{n!}{left( n-r right)!})]이므로 [math({}_nmathrm 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)]이다.[5]

계승은 매우 빠른 속도로 증가한다. [math(n=10)]까지의 값은 다음과 같다.
[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까지만 해도 벌써 백만 자리를 넘어간다.

2. 하강 계승 / 상승 계승

하강 계승(Falling Factorial) [math(n^{underline{k}})]은 계승의 정의 [math(displaystyle n! = prod_{i=0}^{n-1}left(n-iright))]에서 [math(i=n-1)]까지가 아닌 [math(i=k-1)]까지의 곱으로 정의된다. 즉,
[math(displaystyle n^{underline{k}} = prod_{i=0}^{k-1} left(n-iright) = nleft(n-1right)left(n-2right)cdotscdotsleft(n-k+2right)left(n-k+1right) = frac{n!}{(n-k)!})]
과 같다. 그런데 [math(dfrac{n!}{(n-k)!} = {}_nmathrm P_k)]이므로 하강 계승은 곧 순열 [math({}_nmathrm P_k)]와 동치임을 알 수 있다. 조합 기호 [math(dbinom nk = dfrac{{}_nmathrm P_k}{k!})]을 이용하면 [math(n^{underline{k}} = k!dbinom nk)]로도 나타낼 수 있다.

이와 비슷하게 상승 계승(Rising Factorial) [math(n^{overline{k}})]은 하강 계승의 부분곱 식에서 [math((n-i))]를 [math((n+i))]로 바꾼 식으로 정의된다.
[math(displaystyle n^{overline{k}} = prod_{i=0}^{k-1} left(n+iright) = nleft(n+1right)left(n+2right)cdotscdotsleft(n+k-2right)left(n+k-1right) = 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(-nright)^{underline{k}} = prod_{i=0}^{k-1}left(-n-iright) = left(-1right)^k prod_{i=0}^{k-1} left(n+iright) = left(-1right)^k n^{overline{k}})]
즉 [math(n^{overline{k}} = left(-1right)^kleft(-nright)^{underline{k}})]임을 알 수 있고, 반대로 [math(n^{underline{k}} = left(-1right)^kleft(-nright)^{overline{k}})]도 성립한다. 상술한 바와 같이 하강 계승은 조합의 정의에서, 상승 계승은 중복 조합의 정의에서 등장하므로 위와 같은 관계는 조합과 중복 조합이 사실상 하나의 식으로 표현될 수 있음을 의미한다. 즉, [math(left(!!dbinom nk !!right) = left(-1right)^k dbinom{-n}k)]의 관계에 있다.

제1종 스털링 수, 제2종 스털링 수, 라흐 수를 정의할 때 쓰인다.

3. 정의역의 확장

계승은 자연수에서만 정의되지만 [math(Gamma)]로 표기하는 감마 함수를 이용하면 정의역을 복소수로 확장할 수 있다.[6]이라면 실수부는 [math(0)] 이하의 정수가 될 수 없다.] 자세한 내용은 감마 함수 문서 참조. 그러니까 감마 함수를 이용하면 [math(1.5!)]같은 것도 계산할 수 있다는 것. 예를 들어 [math(left(-dfrac{1}{2}right)!=Gammaleft(dfrac{1}{2}right)=sqrtpi)]이다. 그래서 이를 통해 순열이나 조합 같은 것도 실수, 복소수로 일반화가 가능하다!

일반 공학용 계산기에 [math(1.5!)]따위를 넣으면 못 구해주지만, 어째서인지 구글 계산기나 일부 계산기에선 잘 구해준다. [math(n! = Gammaleft(n+1right))]를 이용해, 정수가 아닌 수를 넣으면 감마 함수로 구하도록 프로그래밍 되었을 것으로 추정된다.

4. 알고리즘

계승 알고리즘은 컴퓨터에서 두 가지 형태로 구현할 수 있다.

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) 형태의 알고리즘

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))]이지만, 재귀 함수는 반복하여 호출할수록 메모리 공간을 더 차지하므로, 숫자가 커지면 반복문 알고리즘이 상대적으로 효율적이다.

5. 기타

이것을 기반으로 한 공대개그가 존재한다. 예를 들어 [math(3!)]를 '삼!'이라고 강하게 읽으면 일반인, '삼 팩토리얼'이라고 읽으면 공대생, 이라고 읽으면 이론언어학 전공자라는 식. 3이라고 읽으면 수학 귀신 애독자

오랫동안 수학자들을 괴롭힌 P-NP 문제의 단골 소재 중 하나다.


숫자 뒤가 아닌 숫자 앞에 느낌표를 붙이게 되면([math(!n)]의 꼴, [math(n)]은 자연수) [math(n)]개의 원소에 대한 완전순열(Derangement)의 수를 의미하게 되며, 이 때는 준계승(Subfactorial)이라 부르게 된다. 완전순열은 섞인 모자들 속에서 사람들이 아무도 자기 모자를 집어가지 않는 경우 등을 셀 때 쓰이며, [math(!n)]의 공식은 [math(n!)]보다 복잡하다. 자세한 내용은 완전순열 참고.

6. 관련 문서


[1] 간혹 토리얼이라고도 하며, 너무 길다 싶으니 팩이라고도 한다. 하지만 역시 정식 표현은 아니다.[2] 후술하겠지만 [math(1)[3] [math(2)[4] [math(k)[5] 1부터 1까지 차례대로 곱하는 것은 결국 곱하나 마나이기 때문이다.[6] 다만 이 경우에도 허수부가 [math(0)