이항계수 나머지(뤼카 정리) 계산기
C(n, k)를 소수 p로 나눈 나머지를 큰 수를 만들지 않고 구합니다. n과 k를 p진법으로 적어 자릿수마다의 작은 이항계수를 곱하는 뤼카 정리를 단계별로 보여 주고, p = 2에서 파스칼 삼각형이 시에르핀스키 무늬가 되는 것까지 함께 냅니다.
C(n, k) 를 구합니다. k > n이면 0입니다.
C(1,000, 500) mod 7
4
7진법 자릿수 4개의 작은 이항계수를 곱해 구했습니다.
자릿수마다의 이항계수
| 자릿값 | nᵢ | kᵢ | C(nᵢ, kᵢ) | mod 7 |
|---|---|---|---|---|
| 7^3 = 343 | 2 | 1 | C(2, 1) | 2 |
| 7^2 = 49 | 6 | 3 | C(6, 3) | 6 |
| 7^1 = 7 | 2 | 1 | C(2, 1) | 2 |
| 7^0 = 1 | 6 | 3 | C(6, 3) | 6 |
마지막 열을 모두 곱해 7로 나눈 나머지가 답입니다 (2 × 6 × 2 × 6 = 4 mod 7). 자릿수는 모두 0부터 6까지라 곱해야 할 이항계수가 아주 작습니다.
p = 2 일 때의 뤼카 정리 — 파스칼 삼각형의 홀짝
C(n, k)가 홀수인 자리만 칠한 것입니다. 시에르핀스키 삼각형이 나오는 까닭이 p = 2의 뤼카 정리입니다 — 홀수인 것과 k의 모든 1비트가 n에도 있는 것(k & n = k)이 같기 때문입니다.
행마다 홀수는 몇 개인가
| n | 2진법 | 1비트 수 | 홀수 개수 |
|---|---|---|---|
| 0 | 0 | 0 | 1 |
| 1 | 1 | 1 | 2 |
| 2 | 10 | 1 | 2 |
| 3 | 11 | 2 | 4 |
| 4 | 100 | 1 | 2 |
| 5 | 101 | 2 | 4 |
| 6 | 110 | 2 | 4 |
| 7 | 111 | 3 | 8 |
| 8 | 1000 | 1 | 2 |
| 9 | 1001 | 2 | 4 |
| 10 | 1010 | 2 | 4 |
| 11 | 1011 | 3 | 8 |
| 12 | 1100 | 2 | 4 |
| 13 | 1101 | 3 | 8 |
| 14 | 1110 | 3 | 8 |
| 15 | 1111 | 4 | 16 |
n행의 홀수 개수는 정확히 2^(n의 1비트 수)입니다. 1, 3, 7, 15…처럼 비트가 모두 1인 행은 전부 홀수이고, 2, 4, 8…처럼 비트가 하나뿐인 행은 양 끝 둘만 홀수입니다.
계산 방법
- 1n, k와 소수 p를 넣으면 C(n, k) mod p가 나옵니다.
- 2자릿수 표에서 n과 k의 p진법 숫자가 어떻게 짝지어지는지 봅니다.
- 3어느 자리에서 k의 숫자가 n보다 크면 그 항이 0이 되어 전체가 0이 되는 것을 확인합니다.
- 4n이 400 이하면 BigInt로 통째로 구한 값과 대조해 보여 줍니다.
- 5아래 삼각형에서 홀수 자리만 칠했을 때 나오는 시에르핀스키 무늬를 봅니다.
자주 묻는 질문
n과 k를 소수 p의 진법으로 적었을 때, C(n, k) ≡ Π C(nᵢ, kᵢ) (mod p)라는 정리입니다. 자릿수는 모두 p 미만이라 곱해야 할 이항계수가 아주 작고, 자릿수 개수는 log_p(n)이라 몇 개뿐입니다. C(1000, 500) 같은 300자리 수를 만들지 않고도 나머지를 구할 수 있습니다.
p진법으로 적었을 때 어느 한 자리에서든 k의 숫자가 n의 숫자보다 크면 나누어떨어집니다. 그 자리의 항이 C(작은수, 큰수) = 0이 되어 곱 전체가 0이 되기 때문입니다. 큰 수를 만들지 않고 자릿수만 견주면 되므로 판정이 매우 빠릅니다.
쓸 수 없습니다. 증명이 (1+x)^p ≡ 1 + x^p (mod p)에서 출발하는데, 이 합동식은 C(p, i)가 0 < i < p에서 모두 p로 나누어떨어질 때만 성립하고 그것은 p가 소수일 때뿐입니다. 실제로 C(4, 2) = 6을 4로 나눈 나머지는 2인데 4진법으로 억지로 적용하면 0이 나옵니다. 합성수 법에서는 소인수마다 따로 구해 중국인의 나머지 정리로 합치는 방법(안드레 정리 등)을 씁니다.
p = 2일 때의 뤼카 정리 때문입니다. 2진법에서 각 자리의 이항계수는 C(0,0) = C(1,0) = C(1,1) = 1이고 C(0,1) = 0뿐이므로, C(n, k)가 홀수인 것과 k의 모든 1비트가 n에도 있는 것(k & n = k)이 같아집니다. 이 조건이 자기 닮음 구조를 만들어 홀수 자리를 칠하면 시에르핀스키 삼각형이 됩니다.
n을 2진법으로 적었을 때의 1비트 개수를 b라 하면 정확히 2^b개입니다. 각 비트마다 「k에 넣을지 말지」를 독립으로 고를 수 있기 때문입니다. 그래서 1, 3, 7, 15처럼 비트가 모두 1인 행은 전부 홀수이고, 2, 4, 8처럼 비트가 하나뿐인 행은 양 끝 둘만 홀수입니다.
경진 프로그래밍에서 「C(n, k)를 소수로 나눈 나머지」를 구할 때 표준으로 쓰입니다. n이 매우 크고 p가 작을 때 특히 유용한데, 팩토리얼을 p까지만 전처리해 두면 자릿수마다의 항을 상수 시간에 구할 수 있기 때문입니다. 정수론에서 이항계수의 소인수 분해를 따질 때도 쿠머 정리와 함께 쓰입니다.
p가 n보다 크면 자릿수가 하나뿐이라 뤼카 정리가 아무 도움이 되지 않습니다. 그때는 팩토리얼과 그 역원을 p까지 전처리해 C(n, k) = n!·(k!)⁻¹·((n−k)!)⁻¹로 바로 구하는 편이 낫습니다. 뤼카 정리는 p가 n보다 작아 자릿수가 여럿일 때 이깁니다.
전송되지 않습니다. 계산은 모두 브라우저 안에서 이루어지고 넣은 값은 이 기기에만 남습니다.
알아두면 좋은 점
- BigInt 대조는 n이 400 이하일 때만 돌립니다. 그보다 크면 통째로 구하는 쪽이 너무 느립니다.
- 법 p는 소수만 받습니다. 합성수를 넣으면 계산하지 않고 그 까닭을 알려 줍니다.
- 삼각형 그림은 32행까지 그립니다. 무늬는 행이 2의 거듭제곱이 될 때마다 한 단계씩 커집니다.
- 이항계수가 p로 몇 번 나누어떨어지는지(쿠머 정리)는 다루지 않습니다. 여기서는 나머지만 냅니다.
함께 보면 좋은 도구
마지막 검증: 2026년 9월 2일 · 결과는 참고용 추정치입니다.