📄 gf.h
字号:
#ifndef _GF
#define _GF
#include "stdlib.h"
typedef unsigned int GFE;
/*表示一个GF(2)扩域的结构体,由两张表组成
,Pow2Vec实现从幂次表示到矢量表示的转换,Vec2Pow实现从矢量表示到幂次表示的转换
*/
#define Using_Pow2Vec_Vec2Pow_NG(GFS) GFE *Pow2Vec=(GFS).Pow2Vec; \
int *Vec2Pow=(GFS).Vec2Pow; \
int NG=(GFS).N
#define GFADD_P2P(deg1,deg2) Vec2Pow[Pow2Vec[deg1]^Pow2Vec[deg2]]
//给出两个GF中元素的alpha之幂次,求其和对应的幂次
#define GFMPY_V2V(vec1,vec2,NG) ((vec1==0 || vec2==0)? 0 : Pow2Vec[((Vec2Pow[vec1]+Vec2Pow[vec2]) % NG)])
#define GFDIV_V2V(vec1,vec2,NG) ((vec1==0)? 0 : Pow2Vec[((Vec2Pow[vec1]-Vec2Pow[vec2]+NG) % NG)])
//给出两个GF中元素的alpha之m重表示,求其积/商对应的m重表示
//使用以上这些宏的条件: 必须在调用程序中有名为Vec2Pow和Pow2Vec的两个查找表
#define MODQ(N,q) (((q)>0)? (((N)>=0)? (N)%q : ((q-(-(N))%q)%q)) : N)
//m重表示的两GF元素之和直接用位异或即可;幂次表示的两GF元素之积/商直接用MODQ即可
static GFE primepolynom[9]={0,0x3,0x7,0xb,0x13,0x25,0x43,0x89,0x11d};
struct GF {
int N;//指GF中乘群的阶数,即N=2^M-1
int M;//2的M次扩域
int* Vec2Pow;//从非零域元素的矢量表示到本原元幂次表示的查找表
GFE* Pow2Vec;//从非零域元素的本原幂次表示到矢量表示的查找表
};
extern int GFEDeg(GFE p);
extern GFE CombMod2(GFE n1, GFE n2);
extern void InitGF(GF* gf, int m);
extern GF NewGF(int m);
extern void FreeGF(GF* g);
#endif
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -