如何在Pari/GP中编写n顶点路径图Pₙ的邻接矩阵通用代码?
解决Pari/GP中路径图邻接矩阵通用函数的问题
我完全懂你遇到的困扰——特定顶点数的邻接矩阵代码跑起来没问题,但改成通用函数就触发了语法错误,核心原因是你在函数里错误地用递归调用自身的方式去修改矩阵,而不是直接操作刚创建的局部矩阵。
错误原因拆解
你写的原函数代码:
path(n)=matrix(n,n,i,j);for(i=1,n-1,path(n)[i,i+1]=1);for(i=2,n,path(n)[i,i-1]=1);path(n)
这里的问题出在path(n)[i,i+1]=1这部分:它并不是在修改你刚创建的那个零矩阵,而是在递归调用path(n)函数,试图给它的返回值赋值——这在Pari/GP的语法里是不被允许的,所以会触发语法报错。
正确的实现方案
你需要先在函数内部创建一个局部矩阵变量,对这个变量直接做修改,最后返回它即可。Pari/GP里可以直接赋值创建局部变量,也可以用local()声明,下面是两种可行写法:
写法一:分步填充
path(n) = { M = matrix(n, n); // 创建n×n的初始零矩阵 for(i=1, n-1, M[i, i+1] = 1); // 填充上三角的相邻边 for(i=2, n, M[i, i-1] = 1); // 填充下三角的相邻边 M // 返回最终的邻接矩阵(Pari/GP默认返回最后一行结果) }
写法二:更紧凑的版本
可以把上下三角的填充合并成一个循环,代码更简洁:
path(n) = { M = matrix(n, n); for(i=1, n-1, M[i, i+1] = M[i+1, i] = 1); M }
额外精简技巧
如果你想让代码更紧凑,还可以直接利用矩阵构造器的判断逻辑生成:
path(n) = matrix(n, n, i, j, if(abs(i-j) == 1, 1, 0))
这个写法直接通过判断两个顶点的索引差是否为1,来设置邻接矩阵的元素,效果和上面的函数完全一致。
测试验证
调用函数试试:
- 输入
path(2),返回结果:
[0 1; 1 0]
- 输入
path(3),返回结果:
[0 1 0; 1 0 1; 0 1 0]
完全符合路径图Pₙ的邻接矩阵定义。
内容的提问来源于stack exchange,提问作者Mystery_Jay
相关产品推荐
相关产品推荐

