BCH 부호

부호 이론에서 BCH 부호(Bose–Chaudhuri–Hocquenghem Code)는 유한체 (또는 갈루아 체)에 대한 다항식을 사용하여 구성되는 순환 오류 정정 부호의 한 종류이다. BCH 부호는 1959년 프랑스 수학자 알렉시 오캥겜이 발명했으며, 1960년 라지 찬드라 보스와 D. K. 레이-초두리가 독립적으로 발명했다. Bose–Chaudhuri–Hocquenghem (및 약어 BCH)라는 이름은 발명가들의 성(姓) 첫 글자에서 유래했다 (레이-초두리의 경우 잘못된 것).

BCH 부호의 주요 특징 중 하나는 부호 설계 중에 부호로 수정 가능한 심볼 오류 수에 대해 정밀하게 제어할 수 있다는 것이다. 특히, 여러 비트 오류를 수정할 수 있는 이진 BCH 부호를 설계할 수 있다. BCH 부호의 또 다른 장점은 추상대수학적 방법인 신드롬 디코딩을 통해 쉽게 디코딩할 수 있다는 점이다. 이는 작고 저전력 전자 하드웨어를 사용하여 이러한 부호에 대한 디코더 설계를 단순화한다.

BCH 부호는 위성 통신, 콤팩트 디스크 플레이어, DVD, 디스크 드라이브, USB 플래시 드라이브, 솔리드 스테이트 드라이브, 2차원 바코드와 같은 응용 분야에 사용된다.

 정의 및 설명 

 원시 협의의 BCH 부호 
소수 와 양의 정수 , 가 주어지고 을 만족할 때, 유한체 (또는 갈루아 체) 에 대한 원시 협의의 BCH 부호는 코드 길이 와 최소 거리 를 가지며 다음 방법으로 구성된다.

를 의 원시 원소라고 하자.
모든 양의 정수 에 대해, 를 에 대한 의 계수를 갖는 최소 다항식이라고 하자.
BCH 부호의 생성 다항식은 최소 공배수 로 정의된다.
는 의 계수를 갖는 다항식이며 을 나눔을 알 수 있다.
따라서 로 정의된 다항식 부호는 순환 부호이다.

 예시 
 및 (따라서 )라고 하자. 원시 원소 를 사용하여 감소 다항식 을 기반으로 에 대한 의 다른 값을 고려할 것이다. 의 계수를 갖는 최소 다항식 는 다음을 만족하는 14개가 있다.

최소 다항식은 다음과 같다.

인 BCH 부호는 생성 다항식

를 갖는다.

최소 해밍 거리는 3 이상이며 최대 한 개의 오류를 수정한다. 생성 다항식의 차수가 4이므로 이 부호는 11개의 데이터 비트와 4개의 체크섬 비트를 갖는다. 이 부호는 (15, 11) BCH 부호로도 표기된다.

인 BCH 부호는 생성 다항식

을 갖는다.

최소 해밍 거리는 5 이상이며 최대 두 개의 오류를 수정한다. 생성 다항식의 차수가 8이므로 이 부호는 7개의 데이터 비트와 8개의 체크섬 비트를 갖는다. 이 부호는 (15, 7) BCH 부호로도 표기된다.

인 BCH 부호는 생성 다항식

을 갖는다.

최소 해밍 거리는 7 이상이며 최대 세 개의 오류를 수정한다. 생성 다항식의 차수가 10이므로 이 부호는 5개의 데이터 비트와 10개의 체크섬 비트를 갖는다. 이 부호는 (15, 5) BCH 부호로도 표기된다. (이 특정 생성 다항식은 QR 코드의 "형식 정보"에 실제 응용된다.)

 이상인 BCH 부호는 생성 다항식

을 갖는다.

이 부호는 최소 해밍 거리가 15이고 7개의 오류를 수정한다. 1개의 데이터 비트와 14개의 체크섬 비트를 갖는다. 이 부호는 (15, 1) BCH 부호로도 표기된다. 실제로 이 부호는 000000000000000과 111111111111111 (자명한 반복 부호) 두 개의 코드워드만 갖는다.

 일반 BCH 부호 
일반 BCH 부호는 원시 협의의 BCH 부호와 두 가지 면에서 다르다.

첫째, 가 의 원시 원소여야 한다는 요구사항은 완화될 수 있다. 이 요구사항을 완화하면 코드 길이는 에서 원소 의 차수 로 변경된다.

둘째, 생성 다항식의 연속적인 근은 대신 일 수 있다.

정의. 소수 거듭제곱인 유한체 를 고정하자. 그리고 이 을 법으로 하는 의 곱셈 위수인 양의 정수 를 선택하자.

이전과 같이, 를 에서 원시 제곱근이라고 하고, 모든 에 대해 를 에 대한 의 최소 다항식이라고 하자.
BCH 부호의 생성 다항식은 최소 공배수 로 정의된다.

참고: 간략화된 정의에서처럼 이면 는 1이고, 을 법으로 하는 의 차수는 이다.
따라서 간략화된 정의는 실제로 일반 정의의 특별한 경우이다.

 특수 경우 
 인 BCH 부호는 협의의 BCH 부호라고 불린다.
 인 BCH 부호는 원시라고 불린다.

BCH 부호의 생성 다항식 는 의 계수를 갖는다.
일반적으로 를 생성 다항식으로 하는 에 대한 순환 부호는 에 대한 BCH 부호라고 불린다.
에 대한 BCH 부호와 의 연속적인 거듭제곱을 근으로 하는 생성 다항식 는 디코더(신드롬) 알파벳이 채널(데이터 및 생성 다항식) 알파벳과 동일한 리드 솔로몬 부호의 한 유형이다. 이는 의 모든 원소이다. 다른 유형의 리드 솔로몬 부호는 BCH 부호가 아닌 원래 관점 리드 솔로몬 부호이다.

 속성 
BCH 부호의 생성 다항식은 차수가 최대 이다. 또한 이고 이면 생성 다항식의 차수는 최대 이다.

각 최소 다항식 의 차수는 최대 이다. 따라서 개의 최소 공배수의 차수는 최대 이다. 또한, 이면 모든 에 대해 이다. 따라서 는 홀수 인덱스 에 대한 최대 개의 최소 다항식 의 최소 공배수이며, 각 다항식의 차수는 최대 이다.

BCH 부호는 최소 해밍 거리가 최소 이다.

개 미만의 비영항을 가진 코드워드 가 있다고 가정하자. 그러면

 

가 의 근이므로 의 근임을 기억하자. 이는 이 에 대해 다음 방정식을 만족함을 의미한다.

 

행렬 형태로 표현하면 다음과 같다.
 

이 행렬의 행렬식은 다음과 같다.

행렬 는 방데르몽드 행렬이며, 그 행렬식은

는 0이 아니다. 따라서 이고 이다.

BCH 부호는 순환 부호이다.

길이 의 다항식 부호가 순환 부호인 것은 그 생성 다항식이 을 나눌 때뿐이다. 가 근 를 갖는 최소 다항식이므로, 각각이 의 근인지 확인하는 것으로 충분하다. 이는 가 정의에 따라 제곱근이라는 사실에서 즉시 도출된다.

 인코딩 
생성 다항식의 배수인 모든 다항식은 유효한 BCH 코드워드이므로, BCH 인코딩은 단순히 생성 다항식을 인수로 갖는 다항식을 찾는 과정이다.

BCH 부호 자체는 다항식 계수의 의미에 대해 규정하지 않는다. 개념적으로 BCH 디코딩 알고리즘의 유일한 관심사는 수신된 코드워드에 대한 최소 해밍 거리를 가진 유효한 코드워드를 찾는 것이다. 따라서 BCH 부호는 구현자가 메시지를 인코딩된 다항식에 어떻게 포함하느냐에 따라 체계적인 부호로 구현되거나 그렇지 않을 수 있다.

 비체계적 인코딩: 메시지를 인수로 
생성 다항식의 배수인 다항식을 찾는 가장 간단한 방법은 임의의 다항식과 생성 다항식의 곱을 계산하는 것이다. 이 경우, 임의의 다항식은 메시지의 심볼을 계수로 사용하여 선택할 수 있다.

예를 들어, POCSAG 등에서 사용되는 (31, 21) 이진 BCH 부호에 사용하도록 선택된 생성 다항식 을 고려해 보자. 21비트 메시지 {101101110111101111101}을 인코딩하기 위해 먼저 에 대한 다항식으로 나타낸다.

그런 다음 (또한 에 대해) 계산한다.

따라서 전송된 코드워드는 {1100111010010111101011101110101}이다.

수신기는 이 비트를 의 계수로 사용하고, 오류 정정을 통해 유효한 코드워드를 확인한 후, 를 다시 계산할 수 있다.

 체계적 인코딩: 메시지를 접두사로 
체계적 부호는 메시지가 코드워드 내 어딘가에 그대로 나타나는 부호이다. 따라서 체계적 BCH 인코딩은 먼저 메시지 다항식을 코드워드 다항식 내에 삽입한 다음, 나머지 (메시지가 아닌) 항의 계수를 조정하여 가 로 나누어떨어지도록 한다.

이 인코딩 방법은 피제수에서 나머지를 빼면 제수의 배수가 된다는 사실을 활용한다. 따라서 이전과 같이 메시지 다항식 를 로 곱하여 (메시지를 나머지에서 "이동"시키기 위해), 다항식의 나눗셈 정리를 사용하여 다음을 얻을 수 있다.

여기서 는 유효한 코드워드임을 알 수 있다. 는 항상 (의 차수)보다 작은 차수를 가지므로, 메시지 계수를 변경하지 않고 에서 안전하게 뺄 수 있으므로, 는 다음과 같다.

 (즉, 이진 BCH 부호)에 대해, 이 과정은 순환 중복 검사를 추가하는 것과 구별할 수 없으며, 체계적 이진 BCH 부호가 오류 감지 목적으로만 사용되는 경우, BCH 부호는 순환 중복 검사의 일반화임을 알 수 있다.

체계적 코딩의 장점은 수신기가 오류 정정을 수행한 후 처음 개 계수 이후의 모든 것을 버림으로써 원본 메시지를 복구할 수 있다는 것이다.

 디코딩 
BCH 부호를 디코딩하는 데는 여러 알고리즘이 있다. 가장 일반적인 알고리즘은 다음 일반적인 개요를 따른다.
 수신된 벡터에 대한 신드롬 sj를 계산한다. 
 신드롬으로부터 오류 수 t와 오류 위치 다항식 Λ(x)를 결정한다. 
 오류 위치 다항식의 근을 계산하여 오류 위치 Xi를 찾는다.
 해당 오류 위치에서 오류 값 Yi를 계산한다. 
 오류를 정정한다.

이러한 단계 중 일부에서 디코딩 알고리즘은 수신된 벡터에 너무 많은 오류가 있어 수정할 수 없다고 판단할 수 있다. 예를 들어, 적절한 t 값이 발견되지 않으면 정정이 실패한다. 잘린(원시가 아닌) 코드에서는 오류 위치가 범위를 벗어날 수 있다. 수신된 벡터에 코드가 수정할 수 있는 것보다 더 많은 오류가 있는 경우, 디코더는 알 수 없는 사이에 전송된 메시지가 아닌 겉보기에 유효한 메시지를 생성할 수 있다.

 신드롬 계산 
수신된 벡터 은 올바른 코드워드 와 알 수 없는 오류 벡터 의 합이다. 신드롬 값은 을 다항식으로 간주하고 에서 평가하여 형성된다. 따라서 신드롬은

부터 까지.

는 의 영점이며, 는 그 배수이므로, 이다. 따라서 신드롬 값을 조사하면 오류 벡터가 분리되어 이를 해결하기 시작할 수 있다.

오류가 없으면 모든 에 대해 이다. 모든 신드롬이 0이면 디코딩이 완료된다.

 오류 위치 다항식 계산 
비영 신드롬이 있으면 오류가 있는 것이다. 디코더는 오류가 몇 개인지, 그리고 그 오류의 위치를 파악해야 한다.

단일 오류가 있는 경우, 이를 로 작성하며, 여기서 는 오류의 위치이고 는 그 크기이다. 그러면 처음 두 신드롬은 다음과 같다.

따라서 이들을 함께 사용하면 를 계산하고 에 대한 일부 정보를 제공한다 (리드 솔로몬 부호의 경우 완전히 결정).

두 개 이상의 오류가 있는 경우,

결과 신드롬을 미지수 와 에 대해 어떻게 풀기 시작할지는 즉시 명확하지 않다.

첫 번째 단계는 계산된 신드롬과 가능한 최소 에 호환되는 위치 다항식을 찾는 것이다.

이 작업을 위한 세 가지 인기 있는 알고리즘은 다음과 같다.
 피터슨–고렌스타인–지얼러 알고리즘
 벌러캠프-매시 알고리즘
 스기야마 유클리드 알고리즘

 피터슨-고렌스타인-지얼러 알고리즘 

피터슨의 알고리즘은 일반화된 BCH 디코딩 절차의 2단계이다. 피터슨의 알고리즘은 다항식의 오류 위치 다항식 계수 를 계산하는 데 사용된다.

 

이제 피터슨–고렌스타인–지얼러 알고리즘의 절차를 설명한다. 최소 2t개의 신드롬 sc, …, sc+2t−1이 있다고 가정하자. v = t로 설정한다.

 오류 위치 다항식 인수분해 
이제 다항식을 얻었으므로, 예를 들어 치앙 검색 알고리즘을 사용하여 무차별 대입 방식으로 형식으로 그 근을 찾을 수 있다.
원시 원소 의 지수 거듭제곱은 수신된 단어에서 오류가 발생하는 위치를 나타낸다. 따라서 '오류 위치' 다항식이라고 불린다.

Λ(x)의 영점은 α−i1, …, α−iv이다.

 오류 값 계산 
오류 위치가 알려지면 다음 단계는 해당 위치의 오류 값을 결정하는 것이다. 오류 값은 해당 위치에서 수신된 값을 수정하여 원래 코드워드를 복구하는 데 사용된다.

이진 BCH의 경우 (모든 문자가 읽을 수 있는 경우) 이것은 사소하다. 해당 위치에서 수신된 단어의 비트를 뒤집으면 수정된 코드워드를 얻을 수 있다. 더 일반적인 경우, 오류 가중치 는 선형 시스템을 풀어 결정할 수 있다.
 

 포니 알고리즘 
그러나 포니 알고리즘으로 알려진 더 효율적인 방법이 있다.

다음을 가정하자.

그리고 오류 평가 다항식

마지막으로:

여기서

신드롬이 위치 에서만 0이 아닐 수 있는 오류 단어로 설명될 수 있다면, 오류 값은 다음과 같다.

협의의 BCH 부호의 경우, c = 1이므로 표현식은 다음과 같이 단순화된다.

 포니 알고리즘 계산 설명 
이것은 라그랑주 보간법과 생성 함수의 기술을 기반으로 한다.

를 고려하고, 간단히 하기 위해 인 경우 이고 인 경우 이라고 가정하자. 그러면

우리는 미지수 를 계산하려고 하며, 항을 제거하여 맥락을 단순화할 수 있다. 이는 오류 평가 다항식으로 이어진다.

 덕분에 우리는 다음을 얻는다.

 (라그랑주 보간 트릭) 덕분에 에 대한 합은 하나의 합항으로 퇴화된다.

를 얻으려면 곱을 제거해야 한다. 이미 계산된 의 근 에서 곱을 직접 계산할 수도 있지만, 더 간단한 형태를 사용할 수도 있다.

형식 미분으로

우리는 다시 하나의 합항만 얻는다.

그래서 마지막으로

이 공식은 형태의 형식 미분을 계산할 때 유리하다.

다음 결과를 산출한다.

여기서

 확장 유클리드 알고리즘 기반 디코딩 
다항식 Λ과 오류 위치 다항식을 찾는 다른 과정은 야스오 스기야마(Yasuo Sugiyama)의 확장 유클리드 알고리즘 변형을 기반으로 한다. 읽을 수 없는 문자 보정은 알고리즘에 쉽게 통합될 수 있다.

를 읽을 수 없는 문자의 위치라고 하자. 이 위치를 국소화하는 다항식 을 생성한다.
읽을 수 없는 위치의 값을 0으로 설정하고 신드롬을 계산한다.

포니 공식에서 이미 정의했듯이 라고 하자.

다항식 와 의 최소 공약수를 찾기 위해 확장 유클리드 알고리즘을 실행해 보자.
목표는 최소 공약수를 찾는 것이 아니라, 차수가 최대 인 다항식 와 을 만족하는 다항식 를 찾는 것이다.
의 낮은 차수는 가 에 대한 확장된( 에 의해) 정의 조건을 만족할 것을 보장한다.

를 정의하고 포니 공식에서 대신 를 사용하면 오류 값을 얻을 수 있다.

이 알고리즘의 주요 장점은 포니 공식에서 필요한 를 동시에 계산한다는 것이다.

 디코딩 과정 설명 
목표는 수신된 단어와 읽을 수 있는 위치에서 가능한 최소한의 차이가 있는 코드워드를 찾는 것이다. 수신된 단어를 가장 가까운 코드워드와 오류 단어의 합으로 표현할 때, 우리는 읽을 수 있는 위치에서 0이 아닌 수가 최소인 오류 단어를 찾으려고 노력한다. 신드롬 는 다음 조건에 의해 오류 단어를 제한한다.

이러한 조건을 따로 작성할 수도 있고, 다항식을 생성할 수도 있다.

그리고 거듭제곱 에서 까지의 계수를 비교한다.

 위치에 읽을 수 없는 문자가 있다고 가정하자. 신드롬 집합 를 방정식 로 정의된 신드롬 집합 으로 대체할 수 있다. 오류 단어에 대해 원래 신드롬 집합 의 모든 제한이 유효하다고 가정하자.
그러면

새로운 신드롬 집합은 오류 벡터를 제한한다.

원래 신드롬 집합이 오류 벡터 를 제한한 것과 같은 방식으로. 좌표 을 제외하고, 여기서 이며, 이면 는 0이다. 오류 위치를 찾는 목적으로 모든 읽을 수 없는 문자를 반영하기 위해 신드롬 집합을 유사한 방식으로 변경할 수 있다. 이는 신드롬 집합을 만큼 단축시킨다.

다항식 공식에서 신드롬 집합 를 신드롬 집합 으로 대체하면

따라서,

를 로 대체한 후, 거듭제곱 근처의 계수에 대한 방정식이 필요하다.

주어진 위치의 영향을 제거하면 모두 0으로 구성된 신드롬 집합을 얻게 되는 개 위치를 찾을 수 있다면, 이 좌표에만 오류가 있는 오류 벡터가 존재할 수 있다.
가 이러한 좌표의 영향을 제거하는 다항식을 나타낸다면, 우리는 다음을 얻는다.

유클리드 알고리즘에서 우리는 최대 개의 오류를 수정하려고 한다 (읽을 수 있는 위치에서). 왜냐하면 더 큰 오류 수에서는 수신된 단어로부터 같은 거리에 있는 코드워드가 더 많을 수 있기 때문이다. 따라서 우리가 찾는 에 대해, 방정식은 다음으로부터 시작하는 거듭제곱 근처의 계수에 대해 유효해야 한다.

포니 공식에서 는 스칼라로 곱해져도 같은 결과를 준다.

유클리드 알고리즘이 보다 높은 차수를 가진 를 찾았고, 그 차수와 동일한 수의 서로 다른 근을 가질 수 있지만, 포니 공식은 그 모든 근의 오류를 수정할 수 있다. 어쨌든 그렇게 많은 오류를 수정하는 것은 위험할 수 있다 (수신된 단어에 대한 다른 제한이 없는 경우 특히). 일반적으로 더 높은 차수의 를 얻은 후에는 오류를 수정하지 않기로 결정한다. 가 높은 중복도를 가진 근을 가지거나 근의 수가 그 차수보다 작은 경우 수정이 실패할 수 있다. 실패는 포니 공식이 전송된 알파벳 외부의 오류를 반환함으로써 감지될 수도 있다.

 오류 정정 
오류 값과 오류 위치를 사용하여 오류를 정정하고 오류 위치에서 오류 값을 빼서 정정된 코드 벡터를 형성한다.

 디코딩 예시 

 읽을 수 없는 문자가 없는 이진 부호 디코딩 
이고 인 GF(24)의 BCH 부호를 고려해 보자. (이것은 QR 코드에서 사용된다.) 전송될 메시지가 [1 1 0 1 1] 또는 다항식 표기법으로 이라고 하자.
"체크섬" 심볼은 를 로 나누고 나머지를 취하여 계산되며, 결과는 또는 [ 1 0 0 0 0 1 0 1 0 0 ]이다. 이것들은 메시지에 추가되므로 전송된 코드워드는 [ 1 1 0 1 1 1 0 0 0 0 1 0 1 0 0 ]이다.

이제 전송에 두 개의 비트 오류가 발생하여 수신된 코드워드가 [ 1 0 1 1 1 0 0 0 1 0 1 0 0 ]이라고 상상해 보자. 다항식 표기법:

오류를 수정하기 위해 먼저 신드롬을 계산한다. 을 취하면 , , , , , 을 얻는다.
다음으로, 다음 첨가 행렬을 행렬-축소하여 피터슨 절차를 적용한다.

영행 때문에 은 특이 행렬인데, 이는 코드워드에 두 개의 오류만 도입되었으므로 놀라운 일이 아니다.
그러나 행렬의 왼쪽 위 모서리는 과 동일하며, 이는 해 , 을 제공한다.
결과 오류 위치 다항식은 이며, 이는 및 에서 영점을 갖는다.
의 지수는 오류 위치에 해당한다.
이 예에서는 오류 값을 계산할 필요가 없는데, 유일하게 가능한 값이 1이기 때문이다.

 읽을 수 없는 문자가 있는 디코딩 
동일한 시나리오를 가정하되, 수신된 단어에 읽을 수 없는 문자가 두 개 있다고 가정하자 [ 1 0 ? 1 1 ? 0 0 1 0 1 0 0 ]. 읽을 수 없는 문자를 0으로 바꾸고 그 위치를 반영하는 다항식 을 생성한다. 신드롬 및 을 계산한다. (GF(24) 동형사상에 독립적인 로그 표기법을 사용한다. 계산 확인을 위해 이전 예에서 사용된 것과 동일한 표현 방식을 덧셈에 사용할 수 있다. 의 거듭제곱에 대한 십육진법 설명은 비트별 XOR을 기반으로 하는 덧셈과 함께 순서대로 1,2,4,8,3,6,C,B,5,A,7,E,F,D,9이다.)

신드롬 다항식을 만들어 보자.

계산한다.

확장 유클리드 알고리즘을 실행한다.

차수가 3 이하인 다항식에 도달했으며,

다음이 된다.

따라서,

라고 하자. 이라는 점은 신경 쓰지 마라. 무차별 대입 방식으로 의 근을 찾는다. 근은 과 이다 (예를 들어 를 찾은 후 해당 단항식 으로 를 나눌 수 있으며, 결과 단항식의 근은 쉽게 찾을 수 있다).

다음을 가정하자.

오류 값 공식을 사용하여 오류 값을 찾아보자.

여기서 는 다항식 의 근이다. 우리는 다음을 얻는다.

이라는 사실은 놀라운 일이 아니다.

따라서 정정된 코드는 [ 1 0 1 1 0 0 1 0 1 0 0]이다.

 적은 수의 오류가 있는 읽을 수 없는 문자 디코딩 
오류 수가 적은 경우 알고리즘 동작을 살펴보자. 수신된 단어가 [ 1 0 ? 1 1 ? 0 0 0 1 0 1 0 0 ]이라고 하자.

다시, 읽을 수 없는 문자를 0으로 바꾸고 그 위치를 반영하는 다항식 을 생성한다.
신드롬 및 를 계산한다.
신드롬 다항식을 생성한다.

확장 유클리드 알고리즘을 실행해 보자.

차수가 3 이하인 다항식에 도달했으며,
 
다음이 된다.
 

따라서,
 

라고 하자. 이라는 점은 신경 쓰지 마라. 의 근은 이다.

다음을 가정하자.

오류 값 공식 를 사용하여 오류 값을 찾아보자. 여기서 는 다항식 의 근이다.
 

우리는 다음을 얻는다.

이라는 사실은 놀라운 일이 아니다.

따라서 정정된 코드는 [ 1 0 1 1 0 0 0 1 0 1 0 0]이다.

 인용 

 참고 문헌 

 1차 자료 
 
 

 2차 자료 
 Course notes are apparently being redone for 2012: http://www.stanford.edu/class/ee387/ 
 
 
 

 추가 자료 
 
 
 
 
 

분류:오류 검출 정정
분류:부호 이론
분류:유한체