도구스학업·수학

팩토리얼 소인수 지수(르장드르 공식) 계산기

n!이 소수 p로 몇 번 나누어떨어지는지를 ⌊n/p⌋ + ⌊n/p²⌋ + …로 구합니다. n!을 만들지 않고 100!의 끝자리 0이 24개라는 것을 알 수 있고, 이항계수의 소인수 지수를 받아올림 횟수로 세는 쿠머 정리까지 함께 냅니다.

!
진법

100!을 10진법으로 적으면

끝에 0이 24개

10의 소인수 가운데 5이 병목입니다. 100!을 만들지 않고 나눗셈 몇 번으로 알아냈습니다.

10의 소인수마다 몇 개씩 쓸 수 있나

소인수밑 안에서의 지수n!에 들어 있는 개수만들 수 있는 0의 수
219797
512424

가장 적은 줄이 답을 정합니다. 밑 안에서의 지수가 1이 아니면 그만큼 나눠 줘야 합니다 — 12진법이면 2를 두 개씩 써야 하므로 2의 개수를 2로 나눕니다. 이 나눗셈을 빼먹는 것이 흔한 실수입니다.

n!을 만들지 않는 것이 요점입니다. 100!은 158자리라 직접 만들어 세기가 번거롭고 자릿수가 조금만 커지면 불가능해집니다. 르장드르 공식은 ⌊n/p⌋ + ⌊n/p²⌋ + …으로, 1부터 n까지 p의 배수가 ⌊n/p⌋개이고 그중 p²의 배수는 한 번 더 세야 한다는 생각 그대로입니다. 항의 개수가 log 규모라 나눗셈 몇 번이면 끝납니다.
끝자리 0의 개수는 5의 개수입니다. 10진법에서 0 하나는 10 = 2×5 하나를 뜻하는데 n!에는 2가 5보다 훨씬 많으므로 5가 병목입니다. 100!이면 ⌊100/5⌋ + ⌊100/25⌋ = 20 + 4 = 24개입니다. 다른 밑에서는 밑을 소인수분해해 지수로 나눈 뒤 가장 적은 것을 고릅니다.
자릿수 합으로 한 줄에 쓸 수도 있습니다. v_p(n!) = (n − s_p(n)) / (p − 1)이며 s_p(n)은 n을 p진법으로 적었을 때 자릿수의 합입니다. 반복 없이 한 번에 나오고, 위의 합과 언제나 같아야 하므로 좋은 검산이 됩니다. 자릿수 합이 n에 견주어 작으므로 v_p(n!)이 대략 n/(p−1)이라는 것도 여기서 보입니다.
쿠머 정리 — 받아올림을 세면 됩니다. C(n, k)가 p로 몇 번 나누어떨어지는지는 k와 n−k를 p진법으로 더할 때 일어나는 받아올림의 횟수와 같습니다. 받아올림이 한 번도 없으면 나누어떨어지지 않는데, 이것이 뤼카 정리의 「어느 자리에서든 k의 숫자가 n보다 크면 0」과 같은 말입니다. 뤼카는 나머지를, 쿠머는 지수를 말해 서로 상보적입니다.

계산 방법

  1. 1n을 넣으면 n!의 끝자리 0이 몇 개인지 나옵니다. 밑을 바꾸면 다른 진법에서도 셀 수 있습니다.
  2. 2「소인수 지수」로 바꾸면 소수 p마다 몇 번 나누어떨어지는지를 항별로 볼 수 있습니다.
  3. 3자릿수 합으로 쓴 꼴 (n − s_p(n))/(p − 1)이 같은 값을 내는지 확인합니다.
  4. 4「이항계수 (쿠머)」로 바꾸고 k를 넣으면 C(n, k)의 소인수 지수를 받아올림 횟수로 셉니다.
  5. 5자리마다의 받아올림 표에서 받아올림이 없으면 나누어떨어지지 않는 것을 확인합니다.

자주 묻는 질문

n!이 소수 p로 몇 번 나누어떨어지는지를 ⌊n/p⌋ + ⌊n/p²⌋ + ⌊n/p³⌋ + …로 구하는 식입니다. 1부터 n까지 가운데 p의 배수가 ⌊n/p⌋개이고 그중 p²의 배수는 한 번 더 세야 한다는 생각 그대로이며, p^i가 n을 넘으면 항이 0이 되어 저절로 끝납니다.

24개입니다. 10진법에서 0 하나는 10 = 2×5 하나를 뜻하는데 n!에는 2가 5보다 훨씬 많으므로 5의 개수가 곧 답입니다. ⌊100/5⌋ + ⌊100/25⌋ = 20 + 4 = 24가 됩니다. 100!을 직접 만들 필요가 없습니다.

밑을 소인수분해해 p^e 꼴로 쓴 뒤 각 소수마다 ⌊v_p(n!) / e⌋를 구해 가장 작은 것을 고릅니다. 12 = 2²×3처럼 지수가 1이 아닌 소인수가 있으면 그만큼 나눠 줘야 하는데, 이 나눗셈을 빼먹는 것이 가장 흔한 실수입니다. 20!을 12진법으로 적으면 0이 8개입니다.

있습니다. v_p(n!) = (n − s_p(n)) / (p − 1)이며 s_p(n)은 n을 p진법으로 적었을 때 자릿수의 합입니다. 반복이 필요 없고, 위의 합과 언제나 같아야 하므로 좋은 검산이 됩니다. 자릿수 합이 n에 견주어 작으므로 v_p(n!)이 대략 n/(p−1)이라는 것도 이 식에서 보입니다.

C(n, k)가 소수 p로 몇 번 나누어떨어지는지는 k와 n−k를 p진법으로 더할 때 일어나는 받아올림의 횟수와 같다는 정리입니다. v_p(n!) − v_p(k!) − v_p((n−k)!)를 계산하는 것과 결과가 같지만, 받아올림을 세는 쪽이 훨씬 빠르고 뜻도 분명합니다.

뤼카는 나머지를, 쿠머는 지수를 말합니다. 뤼카 정리는 C(n, k) mod p가 얼마인지 자릿수마다의 작은 이항계수 곱으로 구하고, 쿠머 정리는 C(n, k)가 p로 몇 번 나누어떨어지는지 받아올림 횟수로 셉니다. 「받아올림이 없으면 나누어떨어지지 않는다」와 「어느 자리에서든 k의 숫자가 n보다 크면 0이 아니다」는 같은 말이라 두 정리가 맞물립니다.

m을 2진법으로 적었을 때의 1비트 개수와 같습니다. m과 m을 2진법으로 더하면 1이 있는 자리마다 정확히 한 번씩 받아올림이 일어나기 때문입니다. m = 8이면 1비트가 하나뿐이라 C(16, 8)은 2로 한 번만 나누어떨어집니다.

전송되지 않습니다. 계산은 모두 브라우저 안에서 이루어지고 넣은 값은 이 기기에만 남습니다.

알아두면 좋은 점

  • 소수만 받습니다. 합성수의 지수를 구하려면 소인수마다 따로 구해 지수로 나눈 뒤 가장 작은 것을 고르면 되며, 「끝자리 0」 모드가 그 계산을 합니다.
  • n!의 값 자체는 내지 않습니다. 값이 필요하면 팩토리얼 계산기를 쓰세요.
  • 밑은 64까지만 받습니다. 그보다 큰 밑도 원리는 같습니다.
  • p가 n보다 크면 항이 하나도 없어 지수가 0입니다.

함께 보면 좋은 도구

마지막 검증: 2026년 9월 2일 · 결과는 참고용 추정치입니다.