Chien search

In , the Chien search, named after , is a fast algorithm for determining of defined over a . Chien search is commonly used to find the roots of error-locator polynomials encountered in decoding and BCH codes.

Algorithm

The problem is to find the roots of the polynomial (over the finite field ):

 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 , so the polynomial can be evaluated for each element . If the polynomial evaluates to zero, then that element is a root.

For the trivial case , only the coefficient need be tested for zero. Below, the only concern will be for non-zero .

A straightforward evaluation of the polynomial involves general multiplications and additions. A more efficient scheme would use for general multiplications and additions. Both of these approaches may evaluate the elements of the finite field 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 . Consequently, Chien search needs only multiplications by constants and additions. The multiplications by constants are less complex than general multiplications.

The Chien search is based on two observations:

  • Each non-zero beta may be expressed as alpha^{i_beta} for some i_beta, where alpha is a of mathrm{GF}(q), i_beta is the power number of primitive element alpha. Thus the powers alpha^i for 0 leq i < (q-1) cover the entire field (excluding the zero element).
  • The following relationship exists:
 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} | 0leq 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.

Source

http://wikipedia.org/

See Also on BitcoinWiki