コード例 #1
0
        public String toString()
        {
            StringBuilder result = new StringBuilder(8 * getDegree());

            for (int degree = getDegree(); degree >= 0; degree--)
            {
                int coefficient = getCoefficient(degree);
                if (coefficient != 0)
                {
                    if (coefficient < 0)
                    {
                        result.Append(" - ");
                        coefficient = -coefficient;
                    }
                    else
                    {
                        if (result.Length > 0)
                        {
                            result.Append(" + ");
                        }
                    }
                    if (degree == 0 || coefficient != 1)
                    {
                        int alphaPower = field.log(coefficient);
                        if (alphaPower == 0)
                        {
                            result.Append('1');
                        }
                        else if (alphaPower == 1)
                        {
                            result.Append('a');
                        }
                        else
                        {
                            result.Append("a^");
                            result.Append(alphaPower);
                        }
                    }
                    if (degree != 0)
                    {
                        if (degree == 1)
                        {
                            result.Append('x');
                        }
                        else
                        {
                            result.Append("x^");
                            result.Append(degree);
                        }
                    }
                }
            }
            return(result.ToString());
        }
コード例 #2
0
 /**
  * <p>Decodes given set of received codewords, which include both data and error-correction
  * codewords. Really, this means it uses Reed-Solomon to detect and correct errors, in-place,
  * in the input.</p>
  *
  * @param received data and error-correction codewords
  * @param twoS number of error-correction codewords available
  * @throws ReedSolomonException if decoding fails for any reason
  */
 public void decode(int[] received, int twoS)
 {
     try{
         GF256Poly poly = new GF256Poly(field, received);
         int[]     syndromeCoefficients = new int[twoS];
         bool      dataMatrix           = field.Equals(GF256.DATA_MATRIX_FIELD);
         bool      noError = true;
         for (int i = 0; i < twoS; i++)
         {
             // Thanks to sanfordsquires for this fix:
             int eval = poly.evaluateAt(field.exp(dataMatrix ? i + 1 : i));
             syndromeCoefficients[syndromeCoefficients.Length - 1 - i] = eval;
             if (eval != 0)
             {
                 noError = false;
             }
         }
         if (noError)
         {
             return;
         }
         GF256Poly   syndrome   = new GF256Poly(field, syndromeCoefficients);
         GF256Poly[] sigmaOmega =
             runEuclideanAlgorithm(field.buildMonomial(twoS, 1), syndrome, twoS);
         GF256Poly sigma           = sigmaOmega[0];
         GF256Poly omega           = sigmaOmega[1];
         int[]     errorLocations  = findErrorLocations(sigma);
         int[]     errorMagnitudes = findErrorMagnitudes(omega, errorLocations, dataMatrix);
         for (int i = 0; i < errorLocations.Length; i++)
         {
             int position = received.Length - 1 - field.log(errorLocations[i]);
             if (position < 0)
             {
                 throw new ReedSolomonException("Bad error location");
             }
             received[position] = GF256.addOrSubtract(received[position], errorMagnitudes[i]);
         }
     }catch (ReedSolomonException e) {
         throw new ReedSolomonException(e.Message);
     }
 }