Chien search

In abstract algebra, the Chien search, named after Robert T. Chien, is a fast algorithm for determining roots of polynomials defined over a finite field. The most typical use of the Chien search is in finding the roots of error-locator polynomials encountered in decoding Reed-Solomon codes and BCH codes.

Algorithm

The problem is to find the roots of the polynomial Λ(x) (over the finite field GF(q)):

\ \Lambda(x) = \lambda_0 + \lambda_1 x + \lambda_2 x^2 + \cdots + \lambda_t x^t

The roots may be found using brute force: there are a finite number of x, so the polynomial can be evaluated for each element xi. If the polynomial evaluates to zero, then that element is a root.

For the trivial case x = 0, only the coefficient λ0 need be tested for zero. Below, the only concern will be for non-zero xi.

A straightforward evaluation of the polynomial involves O(t2) general multiplications and O(t) additions. A more efficient scheme would use Horner's method for O(t) general multiplications and O(t) additions. Both of these approaches may evaluate the elements in any order.

Chien search improves upon the above by selecting a specific order for the non-zero elements. In particular, the finite field has a (constant) generator element α. Chien tests the elements in the generator's order α1, α2, α3, ..... Consequently, Chien search needs only O(t) multiplications by constants and O(t) additions. The multiplications by constants are less complex than general multiplications.

The Chien search is based on two observations:


\begin{array}{lllllllllll}
 \Lambda(\alpha^i) &=& \lambda_0 &+& \lambda_1 (\alpha^i) &+& \lambda_2 (\alpha^i)^2 &+& \cdots &+& \lambda_t (\alpha^i)^t  \\
                   &\triangleq& \gamma_{0,i} &+& \gamma_{1,i} &+& \gamma_{2,i} &+& \cdots &+& \gamma_{t,i} \\
 \Lambda(\alpha^{i+1}) &=& \lambda_0 &+& \lambda_1 (\alpha^{i+1}) &+& \lambda_2 (\alpha^{i+1})^2 &+& \cdots &+& \lambda_t (\alpha^{i+1})^t  \\
                       &=& \lambda_0 &+& \lambda_1 (\alpha^i)\,\alpha &+& \lambda_2 (\alpha^i)^2\,\alpha^2 &+& \cdots &+& \lambda_t (\alpha^i)^t\,\alpha^t  \\
                       &=& \gamma_{0,i} &+& \gamma_{1,i}\,\alpha &+& \gamma_{2,i}\,\alpha^2 &+& \cdots &+& \gamma_{t,i}\,\alpha^t \\
                   &\triangleq& \gamma_{0,i+1} &+& \gamma_{1,i+1} &+& \gamma_{2,i+1} &+& \cdots &+& \gamma_{t,i+1}
\end{array}

In other words, we may define each \Lambda(\alpha^i) as the sum of a set of terms \{\gamma_{j,i} | 0\leq j \leq t\}, from which the next set of coefficients may be derived thus:

\ \gamma_{j,i+1} = \gamma_{j,i}\,\alpha^j

In this way, we may start at i = 0 with \gamma_{j,0} = \lambda_j, and iterate through each value of i up to (q-1). If at any stage the resultant summation is zero, i.e.

\ \sum_{j=0}^t \gamma_{j,i} = 0,

then \Lambda(\alpha^i) = 0 also, so \alpha_i is a root. In this way, we check every element in the field.

When implemented in hardware, this approach significantly reduces the complexity, as all multiplications consist of one variable and one constant, rather than two variables as in the brute-force approach.

References

This article is issued from Wikipedia - version of the Monday, April 04, 2016. The text is available under the Creative Commons Attribution/Share Alike but additional terms may apply for the media files.