利用指数表和对数表,实现GF(2^8)的乘法优化。

首先利用简单的基础的GF(2^8)乘法,构造指数表和对数表。在这里选取生成元3。

指数表exp[i] = 3^i,对数表log[i] = log3(i)。

要实现x 与 y 相乘,首先利用对数表找出3^m = x, 3^n = y,这时的乘法就是 x * y = 3^m * 3^n = 3^(m+n),然后利用指数表找到exp[m+n]对应的值。

因此所有的乘法都变成了查表操作,提高了效率。但是对于数域较大时,保存对数表和指数表的空间要求较高。典型的牺牲空间换取时间。

#include<iostream>
#include<fstream>
using namespace std;
unsigned char exp[]; //exp[i] = 3^i
unsigned char log[]; //log[i] = log3(i) unsigned char GFmul(unsigned char a, unsigned char b){
//GF(2^8) 乘法
unsigned char result = ;
if((b&) == )result = a;
b >>= ;
for(int i = ; i < ; i ++){
if(a > ){
a = (a << ) ^ 0x1b;
}
else{
a <<= ;
}
if((b&) == ){
result ^= a;
}
b >>= ;
}
return result;
}
void generateMulTab(){
//选择生成元3作为构造乘法表的基础
const int N = ;
unsigned char tmp = ;
for(int i = ; i < ; i ++){
tmp = GFmul(tmp, N);
exp[i] = tmp;
log[tmp] = i;
}
}
unsigned char GFfastMul(unsigned char x, unsigned char y){
//利用exp和log来查表实现乘法
if(x == || y == )return ;
//x = 3^m, y = 3 ^ n; x * y = 3^m * 3^n = 3^(m+n)
int m = log[x], n = log[y];
return exp[(m+n)>?(m+n-):(m+n)];
} int main(){
//单元测试,乘法打表
generateMulTab();
int count[];
for(int i = ; i < ; i ++)count[i] = ;
unsigned char x, y;
x = ;
do{
y = ;
do{
count[GFfastMul(x, y)] ++;
y ++;
}while(y != );
x ++;
}while(x != );
ofstream write("Test.txt");
for(int i = ; i < ; i ++)write<<i<<"\t"<<count[i]<<endl;
write.close();
return ;
}

C++

最新文章

  1. 使用Expression实现数据的任意字段过滤(2)
  2. 完善ecshop的mysql类
  3. JavaScript的3大组成部分&amp;&amp;ECMAScript函数&amp;&amp;闭包
  4. iOS全军覆没!分分钟教你徒手破解iPhone
  5. spring bean生命周期管理--转
  6. 模拟器的tableView的分割线不显示
  7. golang的采集库
  8. poj3686The Windy&#39;s (KM)
  9. 怎么跳出MySQL的10个大坑
  10. 数据结构(主席树):HZOI 2016 采花
  11. 苹果Think Different广告
  12. asp.net自动打卡、签到程序
  13. 非阻塞IO
  14. wiki oi 1044 拦截导弹
  15. VB webbrowser 控件的应用(跨域 内嵌网页元素的访问)
  16. 【2017-03-24】CSS样式表
  17. phpt5支付宝登陆支付接口解析
  18. JDK8 stream toMap() java.lang.IllegalStateException: Duplicate key异常解决(key重复)
  19. K3CLOUD替代方案
  20. 细谈 Web Api 图片上传,在使用 Task.ContinueWith 变量无法赋值问题的解决办法!

热门文章

  1. jpeg和gif已经影响互联网发展进程了,他们应该被历史淘汰了!!!
  2. java.net.MulticastSocket Example--reference
  3. css书写步骤
  4. lucene实战(第二版)学习笔记
  5. WebBrowser控件使用相关
  6. HTML 控件和web控件 OnClientClick和OnClick OnServerClick区别
  7. 武汉科技大学ACM:1008: 零起点学算法64——回型矩阵
  8. ubuntu增加工作分区(workspace)命令
  9. JavaScript escape() 函数
  10. jquery与discuz冲去的解决方法