Перенос на новую организацию GONEC
This commit is contained in:
commit
636dfc412f
|
|
@ -0,0 +1,128 @@
|
||||||
|
//
|
||||||
|
// Created by zemon on 22.07.2022.
|
||||||
|
//
|
||||||
|
#include "Galois256.h"
|
||||||
|
#include <memory.h>
|
||||||
|
#include "stdint.h"
|
||||||
|
|
||||||
|
|
||||||
|
int32_t inline iGalois256Add(tGalois256 *env, int one, int two) {
|
||||||
|
return one ^ two;
|
||||||
|
}
|
||||||
|
|
||||||
|
int32_t inline iGalois256Sub(tGalois256 *env, int one, int two) {
|
||||||
|
return one ^ two;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
int32_t iGalois256PowValue(tGalois256 *env, int degree) {
|
||||||
|
int deg_in_bounds;
|
||||||
|
|
||||||
|
if (degree < 0) {
|
||||||
|
deg_in_bounds = env->field_elements_limit - ((degree * -1) % env->field_elements_limit);
|
||||||
|
} else {
|
||||||
|
deg_in_bounds = degree % env->field_elements_limit;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
return env->pow_table[deg_in_bounds];
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
int32_t iGalois256LogValue(tGalois256 *env, int degree) {
|
||||||
|
|
||||||
|
if ((degree <= 0) || (degree > env->field_elements_limit)) {
|
||||||
|
// printf("ERROR! Log out of bounds deg:%i in field len %i", degree, env->field_elements_limit);
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
return env->log_table[degree];
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
int32_t iGalois256Mul(tGalois256 *env, int one, int two) {
|
||||||
|
if (0 == one || 0 == two) {
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
return iGalois256PowValue(env, iGalois256LogValue(env, one) + iGalois256LogValue(env, two));
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
int32_t iGalois256Div(tGalois256 *env, int dividable, int divider) {
|
||||||
|
|
||||||
|
if (divider == 0) {
|
||||||
|
// printf("Division by zero %i/%i", dividable, divider);
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (dividable == 0) {
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
return iGalois256PowValue(
|
||||||
|
env,
|
||||||
|
iGalois256LogValue(env, dividable) - iGalois256LogValue(env, divider)
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
int32_t iGalois256Pow(tGalois256 *env, int base, int degree) {
|
||||||
|
|
||||||
|
if (degree == 0) {
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (base == 0) {
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
int base_log = iGalois256LogValue(env, base);
|
||||||
|
|
||||||
|
return iGalois256PowValue(env, degree * base_log);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void iGalois256GenTables(tGalois256 *env) {
|
||||||
|
|
||||||
|
memset(env->log_table, 0, (env->field_elements_limit + 1) * sizeof(int32_t));
|
||||||
|
memset(env->pow_table, 0, (env->field_elements_limit + 1) * sizeof(int32_t));
|
||||||
|
|
||||||
|
int mask = 1;
|
||||||
|
env->pow_table[env->base_degree] = 0;
|
||||||
|
|
||||||
|
for (int i = 0; i < env->base_degree; i++) {
|
||||||
|
env->pow_table[i] = mask;
|
||||||
|
env->log_table[env->pow_table[i]] = i;
|
||||||
|
|
||||||
|
if (env->irreducible_polynomial[i] != 0) {
|
||||||
|
env->pow_table[env->base_degree] ^= mask;
|
||||||
|
}
|
||||||
|
|
||||||
|
mask <<= 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
env->log_table[env->pow_table[env->base_degree]] = env->base_degree;
|
||||||
|
mask >>= 1;
|
||||||
|
|
||||||
|
for (int i = env->base_degree + 1; i < env->field_elements_limit; i++) {
|
||||||
|
if (env->pow_table[i - 1] >= mask) {
|
||||||
|
env->pow_table[i] = env->pow_table[env->base_degree] ^ ((env->pow_table[i - 1] ^ mask) << 1);
|
||||||
|
} else {
|
||||||
|
env->pow_table[i] = env->pow_table[i - 1] << 1;
|
||||||
|
}
|
||||||
|
env->log_table[env->pow_table[i]] = i;
|
||||||
|
}
|
||||||
|
|
||||||
|
env->log_table[0] = -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
static const uint8_t iGalois256BaseDegree = 8;
|
||||||
|
static const uint8_t iGalois256IrreduciblePolynomial[] = {1, 0, 1, 1, 1, 0, 0, 0, 1};
|
||||||
|
|
||||||
|
void iGalois256Init(tGalois256 *env) {
|
||||||
|
env->base_degree = iGalois256BaseDegree;
|
||||||
|
env->irreducible_polynomial = (uint8_t *) iGalois256IrreduciblePolynomial;
|
||||||
|
env->field_elements_limit = (0x01 << (uint16_t) iGalois256BaseDegree) - 1;
|
||||||
|
|
||||||
|
iGalois256GenTables(env);
|
||||||
|
}
|
||||||
|
|
@ -0,0 +1,35 @@
|
||||||
|
//
|
||||||
|
// Created by zemon on 24.07.2022.
|
||||||
|
//
|
||||||
|
|
||||||
|
#ifndef PDM_FIR_TEST_GALOIS256_H
|
||||||
|
#define PDM_FIR_TEST_GALOIS256_H
|
||||||
|
|
||||||
|
#include "stdint.h"
|
||||||
|
|
||||||
|
typedef struct {
|
||||||
|
uint8_t base_degree;
|
||||||
|
uint8_t *irreducible_polynomial;
|
||||||
|
int32_t field_elements_limit;
|
||||||
|
int32_t pow_table[256];
|
||||||
|
int32_t log_table[256];
|
||||||
|
|
||||||
|
} tGalois256;
|
||||||
|
|
||||||
|
void iGalois256Init(tGalois256 *env);
|
||||||
|
|
||||||
|
int32_t iGalois256Add(tGalois256 *env, int one, int two);
|
||||||
|
|
||||||
|
int32_t iGalois256Sub(tGalois256 *env, int one, int two);
|
||||||
|
|
||||||
|
int32_t iGalois256Mul(tGalois256 *env, int one, int two);
|
||||||
|
|
||||||
|
int32_t iGalois256Div(tGalois256 *env, int dividable, int divider);
|
||||||
|
|
||||||
|
int32_t iGalois256Pow(tGalois256 *env, int base, int degree);
|
||||||
|
|
||||||
|
int32_t iGalois256LogValue(tGalois256 *env, int degree);
|
||||||
|
|
||||||
|
int32_t iGalois256PowValue(tGalois256 *env, int degree);
|
||||||
|
|
||||||
|
#endif //PDM_FIR_TEST_GALOIS256_H
|
||||||
|
|
@ -0,0 +1,10 @@
|
||||||
|
{
|
||||||
|
"cmake": {
|
||||||
|
"inc_dirs": [
|
||||||
|
"./"
|
||||||
|
],
|
||||||
|
"srcs": [
|
||||||
|
"./**.c"
|
||||||
|
]
|
||||||
|
}
|
||||||
|
}
|
||||||
Loading…
Reference in New Issue