用Matlab计算二元域GF(2)上的不可约多项式
2016-02-10 00:30
776 查看
1 二元域 GF(2) 上的不可约多项式
二元域 GF(2)={0,1} 上的运算规则如下:加法:+ | 0 | 1 |
---|---|---|
0 | 0 | 1 |
1 | 1 | 0 |
乘法:⋅ | 0 | 1 |
---|---|---|
0 | 0 | 0 |
1 | 0 | 1 |
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
相关文章推荐
- [Android]在代码里运行另一个程序的方法
- DB2编程序技巧(1)
- DB2编程序技巧 (四)
- DB2编程序技巧 (六)
- DB2编程序技巧 (三)
- DB2编程序技巧 (九)
- DB2编程序技巧 (七)
- DB2编程序小小技巧
- DB2编程序技巧 (五)
- 二级域名原理以及程序
- DB2编程序技巧 (一)
- DB2编程序技巧 (八)
- DB2编程序技巧 (十)
- 如何隐藏程序的运行
- C#列出当前系统所有正在运行程序的方法
- 纯真、珊瑚虫文本IP数据库转成mdb 程序 提供下载
- 数据库性能优化三:程序操作优化提升性能
- C#实现强制关闭当前程序进程
- 一个用vbs查找硬盘所有分区中的指定程序的代码
- 一个域名查询的程序