前言
`有限域的出现,使得多项式的乘法可以通过查表得到加速。本文就介绍了基于有限域GF(2^8)的查表乘法功能,包括RS码的信息位矩阵与范德蒙德矩阵的相乘。
一、代码实现
1.引入库
代码如下(示例):
#define _CRT_SECURE_NO_WARNINGS //关闭安全检查
#include<stdio.h>
#include<stdlib.h>
#include<math.h>
#define max 255
定义各类型的数组
代码如下(示例):
int table[256]; //正表数组,下标就是生成元g的指数,取值范围为 [0, 254]。下标对应元素就是g^k得到的多项式值。取值范围为[1, 255]。
int arc_table[256]; //反表数组 下标就是g^k得到的多项式值,取值范围为 [1, 255]。下标对应的元素就是生成元g 的指数,取值范围为 [0, 254]。
int a[max][max]; //范德蒙德矩阵
int b[1][max]; //信息位矩阵
int c[1][max]; //冗余位矩阵
函数的声明与定义
void juzhen1(int n);
void juzhen2(int m);
void juzhencheng(int k);
int mul(int x, int y);
void juzhen1(int n)
{
int m;
for (int i = 0; i < n; i++)
{
scanf("%d", &m);
b[0][i] = m;
}
}
void juzhen2(int m) //以三列范德蒙德矩阵为例
{
int i, j;
int d[3];
d[0] = 1; d[1] = 2; d[2] = 4;
for (i = 0; i < m; i++)
{
for (j = 0; j < 3; j++)
{
a[i][j] = pow(d[j], i);
}
}
}
void juzhencheng(int k)
{
for (int i = 0; i < k; i++)
{
int sum = 0;
for (int j = 0; j < k; j++)
{
sum += mul(b[0][j], a[j][i]);
}
c[0][i] = sum;
}
}
int mul(int x, int y)
{
if (!x || !y)
return 0;
return table[(arc_table[x] + arc_table[y]) % 255];
}
函数主体
void main()
{
int i;
table[0] = 1;//g^0
for (i = 1; i < 255; ++i)//生成元为x,对应本原多项式x^8 + x^4 + x^3 + x^2 + 1。
{
//下面是table[i] = table[i-1] * x
table[i] = table[i - 1] << 1; //相等于乘2,这里可以提高运算速度
if (table[i] & 0x100) //如果数大于256,需要进行模运算
{
table[i] ^= 0x11D;//x11D就是 2^8 + 2^4 + 2^3 + 2^2 + 1
}
}
for (i = 0; i < 255; ++i)
arc_table[table[i]] = i;
/*printf(" ***");
for (int j = 1; j < 255; j++)
{
printf(" %4d", arc_table[j]);
if (j%15==0)
printf("\n");
}*/
for (i = 1; i < 256; ++i)//0没有逆元,所以从1开始
{
int k = arc_table[i];
k = 255 - k;
k %= 255;//使取值范围限定在[0,254]之间
inverse_table[i] = table[k];
}
juzhen1(3);
juzhen2(3);
juzhencheng(3);
printf("%d %d %d", c[0][0], c[0][1], c[0][2]);
}
总结
以上就是今天要讲的内容,本文仅仅简单介绍基于有限域的多项式查表乘法,以及简单RS编码中的信息位矩阵与范德蒙德矩阵相乘得到冗余矩阵的操作。
但由于一个数据块还要涉及里面单个符号的问题,且unsigned char类型数据的范围为0-255,正好可以用在GF(2^8)下多项式值的表示。所以限制数据类型为unsigned char更为合适,具体操作留待读者自行实现。