Octave:对一组

时间:2018-03-04 14:10:49

标签: matrix octave gnu

我想简单地计算两个矩阵的乘法。

但是我想在矩阵中使用有限群的元素而不是实数。 即我想使用F4 = {0,1,x,1 + x}的元素(所以我只有4个可能的元素)。在这个组中,加法和乘法是明确定义的,关系x ^ 2 = 1 + x,1 + 1 = 0和x + x = 0成立。

由于我是Octave编程的初学者,我不知道如何用不同于实数的东西来计算操作。

我的想法是,如果可以在某组元素上定义一些操作(这里是F4),那么在乘法矩阵时可能会使用这些操作。

2 个答案:

答案 0 :(得分:1)

我认为使用有限的一组可能值和非标准加法和乘法进行算术运算的最有效方法是通过表查找。

表查找要求对矩阵进行编码,使得元素是组元素列表中的索引。因为索引从1开始,所以你需要将{0,1,x,x + 1}表示为{1,2,3,4}。

但是除了1 = 0,2 = 1的笨拙映射外,使用表查找的事情非常简单。这是我编写的一些示例代码,它似乎工作但我可能犯了一些错误(我可能误解了确切的算术规则):

function out = group_mtimes(lhs,rhs)
[I,K] = size(lhs);
[K2,J] = size(rhs);
if K~=K2, error('Inner dimensions must agree'), end

out = zeros(I,J);
for j=1:J
   for i=1:I
      v = 1;
      for k=1:K
         v = group_scalar_add(v, group_scalar_times(lhs(i,k),rhs(k,j)));
      end
      out(i,j) = v;
   end
end

disp('lhs = ')
group_print(lhs)
disp('rhs = ')
group_print(rhs)
disp('lhs * rhs = ')
group_print(out)

end

function group_print(in)
names = {'0','1','x','1+x'};
disp(names(in)) % Quick-and-dirty, can be done much better!
end

function out = group_scalar_add(lhs,rhs)
table = [
   1,2,3,4
   2,1,4,3
   3,4,1,2
   4,3,2,1
   ];
out = table(lhs,rhs);
end

function out = group_scalar_times(lhs,rhs)
table = [
   1,1,1,1
   1,2,3,4
   1,3,4,2
   1,4,2,3
   ];
out = table(lhs,rhs);
end

例如:

>> lhs=[1,2,3,4;2,3,1,4]';
>> rhs=[2,3;4,1];
>> group_mtimes(lhs,rhs);
lhs = 
    '0'      '1'  
    '1'      'x'  
    'x'      '0'  
    '1+x'    '1+x'

rhs = 
    '1'      'x'
    '1+x'    '0'

lhs * rhs = 
    '1+x'    '0'
    '0'      'x'
    'x'      '0'
    'x'      '1'

此代码中没有输入检查,如果输入包含5,您将获得并索引超出范围错误。

正如我在评论中提到的,您可以创建一个封装此类数组的类。然后,您可以重载plustimesmtimes(分别针对运算符+.**)以及{{ 1}}正确地写出值。您将定义构造函数,以便此类的对象始终具有有效值,这将阻止查找表索引错误。这样的课程可以使这些功能更加简单。

答案 1 :(得分:1)

对于特殊情况的Galois字段的特殊情况,例如F4,您可以使用Octave Forge通信包提供的功能:

奇怪特征的伽罗瓦领域尚未实现: