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

来源:互联网 发布:谌洪果 知无知 编辑:程序博客网 时间:2024/05/29 19:57

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

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

加法:+ 0 1 0 0 1 1 1 0 乘法: 0 1 0 0 0 1 0 1

二元域 GF(2) 上的多项式具有形式

p(x)=anxn+an1xn1++a1x+a0

其中,aiGF(2), 0in.

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

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

检查 GF(2) 上的多项式是否可约:p(x)=anxn+an1xn1++a1x+a0n 次多项式.
(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+an1xn1++a1x+a0

可以表示为一个 GF(2) 上的 n+1 维向量
P=(an,an1,,a1,a0)GFn+1(2)

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

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

(an,an1,,a1,a0)i=0nai2i

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

p(x)=i=0naixip(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    endend% 检查余式是否为 0b = true;for i=len_f-len_g+1:len_f    if f(i) == '1'        b = false;        break;    endendend

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

>> isDivisible('1111','101')ans = 1>> isDivisible('1001','101')ans = 0

注:在Matlab中,函数 dec2binbin2dec 分别将一个整数转化为’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;endend

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

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

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

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

其中 μ 为Moebius函数,定义为
μ(m)=1(1)k0m=1m=p1p2pk,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 1461Nums = 2 1 2 3 6>> IrrPolys(sum(Nums(1:4-1))+1:sum(Nums(1:4)))ans =19 25 31
3 0