/
galois.h
134 lines (106 loc) · 2.98 KB
/
galois.h
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
/////////////////////////////////////////////////////////////////////////
//
// galois.h --a part of libdecodeqr
//
// Copyright(C) 2007 NISHI Takao <zophos@koka-in.org>
// JMA (Japan Medical Association)
// NaCl (Network Applied Communication Laboratory Ltd.)
//
// This is free software with ABSOLUTELY NO WARRANTY.
// You can redistribute and/or modify it under the terms of LGPL.
//
// $Id: galois.h 36 2007-02-21 23:22:03Z zophos $
//
#ifndef __GALOIS__
#define __GALOIS__
#include <memory.h>
#ifndef NULL
#define NULL 0
#endif
namespace Galois{
class Nomial{
public:
unsigned int val;
private:
void *_gf;
public:
static Nomial *instance(void * gf,unsigned int x);
Nomial *dup();
unsigned int to_exp();
unsigned int to_vect();
inline int m();
inline int n();
inline unsigned int exp2vect(unsigned int x);
inline unsigned int vect2exp(unsigned int x);
bool is_zero();
bool operator==(Nomial x);
bool operator!=(Nomial x);
Nomial operator+(Nomial x);
Nomial operator-(Nomial x);
Nomial operator*(Nomial x);
Nomial operator/(Nomial x);
protected:
Nomial(void * gf,unsigned int x);
};
class Field{
public:
int m;
int n;
unsigned int *exp2vect;
unsigned int *vect2exp;
Nomial **pool;
private:
int _pool_size;
bool _need_delete;
public:
Field(int m);
~Field();
int pool_size();
Nomial *exp2nomial(unsigned int x);
Nomial *vect2nomial(unsigned int x);
Nomial *zero();
};
class Polynomial{
public:
int cols;
int rows;
Nomial **nomial;
Polynomial();
Polynomial(int rows);
Polynomial(int cols,int rows);
~Polynomial();
Polynomial *dup();
Polynomial *dup(int count);
Polynomial *dup(int start_col,int start_row,int count);
Polynomial *dup(int start_col,int start_row,
int col_count,int row_count);
Nomial *set(int row,Nomial *val);
Nomial *set(int col,int row,Nomial *val);
Nomial *get(int row);
Nomial *get(int col,int row);
Polynomial *lu();
Polynomial *lu(int count);
Polynomial *lu(int start_col,int start_row,int count);
Polynomial *_lu(Polynomial *buf);
Polynomial *solve();
Polynomial *solve(Polynomial *lu);
void swap_col(int i,int j);
};
class BCH :public Polynomial{
public:
int error_size;
int *error_pos;
int syndrome_size;
Galois::Nomial **syndromes;
private:
Field *_gf;
int _capability;
public:
BCH(Field *gf,int size,int capability);
~BCH();
int decode(int syndorome_base=0);
private:
Galois::Nomial *_error_syndrome(int d);
};
}
#endif