도구스학업·수학

이항계수 나머지(뤼카 정리) 계산기

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을 7진법으로2 6 2 6
k를 7진법으로1 3 1 3
자릿수 개수4자리
뤼카 정리의 답4
BigInt로 통째로 구한 값n이 400 이하일 때만 대조합니다

자릿수마다의 이항계수

자릿값nᵢkᵢC(nᵢ, kᵢ)mod 7
7^3 = 34321C(2, 1)2
7^2 = 4963C(6, 3)6
7^1 = 721C(2, 1)2
7^0 = 163C(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)이 같기 때문입니다.

행마다 홀수는 몇 개인가

n2진법1비트 수홀수 개수
0001
1112
21012
31124
410012
510124
611024
711138
8100012
9100124
10101024
11101138
12110024
13110138
14111038
151111416

n행의 홀수 개수는 정확히 2^(n의 1비트 수)입니다. 1, 3, 7, 15…처럼 비트가 모두 1인 행은 전부 홀수이고, 2, 4, 8…처럼 비트가 하나뿐인 행은 양 끝 둘만 홀수입니다.

큰 수를 만들지 않는 것이 요점입니다. C(1000, 500)은 300자리 가까운 수라 곧이곧대로 나누려면 큰 수 연산이 필요합니다. 뤼카 정리는 n과 k를 p진법으로 적고 자릿수마다 C(nᵢ, kᵢ)를 곱하라고 말합니다. 자릿수는 모두 p 미만이라 곱할 이항계수가 아주 작고, 자릿수 개수는 log_p(n)이라 몇 개뿐입니다.
한 자리만 넘쳐도 전체가 0입니다. 어느 자리에서든 kᵢ > nᵢ 이면 그 항이 C(작은수, 큰수) = 0이라 곱 전체가 0이 됩니다. 「C(n, k)가 p로 나누어떨어지는가」를 큰 수를 만들지 않고 자릿수만 견주어 판정할 수 있는 것이 이 정리의 실용적인 쓰임입니다.
p가 소수가 아니면 쓸 수 없습니다. 증명이 (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 & n = k인 것이 같아집니다. 파스칼 삼각형의 홀수 자리를 칠하면 시에르핀스키 삼각형이 나오는 것이 이 사실의 그림입니다.

계산 방법

  1. 1n, k와 소수 p를 넣으면 C(n, k) mod p가 나옵니다.
  2. 2자릿수 표에서 n과 k의 p진법 숫자가 어떻게 짝지어지는지 봅니다.
  3. 3어느 자리에서 k의 숫자가 n보다 크면 그 항이 0이 되어 전체가 0이 되는 것을 확인합니다.
  4. 4n이 400 이하면 BigInt로 통째로 구한 값과 대조해 보여 줍니다.
  5. 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일 · 결과는 참고용 추정치입니다.