/********************************************
BCH(192,116,21) DECODER
*********************************************/
#include <stdio.h>
#define N 192
#define T 10
#define min 8 /*极小多项式m(x)的最高次数*/
static int gf[256][8]; /*read from gffield table*/
/******求余式r(x)函数******/
int *residue(int mx[min+1],int RC[N])
{
static int rx[min+1];
int i,j,temp;
for(i=0;i<=min;i++)
rx[i]=0;
for(j=N-1;j>=0;j--)
{
rx[0]=RC[j];
if(mx[8]==1)
{
temp=rx[min];
for(i=min;i>0;i--)
if(mx[i-1]==0)
rx[i]=rx[i-1];
else if(mx[i-1]==1)
rx[i]=rx[i-1]^temp;
}
else if(mx[8]==0)
{
temp=rx[4];
for(i=4;i>0;i--)
if(mx[i-1]==0)
rx[i]=rx[i-1];
else if(mx[i-1]==1)
rx[i]=rx[i-1]^temp;
}
}
return(rx);
}
/******自然基乘法函数 a=b*c ******/
int *multiply(int b[8],int c[8])
{
static int a[8];
int i,temp;
for(i=0;i<8;i++)
a[i]=0;
for(i=7;i>=0;i--)
{
temp=a[7];
a[7]=(c[i]&b[7])^a[6];
a[6]=(c[i]&b[6])^a[5];
a[5]=(c[i]&b[5])^a[4];
a[4]=(c[i]&b[4])^a[3]^temp;
a[3]=(c[i]&b[3])^a[2]^temp;
a[2]=(c[i]&b[2])^a[1]^temp;
a[1]=(c[i]&b[1])^a[0];
a[0]=(c[i]&b[0])^temp;
}
return(a);
}
int *adverse(int a[8]) /*查表法求逆*/
{
int *q,k,i=0,j=0;
bool flag;
do
{
flag=true;
j=0;
while((flag==true)&(j<8))
if(a[j]!=gf[i][j])
flag=false;
else
j++;
i++;
}while((flag==false)&(i<255));
k=255-(i-1);
q=gf[k];
return(q);
}
int max(int x,int y)
{
int z;
z=(x>=y)?x:y;
return(z);
}
void main()
{
static int RX[N]; /*接收多项式*/
static int
m1[min+1]={1,0,1,1,1,0,0,0,1},
m3[min+1]={1,1,1,0,1,1,1,0,1},
m5[min+1]={1,1,0,0,1,1,1,1,1},
m7[min+1]={1,0,0,1,0,1,1,0,1},
m9[min+1]={1,0,1,1,1,1,0,1,1},
m11[min+1]={1,1,1,0,0,1,1,1,1},
m13[min+1]={1,1,0,1,0,1,0,0,1},
m15[min+1]={1,1,1,0,1,0,1,1,1},
m17[min+1]={1,1,0,0,1,0,0,0,0},
m19[min+1]={1,0,1,0,0,1,1,0,1}; /*极小多项式*/
static int r1[min+1],r3[min+1],r5[min+1],r7[min+1],r9[min+1],
r11[min+1],r13[min+1],r15[min+1],r17[min+1],r19[min+1]; /*除法余式*/
static int s[2*T+1][min];
int *p;
int i,j;
static int d[2*T+1][8],dx[2*T+1];
static int D[2*T+1];
static int det[T+1][8],detw[T+1][8],detx[T+1][8],detwtmp[T+1][8];
int *pt,w,m,h,k,tmp[8];
static int ax[T+1][8]={{1,0,0,0,0,0,0,0},{0,1,0,0,0,0,0,0},{0,0,1,0,0,0,0,0},
{0,0,0,1,0,0,0,0},{0,0,0,0,1,0,0,0},{0,0,0,0,0,1,0,0},{0,0,0,0,0,0,1,0},
{0,0,0,0,0,0,0,1},{1,0,1,1,1,0,0,0},{0,1,0,1,1,1,0,0},{0,0,1,0,1,1,1,0}};
static int ab[T+1][8]={{1,0,0,0,0,0,0,0},{1,0,0,0,0,1,0,1},{0,1,1,0,0,1,1,0},
{1,1,1,0,1,0,1,0},{1,0,1,1,0,1,0,1},{1,0,0,1,1,1,0,1},{1,0,1,0,0,0,1,1},
{0,1,1,1,0,1,1,0},{0,1,1,0,1,1,0,0},{0,1,0,1,1,1,0,1},{1,1,0,1,1,1,0,0}};
static int sum[8],CX[N];
int sumx=0;
FILE *fp0,*fp1,*fp2,*fp3;
fp0=fopen("e:\\radiowork\\bch\\gffield.txt","r");
fp1=fopen("e:\\radiowork\\bch\\data\\ercode20.txt","r");
fp2=fopen("e:\\radiowork\\bch\\data\\decode20.txt","w");
fp3=fopen("e:\\radiowork\\bch\\data\\demsg20.txt","w");
for(i=0;i<256;i++)
for(j=0;j<8;j++)
fscanf(fp0,"%d",&gf[i][j]);
for(i=0;i<N;i++)
fscanf(fp1,"%d",&RX[i]);
/*求余式*/
p=residue(m1,RX);
for(i=0;i<min;i++)
r1[i]=p[i+1];
p=residue(m3,RX);
for(i=0;i<min;i++)
r3[i]=p[i+1];
p=residue(m5,RX);
for(i=0;i<min;i++)
r5[i]=p[i+1];
p=residue(m7,RX);
for(i=0;i<min;i++)
r7[i]=p[i+1];
p=residue(m9,RX);
for(i=0;i<min;i++)
r9[i]=p[i+1];
p=residue(m11,RX);
for(i=0;i<min;i++)
r11[i]=p[i+1];
p=residue(m13,RX);
for(i=0;i<min;i++)
r13[i]=p[i+1];
p=residue(m15,RX);
for(i=0;i<min;i++)
r15[i]=p[i+1];
p=residue(m17,RX);
for(i=0;i<min;i++)
r17[i]=p[i+1];
p=residue(m19,RX);
for(i=0;i<min;i++)
r19[i]=p[i+1];
/*****计算伴随多项式s(x)*****/
for(i=min-1;i>=0;i--)
s[1][i]=r1[i];
s[2][7]=r1[6];
s[2][6]=r1[6]^r1[5]^r1[3];
s[2][5]=r1[5];
s[2][4]=r1[7]^r1[5]^r1[4]^r1[2];
s[2][3]=r1[6]^r1[4];
s[2][2]=r1[6]^r1[5]^r1[4]^r1[1];
s[2][1]=r1[7];
s[2][0]=r1[7]^r1[6]^r1[4]^r1[0];
s[3][7]=r3[4];
s[3][6]=r3[7]^r3[4]^r3[2];
s[3][5]=r3[7]^r3[6]^r3[5]^r3[3];
s[3][4]=r3[7]^r3[3];
s[3][3]=r3[6]^r3[4]^r3[3]^r3[1];
s[3][2]=r3[7]^r3[6]^r3[5]^r3[4];
s[3][1]=r3[5]^r3[3];
s[3][0]=r3[7]^r3[6]^r3[4]^r3[0];
s[4][7]=r1[6]^r1[5]^r1[3];
s[4][6]=r1[4]^r1[3];
s[4][5]=r1[5];
s[4][4]=r1[7]^r1[5]^r1[2]^r1[1];
s[4][3]=r1[7]^r1[6]^r1[4]^r1[3]^r1[2];
s[4][2]=r1[6]^r1[5]^r1[4]^r1[3]^r1[2];
s[4][1]=r1[6];
s[4][0]=r1[6]^r1[3]^r1[2]^r1[0];
s[5][7]=r5[7]^r5[4];
s[5][6]=r5[6]^r5[2];
s[5][5]=r5[6]^r5[4]^r5[3]^r5[2]^r5[1];
s[5][4]=r5[7]^r5[4]^r5[2];
s[5][3]=r5[7];
s[5][2]=r5[7]^r5[4]^r5[3]^r5[2];
s[5][1]=r5[5]^r5[3];
s[5][0]=r5[5]^r5[0];
s[6][7]=r3[7]^r3[4]^r3[2];
s[6][6]=r3[5]^r3[2]^r3[1];
s[6][5]=r3[7]^r3[6]^r3[5]^r3[3];
s[6][4]=r3[7];
s[6][3]=r3[4]^r3[3]^r3[2];
s[6][2]=r3[7]^r3[6]^r3[4]^r3[3]^r3[2];
s[6][1]=r3[4];
s[6][0]=r3[7]^r3[6]^r3[4]^r3[3]^r3[2]^r3[0];
s[7][7]=r7[7]^r7[6]^r7[5]^r7[1];
s[7][6]=r7[3];
s[7][5]=r7[6]^r7[3];
s[7][4]=r7[6]^r7[5]^r7[4]^r7[3]^r7[2];
s[7][3]=r7[7]^r7[5]^r7[4];
s[7][2]=r7[7]^r7[6]^r7[5]^r7[3];
s[7][1]=r7[2];
s[7][0]=r7[6]^r7[3]^r7[2]^r7[0];
s[8][7]=r1[4]^r1[3];
s[8][6]=r1[7]^r1[6]^r1[5]^r1[2];
s[8][5]=r1[5];
s[8][4]=r1[7]^r1[4]^r1[1];
s[8][3]=r1[7]^r1[5]^r1[4]^r1[3]^r1[2]^r1[1];
s[8][2]=r1[7]^r1[6]^r1[4]^r1[3]^r1[2]^r1[1];
s[8][1]=r1[6]^r1[5]^r1[3];
s[8][0]=r1[7]^r1[4]^r1[3]^r1[1]^r1[0];
s[9][7]=r9[7]^r9[5];
s[9][6]=r9[6]^r9[5];
s[9][5]=r9[7]^r9[4]^r9[2]^r9[1];
s[9][4]=r9[6]^r9[1];
s[9][3]=r9[3]^r9[2]^r9[1];
s[9][2]=r9[4]^r9[3]^r9[2];
s[9][1]=r9[1];
s[9][0]=r9[7]^r9[5]^r9[4]^r9[2]^r9[0];
s[10][7]=r5[6]^r5[2];
s[10][6]=r5[7]^r5[4]^r5[3]^r5[1];
s[10][5]=r5[6]^r5[4]^r5[3]^r5[2]^r5[1];
s[10][4]=r5[7]^r5[6]^r5[2]^r5[1];
s[10][3]=r5[7]^r5[6]^r5[4];
s[10][2]=r5[7]^r5[5]^r5[2]^r5[1];
s[10][1]=r5[7]^r5[4];
s[10][0]=r5[6]^r5[5]^r5[0];
s[11][7]=r11[5]^r11[4]^r11[2]^r11[1];
s[11][6]=r11[6]^r11[4]^r11[2]^r11[1];
s[11][5]=r11[7]^r11[6]^r11[5]^r11[4]^r11[3]^r11[2]^r11[1];
s[11][4]=r11[7];
s[11][3]=r11[7]^r11[4]^r11[2]^r11[1];
s[11][2]=r11[7]^r11[4]^r11[3];
s[11][1]=r11[4]^r11[3]^r11[2];
s[11][0]=r11[6]^r11[3]^r11[0];
s[12][7]=r3[5]^r3[2]^r3[1];
s[12][6]=r3[7]^r3[6]^r3[4]^r3[1];
s[12][5]=r3[7]^r3[6]^r3[5]^r3[3];
s[12][4]=r3[5];
s[12][3]=r3[7]^r3[5]^r3[2]^r3[1];
s[12][2]=r3[6]^r3[4]^r3[3]^r3[2]^r3[1];
s[12][1]=r3[7]^r3[4]^r3[2];
s[12][0]=r3[7]^r3[6]^r3[5]^r3[3]^r3[2]^r3[1]^r3[0];
s[13][7]=r13[7]^r13[5]^r13[1];
s[13][6]=r13[6];
s[13][5]=r13[7]^r13[6]^r13[5]^r13[3];
s[13][4]=r13[6]^r13[5]^r13[4]^r13[3];
s[13][3]=r13[6]^r13[5];
s[13][2]=r13[5]^r13[4]^r13[3]^r13[2]^r13[1];
s[13][1]=r13[7]^r13[5]^r13[2]^r13[1];
s[13][0]=r13[7]^r13[3]^r13[1]^r13[0];
s[14][7]=r7[3];
s[14][6]=r7[7]^r7[6]^r7[5]^r7[4];
s[14][5]=r7[6]^r7[3];
s[14][4]=r7[5]^r7[4]^r7[3]^r7[2]^r7[1];
s[14][3]=r7[6]^r7[5]^r7[4]^r7[2];
s[14][2]=r7[5]^r7[4]^r7[3];
s[14][1]=r7[7]^r7[6]^r7[5]^r7[1];
s[14][0]=r7[7]^r7[6]^r7[4]^r7[3]^r7[1]^r7[0];
s[15][7]=r15[6]^r15[4]^r15[3];
s[15][6]=r15[6]^r15[3]^r15[2];
s[15][5]=r15[4]^r15[2]^r15[1];
s[15][4]=r15[7]^r15[6]^r15[4];
s[15][3]=r15[7]^r15[6]^r15[5]^r15[4];
s[15][2]=r15[6]^r15[5]^r15[1];
s[15][1]=r15[7]^r15[6]^r15[5]^r15[1];
s[15][0]=r15[6]^r15[5]^r15[4]^r15[3]^r15[0];
s[16][7]=r1[7]^r1[6]^r1[5]^r1[2];
s[16][6]=r1[6]^r1[5]^r1[4]^r1[3]^r1[1];
s[16][5]=r1[5];
s[16][4]=r1[6]^r1[5]^r1[4]^r1[2];
s[16][3]=r1[6]^r1[5]^r1[4]^r1[2]^r1[1];
s[16][2]=r1[5]^r1[4]^r1[3]^r1[2]^r1[1];
s[16][1]=r1[4]^r1[3];
s[16][0]=r1[7]^r1[6]^r1[5]^r1[4]^r1[2]^r1[0];
s[17][7]=r17[7]^r17[5]^r17[4]^r17[1];
s[17][6]=r17[6]^r17[5]^r17[2];
s[17][5]=0;
s[17][4]=r17[7]^r17[5]^r17[4]^r17[1];
s[17][3]=r17[4]^r17[3]^r17[2]^r17[1];
s[17][