有限域运算_有限域GF

有限域运算_有限域GF  忙了一周,总算把网络编码的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,而且两种还都可以

  忙了一周,总算把网络编码的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)运算中用到的几个函数贴上来吧,就当是行善积德了。
  代码主要是正反对数表的构造和乘除法,至于加减,当然就是神奇的异或了。

 

有限域运算_有限域GF
        
public
 
static
 
int
[] alog 
=
 
new
 
int
[
256
];
有限域运算_有限域GF        

public
 
static
 
int
[] log 
=
 
new
 
int
[
256
];
有限域运算_有限域GF    
有限域运算_有限域GF    

//
构造GF(2^8)上的对数表和反对数表

有限域运算_有限域GF有限域运算_有限域GF

    
public
 
void
 generateLogTable() 

{

有限域运算_有限域GF        
int i, j;
有限域运算_有限域GF
有限域运算_有限域GF        alog[
0] = 1;
有限域运算_有限域GF有限域运算_有限域GF        
for (i = 1; i < 256; i++) {

有限域运算_有限域GF            j 
= (alog[i–1] << 1) ^ alog[i–1];
有限域运算_有限域GF            
if ((j & 0x100) != 0)
有限域运算_有限域GF                j 
^= 0x11B;        //0x11B即本原多项式x^8+x^4+x^3+x+1
有限域运算_有限域GF
            alog[i] = j;
有限域运算_有限域GF        }

有限域运算_有限域GF
有限域运算_有限域GF        log[
0] = log[1] = 0;
有限域运算_有限域GF        
for (i = 1; i < 255; i++)
有限域运算_有限域GF            log[alog[i]] 
= i;
有限域运算_有限域GF    }


有限域运算_有限域GF    
有限域运算_有限域GF    

//
GF(2^8)上的乘法运算,查表实现

有限域运算_有限域GF有限域运算_有限域GF

    
public
 
int
 mul(
int
 A, 
int
 B) 

{

有限域运算_有限域GF        
if (A == 0 || B == 0)
有限域运算_有限域GF            
return 0;
有限域运算_有限域GF        
else
有限域运算_有限域GF            
return alog[(log[A]+log[B])%255];
有限域运算_有限域GF    }


有限域运算_有限域GF    
有限域运算_有限域GF    

//
GF(2^8)上的除法运算,查表实现

有限域运算_有限域GF有限域运算_有限域GF

    
public
 
int
 div(
int
 A, 
int
 B) 

{

有限域运算_有限域GF        
if (A == 0)
有限域运算_有限域GF            
return 0;
有限域运算_有限域GF有限域运算_有限域GF        
else if (B == 0) {

有限域运算_有限域GF            System.err.println(
“divide by zero exception“);
有限域运算_有限域GF            
return –1;
有限域运算_有限域GF        }

有限域运算_有限域GF有限域运算_有限域GF        
else {

有限域运算_有限域GF            
if ((log[A]–log[B]) < 0)
有限域运算_有限域GF                
return alog[(log[A]–log[B]+255)%255];
有限域运算_有限域GF            
else
有限域运算_有限域GF                
return alog[(log[A]–log[B])%255];
有限域运算_有限域GF        }

有限域运算_有限域GF    }

 

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/234397.html原文链接:https://javaforall.net

赞 (0)
全栈程序员-站长的头像全栈程序员-站长

相关推荐

  • 查看MySQL端口_哪些端口可以使用

    查看MySQL端口_哪些端口可以使用mysql端口号(怎么查看mysql的端口号)2020-05-0721:54:58共10个回答如何查看mysql的端口号–输入以下命令:SHOWVARIABLESWHEREVARIABLE_NAME=’port’就可以查看当前连接的端口号,–例如:mysql>SHOWVARIABLESWHEREVARIABLE_NAME=’port’;mysql的默认端口号是多少mysql默认端口号…

    2022年9月1日
  • 固态硬盘数据如何恢复「建议收藏」

    固态硬盘数据如何恢复「建议收藏」虽说很多朋友都曾使用过硬盘,但是对于硬盘的一些定义,你们却不一定真正的了解,例如固态硬盘是什么?这个概念,你能说的出来吗?我想未必吧!好吧,在说咱们的正题之前,咱们先就固态硬盘这个概念解释一下。  所谓固态硬盘,其实就是一种硬盘的类别,它在使用方法和性能上与一般的硬盘完全一样,龙腾recuva数据恢复软件但是不得不说,这种固态硬盘的稳定性更好,就这一点也让固态硬盘的档次也上升了好几倍,因此,这

    2022年9月20日
  • Windows 7下安装MongoDB

    Windows 7下安装MongoDB

    2022年2月7日
  • 程序员每天都在使用的6个惊讶的软技能

    程序员每天都在使用的6个惊讶的软技能

    2022年3月2日
  • Ubuntu18.04 安装Jdk1.8[通俗易懂]

    Ubuntu18.04 安装Jdk1.8[通俗易懂]Ubuntu18.04安装Jdk1.8

    2022年7月12日
  • 《LaTeX教程》

    《LaTeX教程》一位小仙女分享给我的LaTeX排版教程书,本人感觉特别好用。人生最快乐的事就是分享你的快乐给别人。独乐不如众乐,愿你我都有所获。链接:https://pan.baidu.com/s/1IkRzLz-Vmt5uL5TksX1lxg提取码:v9ag(“Ifyouhavegreattalents,industrywillimprovethem;ifyouhavebutm…

    2022年7月16日

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号