您的位置:首页 > 编程语言 > MATLAB

用Matlab计算二元域GF(2)上的不可约多项式

2016-02-10 00:30 776 查看

1 二元域 GF(2) 上的不可约多项式

二元域 GF(2)={0,1} 上的运算规则如下:

加法:+01
001
110
乘法:⋅01
000
101
二元域 GF(2) 上的多项式具有形式

p(x)=anxn+an−1xn−1+⋯+a1x+a0

其中,ai∈GF(2), 0≤i≤n.

定义:一个次数大于等于 1 的多项式称为 不可约多的,如果它不能被分解为两个次数大于等于 1 的多项式的乘积.

显然,在二元域 GF(2) 上,一次多项式 p(x)=x+a0 是不可约多项式;次数大于 1 并且常数项 a0=0 的多项式均为可约多项式(因为有一次因式 x),从而次数大于 1 的多项式是不可约多项式的必要条件是常数项 a0=1.

检查 GF(2) 上的多项式是否可约:设 p(x)=anxn+an−1xn−1+⋯+a1x+a0 为 n 次多项式.

(a) 若 n=1,则 p(x) 为不可约多项式.

(b) 若 n>1,

(b.1) 若 a0=0,则 p(x) 为可约多项式.

(b.2) 若 a1=1,则用所有次数 ⌊n2⌋ 的(不可约)多项式 g(x) 除 p(x). 若存在一个 g(x) 使得 g(x)|p(x),则 p(x) 为可约多项式,否则为不可约多项式.

2 二元域 GF(2) 上多项式的表示

多项式在计算机中常用其系数数组来表示. 自然地,二元域 GF(2) 上的一个 n 多项式

p(x)=anxn+an−1xn−1+⋯+a1x+a0

可以表示为一个 GF(2) 上的 n+1 维向量

P=(an,an−1,…,a1,a0)∈GFn+1(2)

因此,多项式环 GF(2)[x] 和 GF(2) 上的无穷维向量空间 GF∞(2) 之间存在“1-1”对应关系.

更进一步,任意一个 GF(2) 上的向量可以转化为一个非负整数:

(an,an−1,…,a1,a0)→∑i=0nai2i

显然,这也是一个“1-1”对应关系. 从而,二元域 GF(2) 上的一个多项式 p(x)=anxn+an−1xn−1+⋯+a1x+a0 与一个非负整数 ∑ni=0ai2i 相对应,我们得到“1-1”对应关系:

GF(2)[x]→Z∗

p(x)=∑i=0naixi↦p(2)=∑i=0nai2i

3 判断 GF(2) 上两个多项式的整除关系

在下面的 Matlab 函数判断 GF(2) 上的一个多项式是否能被另一个多项式整除,其中,多项式表示为由 ‘0’ 和 ‘1’ 组成的字符串的形式. 例如,多项式 f(D)=D3+D+1 表示为 ′1011′.

function b = isDivisible(f,g)
% 判断二元域 GF(2) 上两个多项式的整除关系
% 若 'f' 可以被 'g' 整除,则返回 1;否则返回 0;
% 输入
% f: 被除式,由 '0' 和 '1' 组成的字符串来表示
% g: 除式,由 '0' 和 '1' 组成的字符串来表示
% 输出
% 若 'g' 整除 'f',则输出 1;否则,输出 0
%
% 如果被除式为 0,则返回 true (1)
if isempty(find(f,'1'))
b = true;
return;
end
% 去除高次的 0 系数
pos = find(f=='1',1);
f = f(pos:length(f));
len_f = length(f);
% 检查除式是否为零
if isempty(find(g=='1'))
error('Error: f is divided by 0')
end
% 去除高次的 0 系数
pos = find(g=='1',1);
g = g(pos:length(g));
len_g = length(g);
% 若被除式的次数小于除式的次数,返回不可整除
b = false;
if len_f < len_g
return;
end
% 除法
for i = 1:len_f-len_g+1
if f(i) == '0'
continue;
end
for j=1:len_g
if f(i+j-1) == g(j)
f(i+j-1) = '0';
else
f(i+j-1) = '1';
end
end
end
% 检查余式是否为 0
b = true;
for i=len_f-len_g+1:len_f
if f(i) == '1'
b = false;
break;
end
end

end


例:判断在 GF(2) 上多项式 x3+x2+x+1 和 x3+1 能否被多项式 x2+1 整除.

>> isDivisible('1111','101')

ans =

1

>> isDivisible('1001','101')

ans =

0


注:在Matlab中,函数 dec2bin 和 bin2dec 分别将一个整数转化为’01’字符数组和将一个’01’字符数组转化为整数. 利用前一个函数,我们可以用整数来表示 GF(2) 上的多项式,并把上面函数的输入类型改为两个整数;后一个函数将在下一节使用.

4 计算 GF(2) 上的不可约多项式

下面的 Matlab 函数计算所有 GF(2) 上次数不超过 n 次的不可约多项式.

function [IrrPolys,Nums] = AllIrrPolys(n)
% 计算二元域 GF(2) 上所有次数不超过 'n' 的不可约多项式
% 输入
% n: 多项式的次数
% 输出
% IrrPolys: 所有次数不超过 'n' 的不可约多项式
% Nums: 各次的不可约多项式的个数
%
Nums = zeros(1,n); % '1' 至 'n' 次不可约多项式的个数
% '1' 次不可约多项式
IrrPolys = [bin2dec('10'),bin2dec('11')];
Nums(1) = 2;
total_num = 2;
% '2' 至 'n' 次不可约多项式
for d = 2:n
cnt = 0;
for k = (2^d+1):2:(2^(d+1)-1)
isDiv = false;
for s = 1:floor(d/2)
off_set = sum(Nums(1:s-1));
for t = 1:Nums(s)
isDiv = isDivisible(dec2bin(k),dec2bin(IrrPolys(off_set+t)));
if isDiv
break;
end
end
if isDiv
break;
end
end
if ~isDiv
total_num = total_num + 1;
IrrPolys(total_num) = k;
cnt = cnt + 1;
end
end
Nums(d) = cnt;
end

end


注1:在函数中,GF(2) 上的多项式用其对应的正整数来表示.

注2:所有不可约多项式都保存在数组 IrrPolys 中. 可用命令 IrrPolys(sum(Nums(1:k-1))+1:sum(Nums(1:k))) 列出所有次数为 k 的不可约多项式.

注3: GF(2) 的 n 次不可约多项式的个数为

N(n)=1n∑d|nμ(d)2n/d

其中 μ 为Moebius函数,定义为

μ(m)=⎧⎩⎨1(−1)k0如果m=1如果m=p1p2⋯pk,其中p1,p2,…,pk为互不相同的素数其它

例:计算所有 GF(2) 上次数不超过 5 次的不可约多项式,并列出所有 4 次不可约多项式.

>> [IrrPolys,Nums] = AllIrrPolys(5)

IrrPolys =

Columns 1 through 13

2 3 7 11 13 19 25 31 37 41 47 55 59

Column 14

61

Nums =

2 1 2 3 6

>> IrrPolys(sum(Nums(1:4-1))+1:sum(Nums(1:4)))

ans =

19 25 31
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息