用unsigned char类型数据实现GF(2^8)下的多项式查表乘法

初来乍到,对于我文章的看法和评论欢迎大家说出来。另外由于本人较懒,关于生成元和本原多项式的知识大家可以去下面这篇文章了解。 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码冗余位的生成。但也不排除明天俺们准备考研调剂去了,拖更。。。。。。。。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

静心忍性

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值