大家好,又见面了,我是你们的朋友全栈君。如果您正在找激活码,请点击查看最新教程,关注关注公众号 “全栈程序员社区” 获取激活教程,可能之前旧版本教程已经失效.最新Idea2022.1教程亲测有效,一键激活。
Jetbrains全家桶1年46,售后保障稳定
忙了一周,总算把网络编码的Demo搞定了。
回想一下,大部分的时间都花在有限域的运算上了。网上找了几个运算类,没一个像样的,算出来结果也没两个是一样的,汗…主要是三个方面的问题,一是本原多项式P(x),到现在我还是没搞懂这玩意是怎么定出来的,为什么同样是GF(2^8),有人说P(x)=x^8+x^4+x^3+x+1,有人又说是P(x)=x^8+x^4+x^3+x^2+1,而且两种还都可以正常运算(编码后可以正确解码),搞得我相当被动,最后选择的是前者,因为看起来支持的人要多一点,再汗…二是乘法,这也够混乱的,有人按多项式展开,有人直接对普通乘法求模,还有人…实在看不懂怎么算的。好在后来从一段AES加密算法的源码里扒出个用查表法实现的乘法函数,省时又好用。三是除法,这个简直就很少有人提及了,据说除法可以分解成乘法和求逆运算,可半天也没想出怎么分解,最后终于从一篇很老的paper里找到了一点提示,总算是基本把有限域运算这个难题给了结了。
毕竟我不是搞数学的,有限域只不过是个工具,能用就行,不想也没时间深入研究下去了。不过还是把GF(2^8)运算中用到的几个函数贴上来吧,就当是行善积德了。
代码主要是正反对数表的构造和乘除法,至于加减,当然就是神奇的异或了。
public
static
int
[] alog
=
new
int
[
256
];
public
static
int
[] log
=
new
int
[
256
];
//
构造GF(2^8)上的对数表和反对数表
public
void
generateLogTable()
…
{
int i, j;
alog[0] = 1;
for (i = 1; i < 256; i++) …{
j = (alog[i–1] << 1) ^ alog[i–1];
if ((j & 0x100) != 0)
j ^= 0x11B; //0x11B即本原多项式x^8+x^4+x^3+x+1
alog[i] = j;
}
log[0] = log[1] = 0;
for (i = 1; i < 255; i++)
log[alog[i]] = i;
}
//
GF(2^8)上的乘法运算,查表实现
public
int
mul(
int
A,
int
B)
…
{
if (A == 0 || B == 0)
return 0;
else
return alog[(log[A]+log[B])%255];
}
//
GF(2^8)上的除法运算,查表实现
public
int
div(
int
A,
int
B)
…
{
if (A == 0)
return 0;
else if (B == 0) …{
System.err.println(“divide by zero exception“);
return –1;
}
else …{
if ((log[A]–log[B]) < 0)
return alog[(log[A]–log[B]+255)%255];
else
return alog[(log[A]–log[B])%255];
}
}
发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/234397.html原文链接:https://javaforall.cn
【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛
【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...