请教伽罗华域矩阵求逆

langren919 2011-03-31 05:07:25
最近在学Raptor码,里面有一个矩阵求逆的过程,是在伽罗华域里进行的,做纠错码的朋友肯定很熟悉,伽罗华域的元操作是异或,我将清华大学出版《C语言常用算法程序集》第二版这本书里的矩阵求逆改了一下,这本书有随书的源代码,我改为如下:

int brinv(int **a,int n) //a对应矩阵二维矩阵A,n是矩阵的维数L ,计算A的逆
{
int *is,*js,i,j,k;
int d,p;
is=malloc(n*sizeof(int));
js=malloc(n*sizeof(int));
for (k=0; k<=n-1; k++)
{
d=0;
for (i=k; i<=n-1; i++)
for (j=k; j<=n-1; j++)
{
p=a[i][j];
if (p>d) { d=p; is[k]=i; js[k]=j;}
}
if (d+1==1)
{
free(is); free(js); printf("err**not inv\n");
return(1);
}
if (is[k]!=k)
for (j=0; j<=n-1; j++)
{
p=a[k][j]; a[k][j]=a[is[k]][j]; a[is[k]][j]=p;
}
if (js[k]!=k)
for (i=0; i<=n-1; i++)
{
p=a[i][k]; a[i][k]=a[i][js[k]]; a[i][js[k]]=p;
}
a[k][k]=a[k][k];
for (j=0; j<=n-1; j++)
if (j!=k)
{ a[k][j]=a[k][j]*a[k][k];}
for (i=0; i<=n-1; i++)
if (i!=k)
for (j=0; j<=n-1; j++)
if (j!=k)
{
a[i][j]=a[i][j]^(a[i][k]*a[k][j]);
}
for (i=0; i<=n-1; i++)
if (i!=k)
{ a[i][k]=a[i][k]*a[k][k];}
}
for (k=n-1; k>=0; k--)
{ if (js[k]!=k)
for (j=0; j<=n-1; j++)
{
p=a[k][j]; a[k][j]=a[js[k]][j]; a[js[k]][j]=p;
}
if (is[k]!=k)
for (i=0; i<=n-1; i++)
{
p=a[i][k]; a[i][k]=a[i][is[k]]; a[i][is[k]]=p;
}
}
free(is); free(js);
return 0;
}


这个程序能正确算出一部分的矩阵求逆,但是矩阵的维数超过一定的数量的时候,计算出的结果就不对了,恳请各位大侠指教,万分感谢!
...全文
596 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
langren919 2011-04-03
  • 打赏
  • 举报
回复 1
已经知道怎么做了,这里的程序没有问题,是我在其他地方出错了,要是需要伽罗华域矩阵求逆的话,上面的程序可以完全采用
langren919 2011-04-01
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 fancymouse 的回复:]

正常计算机里用的有限域都是阶为2^n的。这情况下域加法就是xor,域乘法虽说是*,但是如果乘出2^n来的话,要用域的分割多项式把它xor掉。没弄过代数的话这个估计有些难理解……
[/Quote]
我这里仅仅是GF(2),使用0和1,矩阵中只有0,1,也就是说,矩阵中只有0和1进行相乘,想请假请教,我该怎么改呢?
FancyMouse 2011-03-31
  • 打赏
  • 举报
回复
正常计算机里用的有限域都是阶为2^n的。这情况下域加法就是xor,域乘法虽说是*,但是如果乘出2^n来的话,要用域的分割多项式把它xor掉。没弄过代数的话这个估计有些难理解……
ctrigger 2011-03-31
  • 打赏
  • 举报
回复
没搞过数学,关注一下。。牛人答题。

69,382

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧