PARI/GP中matsolve方法可能存在bug



当我给matsolve(M, B)方法的矩阵大小不足时,我采取了分割错误而不是警告。

*** matsolve: bug in PARI/GP (Segmentation Fault), please report.

用正确的矩阵大小,我得到了错误的结果。下面是我的测试代码:

{
w = ffgen(w^7 + w^2 + Mod(2,3)*w + Mod(1,3));
info = [
2*w^6 + 2*w^5 + 2*w^4 + 2*w^3 + 2*w^2 + w, w^6 + w^5 + w^4 + 2*w^2 + 2;
w^4 + w^3 + 2*w^2 + w + 1, w^6 + 2*w^5 + 2*w^4 + w^3 + 2*w^2;
2*w^6 + w^5 + w^4 + w^3 + 2, 2*w^5 + 2*w^4 + 2*w^3 + 2*w + 2;
w^5 + w^3 + 2*w^2 + w, w^6 + 2*w^5 + 2*w^4 + 2*w^3 + w^2 + 1;
w^3 + w^2 + 2*w + 1, 2*w^6 + w^5 + 2*w^3 + w;
2*w^6 + 2*w^5 + w^4 + 2*w^3 + 2*w + 2, w^6 + 2*w^4 + 2*w^2 + 1;
w^6 + 2*w^5 + 2*w^4 + 2*w^3 + 2*w^2 + 2*w + 1, w^6 + 2*w^4 + 2*w^3 + w^2 + w + 1
];
result = [
w^6 + 2*w^5 + w^3 + 2*w;
2*w^6 + w^2 + w;
w^4 + 2*w^2 + 2*w + 2;
2*w^6 + 2*w^5 + w^4 + w^3 + 2*w^2;
2*w^5 + w^4 + w;
w^5 + 2*w^2 + w + 2;
2*w^6 + w^5 + 2*w^4 + 2*w^3 + 2*w^2 + w
];
\ lamda * info = result
lamda = matsolve(info, result);
calculated_result = mattranspose(mattranspose(lamda) *
mattranspose(info));
}

输出为:

? result
[                w^6 + 2*w^5 + w^3 + 2*w]
[                        2*w^6 + w^2 + w]
[                  w^4 + 2*w^2 + 2*w + 2]
[      2*w^6 + 2*w^5 + w^4 + w^3 + 2*w^2]
[                        2*w^5 + w^4 + w]
[                    w^5 + 2*w^2 + w + 2]
[2*w^6 + w^5 + 2*w^4 + 2*w^3 + 2*w^2 + w]
? calculated_result
[              w^6 + 2*w^5 + w^3 + 2*w]
[                      2*w^6 + w^2 + w]
[    2*w^5 + w^4 + w^3 + w^2 + 2*w + 2]
[w^6 + w^5 + 2*w^4 + 2*w^3 + 2*w^2 + w]
[      w^6 + w^4 + w^3 + w^2 + 2*w + 1]
[        2*w^4 + 2*w^3 + w^2 + 2*w + 1]
[                  2*w^4 + w^3 + w + 1]

只有前两行结果相同,其余的不同。我猜,对于给定的info(n x k)和result(k x 1)矩阵,GP忽略info矩阵的最后(n - k)行。

注意,你的线性方程组不一致。没有解决办法。只需检查增广矩阵的秩:

augmented = matconcat([info, result]);
matrank(info) == matrank(augmented)
> 0

matsolve的帮助信息说:

M为左可逆矩阵,B为列向量,使得线性方程组MX = B;存在一个解X,并返回(唯一)解X。& lt;……比;当没有解时,函数返回一个X,使得MX - B不为零,尽管它至少有#M个零项<…>

所以你的例子没有bug。

相关内容

  • 没有找到相关文章

最新更新