도구스개발

골롬-라이스 부호 계산기

값과 매개변수 m을 넣으면 몫은 단항, 나머지는 이진으로 적는 골롬-라이스 부호를 만들고 길이를 냅니다. m을 바꿔 가며 비트 수가 어떻게 갈리는지 보이고, 값의 평균에서 최적 m을 구해 줍니다.

0 이상의 정수를 쉼표나 공백으로 나눠 적습니다. 64개까지, 100,000까지.

2의 거듭제곱이라 라이스 부호입니다. 나머지가 늘 1비트입니다.

전체 비트 수

37비트

값 16개를 m=2으로 부호화하면 값당 평균 2.31비트입니다. 고정 길이로 적으면 값당 3비트씩 48비트가 듭니다.

전체 비트37비트
값당 평균2.31비트
고정 길이라면48비트 (값당 3비트)
값의 평균1
이 평균에 맞는 최적 m1
되돌리기 검산원래 값과 같습니다

값마다의 부호

나머지부호비트
000002
101012
000002
2101003
000002
101012
3111013
000002
101012
000002
000002
2101003
101012
000002
42011004
101012

파란 부분이 몫을 단항으로 적은 것(1을 몫만큼 늘어놓고 0으로 끝냄)이고, 회색이 나머지를 이진으로 적은 것입니다. 어느 부호도 다른 부호의 앞부분이 아니라서, 이어 붙여도 구분자 없이 하나씩 떼어 낼 수 있습니다.

이어 붙인 비트열

0001001000001101000100001000100110001

이 비트열을 되돌리면 원래 값이 그대로 나옵니다: 0, 1, 0, 2, 0, 1, 3, 0, 1, 0, 0, 2, 1, 0, 4, 1

m을 바꿔 가며

m전체 비트값당
1 (라이스)32비트2
2 (라이스)37비트2.31
4 (라이스)49비트3.06
8 (라이스)64비트4
16 (라이스)80비트5
32 (라이스)96비트6

라이스가 되는 m(2의 거듭제곱)과 지금 고른 m, 그리고 이 자료에서 가장 짧은 m만 골라 보였습니다. m이 너무 작으면 단항 부분이 길어지고, 너무 크면 나머지 비트가 낭비됩니다. 그 사이에 골짜기가 하나 있고, 값의 분포가 기하분포에 가까울수록 그 골짜기가 아래 공식의 값과 잘 맞습니다.

최적 m 구하기

m = ⌈ −log(1+θ) / log θ ⌉, θ = 1 − p

값의 평균 μ1
p = 1/(μ+1)0.5
정확한 최적 m1
흔히 인용되는 근사식1 (같음)
그때의 기대 길이2비트

값이 기하분포를 따른다고 보고 평균에서 p를 되돌린 뒤 최적 m을 구합니다. 흔히 인용되는 m ≈ −1/log₂(1−p)는 이 식의 근사인데, 대부분 같은 값을 주지만 p=0.4처럼 갈리는 자리가 있습니다. 그런 곳에서는 근사식이 고른 m이 실제로는 최적이 아닙니다.

골롬-라이스의 값어치는 부호표가 필요 없다는 데 있습니다. 매개변수 m 하나만 주고받으면 되므로, 허프만 부호처럼 표를 통째로 실어 보낼 필요가 없습니다. 대신 값이 기하분포에 가깝다는 가정이 필요하고, 그 가정이 어긋나면 손해를 봅니다. FLAC 같은 무손실 오디오와 이미지 예측 잔차가 그 가정에 잘 맞는 대표적인 자료입니다.
음수는 다루지 않습니다. 실제 코덱은 음수를 지그재그로 옮겨(0, −1, 1, −2, 2 … → 0, 1, 2, 3, 4 …) 0 이상으로 바꾼 뒤 이 부호에 넣습니다. 예측 잔차는 부호가 반씩 섞이므로 이 단계가 반드시 앞에 붙습니다.

사용 방법

  1. 1부호화할 값을 쉼표나 공백으로 나눠 적습니다. 0 이상의 정수만 됩니다.
  2. 2매개변수 m을 정합니다. 2의 거듭제곱이면 라이스 부호가 됩니다.
  3. 3값마다의 부호에서 파란 부분(단항 몫)과 회색 부분(이진 나머지)을 봅니다.
  4. 4「m을 바꿔 가며」 표에서 비트 수의 골짜기를 찾습니다.
  5. 5맨 아래에서 값의 평균으로 구한 최적 m과 견줍니다.

자주 묻는 질문

값 n을 매개변수 m으로 나눠 몫은 단항으로, 나머지는 이진으로 적습니다. 몫이 q라면 1을 q개 늘어놓고 0으로 끊은 뒤, 나머지를 이진으로 붙입니다. 예를 들어 m=4일 때 9는 몫 2, 나머지 1이므로 「110」 + 「01」이 됩니다.

라이스 부호는 m이 2의 거듭제곱인 골롬 부호입니다. 그때 나머지가 언제나 k = log₂m 비트라 나눗셈이 시프트로 끝나서, 하드웨어와 코덱이 이 경우만 쓰는 일이 많습니다. m이 2의 거듭제곱이 아니면 나머지를 절단 이진 부호로 적어 앞쪽 몇 개를 한 비트 짧게 씁니다.

값이 기하분포를 따를 때 θ = 1−p라 하면 m = ⌈−log(1+θ)/log θ⌉가 정확한 답입니다(갤러거–반부리스, 1975). 값의 평균 μ만 알고 있다면 p = 1/(μ+1)로 바꿔 넣으면 됩니다. 흔히 인용되는 m ≈ −1/log₂(1−p)는 이것의 근사인데, 대부분 같은 값을 주지만 p=0.4처럼 갈리는 자리가 있고 그때는 근사식 쪽이 최적이 아닙니다.

크게 손해입니다. m이 너무 작으면 몫이 커져 단항 부분이 길어지고, 너무 크면 나머지 비트가 낭비됩니다. 평균이 20쯤인 값에 m=1을 쓰면 값당 20비트를 넘고, m=512를 쓰면 나머지에만 9비트를 쓰게 됩니다. 최적 m 근처에 골짜기가 하나 있고, 이 계산기의 「m을 바꿔 가며」 표에서 그 모양을 볼 수 있습니다.

허프만은 어떤 분포에도 최적이지만 부호표가 필요하고, 골롬-라이스는 분포를 하나 가정하는 대신 표가 없습니다. 매개변수 m 하나만 주고받으면 되므로 값이 기하분포에 가까운 자료에서는 표를 실어 보내는 비용까지 따지면 골롬-라이스가 이깁니다. FLAC 같은 무손실 오디오와 이미지 예측 잔차가 그런 자료입니다.

그대로는 안 됩니다. 이 부호는 0 이상의 정수를 위한 것입니다. 실제 코덱은 음수를 지그재그로 옮겨(0, −1, 1, −2, 2 …를 0, 1, 2, 3, 4 …로) 0 이상으로 바꾼 뒤 넣습니다. 예측 잔차는 부호가 반씩 섞이므로 이 단계가 반드시 앞에 붙습니다.

전송되지 않습니다. 모든 계산은 브라우저 안에서 이뤄지고, 입력값은 이 기기에만 남습니다.

알아두면 좋은 점

  • 검증은 m = 1부터 40까지, 값 0부터 200까지의 모든 조합을 부호화한 뒤 되돌려 원래 값이 나오는지 대조해 했습니다. 여러 값을 이어 붙여 구분자 없이 갈라지는지도 확인했습니다.
  • 어느 부호도 다른 부호의 앞부분이 아닌지(접두부호), 크라프트 부등식 Σ2^(−길이) ≤ 1을 지키는지도 테스트로 고정해 두었습니다. 골롬 부호는 낭비가 없어 이 합이 1에 아주 가깝습니다.
  • 최적 m 공식은 갤러거–반부리스(1975)의 정확한 결과 m = ⌈−log(1+θ)/log θ⌉를 씁니다. m을 1부터 200까지 훑어 기대 길이가 실제로 최소인지 여러 p에서 확인했습니다.
  • 흔히 인용되는 근사식 m ≈ −1/log₂(1−p)는 대부분 같은 값을 주지만 p=0.4에서 갈립니다 — 정확한 답은 1인데 근사식은 2를 주고, 기대 길이가 3.64 대 3.69비트로 근사식 쪽이 손해입니다. 이 계산기는 두 값을 나란히 보이되 정확한 쪽을 최적으로 씁니다.
  • 음수는 다루지 않습니다. 실제 코덱은 지그재그 사상으로 0 이상으로 옮긴 뒤 이 부호를 씁니다.
  • 값은 64개까지, 값의 크기는 100,000까지, m은 4,096까지 다룹니다.

함께 보면 좋은 도구

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