初来乍到,对于我文章的看法和评论欢迎大家说出来。另外由于本人较懒,关于生成元和本原多项式的知识大家可以去下面这篇文章了解。 https://blog.csdn.net/luotuo44/article/details/41645597
前言
整型数据实现查表
上一篇文章实现了用int型数据乘法查表功能(链接见上),但文末也提到数据块中可能遇到的数据符号类型。为了避免这种问题,我们采用unsigned char数据(0-255)来实现查表功能。
`
一、首先直接上代码(后文注解也值得一看)
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<stdlib.h>
#include<math.h>
unsigned char table[256]; //正表数组,下标就是生成元g的指数,取值范围为 [0, 254]。下标对应元素就是g^k得到的多项式值。取值范围为[1, 255]。
unsigned char arc_table[256]; //反表数组 下标就是g^k得到的多项式值,取值范围为 [1, 255]。下标对应元素就是生成元g的指数,取值范围为 [0, 254]。
unsigned char mul(unsigned char x, unsigned char y);
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。
{
unsigned char a = 0;
if (table[i - 1] < 128)
table[i] = table[i - 1] << 1;
//最高指数已经到了8,需要模上m(x)
else
{
a = ((table[i - 1] - 128) << 1) ^ 0x1D;//0x1D就是29 = 2^4 + 2^3 + 2^2 + 1
table[i] = a;
}
}
//for (int j = 1; j < 255; j++)
//{
// printf(" %-4d", table[j]);
// if (j % 15 == 0)
// printf("\n");
//}
for (i = 0; i < 255; ++i)
arc_table[table[i]] = i;
//for (int j = 1; j < 255; j++)
//{
// printf(" %4d", arc_table[j]);
// if (j % 15 == 0)
// printf("\n");
//}
unsigned result = mul(127, 128);
printf("%d", result);
}
unsigned char mul(unsigned char x, unsigned char y)
{
if (!x || !y)
return 0;
else if ( (int)(arc_table[x]+arc_table[y]) > 255)
{
unsigned char b = arc_table[x] + arc_table[y];
return table[b + 1];
}
else
return table[(arc_table[x] + arc_table[y]) % 255];
}
二、基础知识部分代码解答
1.unsigned char数据特点
我们知道unsigned char数据的范围是0-255。
那么unsigned char a=128; unsigned char b=a*2; printf("%d",b)数据范围越界后会发生什么呢,你会发现结果是0,类似的,257对应的结果是1。注意此处与模255的结果是不同的,它的值小1。
2.部分代码注解
if (table[i - 1] < 128)
table[i] = table[i - 1] << 1;
如果是小于128的数,在左移一位,即相当于乘2后,其数值是不会超过255的。
else
{
a = ((table[i - 1] - 128) << 1) ^ 0x1D;//0x1D就是29 = 2^4 + 2^3 + 2^2 + 1
table[i] = a;
}
当table[i-1]值大于128后,移位结果必然大于255。此时需要注意的是,由于unsigned char类型数据范围的限制,table[i-1]化成对应的多项式后,其最高位的幂一定小于8,且必有2^7。如果此时直接左移1位,必然越界,table[i-1]<<1后的结果就不是我们想要的可爱数据了,所以可减去128,便可继续开心的玩耍了。在上一遍文章中,我们提到,大于255的数据我们是需要模本原多项式的,但此时可爱的数据又小于255。怎么办呢,通过观察我们发现,模本原多项式x8+x4+x3+x2+1的结果其实就是数据和0X11D按位异或的结果,你会发现大于255的数据中一定有x8,与本原多项式异或后,x8变去掉了,所以可以去掉x8,得到伪本原多项式x4+x3+x2+1,再与可爱数据按位异或(因为可爱数据也做了去x8的操作)。
unsigned char mul(unsigned char x, unsigned char y)
{
if (!x || !y)
return 0;
else if ( (int)(arc_table[x]+arc_table[y]) > 255)
{
unsigned char b = arc_table[x] + arc_table[y];
return table[b + 1];
}
else
return table[(arc_table[x] + arc_table[y]) % 255];
}
关于乘法函数,其实我是特意不写注释的,这里也不想写注解了。因为毕竟各位小伙伴还是要自己独立思考一下的啊,这段代码的解释大家可以自由发挥写在评论里。
总结
emmm,有限域的乘法一般都是用在编码方面。而线性码中便有一位大佬(为什么是大佬,什么知网,IEEE一大堆文章介绍它!),RS码的编码用到了查表多项式乘法以实现加速。嘿嘿,不出意外明天就给大家带来R基于范德蒙德矩阵的RS码冗余位的生成。但也不排除明天俺们准备考研调剂去了,拖更。。。。。。。。