void evaluate_error(unsigned int *error_magnitudes, unsigned int *error_locator_poly_derivative, unsigned int *error_evaluator_poly, unsigned int *locators, int length_of_locators){ int i = 0, j = 0, k = 0; unsigned int poly_evaluation = 0; unsigned int power = 1; unsigned int inverse_locator = 0 ; int temp = 0;// temp is the power of locator[i], also the error location, //ranges from 1 to N for(i = 0; i < length_of_locators; i++){ inverse_locator = galois_inverse(locators[i], w); //nominator computing poly_evaluation = 0; for(j = N - 1; j >= K - 1; j--){//? power = 1; for(k = 0; k < N - 1 - j; k++) power = galois_single_multiply(power, inverse_locator, w); poly_evaluation ^= galois_single_multiply(power, error_evaluator_poly[j], w); // printf("test %d \n", poly_evaluation); } error_magnitudes[i] = galois_single_multiply(poly_evaluation, locators[i], w); //denominator computing poly_evaluation = 0; for(j = (N - K)/2; j >= 0; j--){ power = 1; for(k = 0; k < (N - K)/2 - j; k++) power = galois_single_multiply(power, inverse_locator, w); poly_evaluation ^= galois_single_multiply(power, error_locator_poly_derivative[j], w); } // error magnitudes computing error_magnitudes[i] = galois_single_divide(error_magnitudes[i], poly_evaluation, w); //if decode GRS, then we will have to divide error_magnitudes by parity //check matrix's corresponding column multipliers, otherwise we have to //comment this function or set multipliers vector to all ones. temp = galois_log(locators[i], w); error_magnitudes[i] = galois_single_divide(error_magnitudes[i], multiplier[temp], w); } printf("The error magnitudes are:\n"); for(i = 0; i < length_of_locators; i ++){ printf("%d ", error_magnitudes[i]); } printf("\n"); }
/* * Class: eu_vandertil_jerasure_jni_Galois * Method: galois_inverse * Signature: (II)I */ JNIEXPORT jint JNICALL Java_eu_vandertil_jerasure_jni_Galois_galois_1inverse (JNIEnv *env, jclass clazz, jint x, jint w) { return galois_inverse(x, w); }