我想编写一个函数来给出关于两个输入多项式的 lex 阶的 Groebner 基,但是变量的数量是由输入给出的,而不是先验的。准确地说,我从以下开始:
GBoftwo:=proc(f,g,Var)
其中 Var 是变量列表,例如输入可以是 GBoftwo(x^2+y,x+z^2,[x,y,z])。 那么整个代码可能是:
GBoftwo:=proc(f,g,Var)
with(Groebner);
local F, n;
F:=[f,g];
n:=nops(Var);
retern Basis(F,plex(Var[1],...,Var[n]))
end proc;
然后错误提示说:错误,无法解析。
如何克服这个问题?
谢谢!
我没有用任何方法搞清楚,不知道是不是Basis命令的缺陷。
您收到错误消息是因为您将
return
拼写为 retern
。所以你有一个语法错误。
您无法在程序中正确使用
with
。
您应该取消引用全局名称
plex
,因为它不是受保护的名称,可以在顶层分配一些值。
你不需要
n
,因为op(Var)
提供了列表Var
的元素的表达式序列。
restart;
GBoftwo:=proc(f,g,Var::list(name))
uses Groebner;
local F:=[f,g];
return Basis(F,':-plex'(op(Var)))
end proc:
GBoftwo(x^2+y,x+z^2,[x,y,z])
[ 4 2 ]
[z + y, z + x]
GBoftwo(x^2+y,x+z^2,[y,x,z])
[ 2 4 ]
[z + x, z + y]
注意:示例过程非常简单,可以进一步简化为一行(此时它几乎不能节省时间;您可以轻松地直接调用
Basis
)。因此,我认为您正在练习/学习,这只是一个编程实验。
restart;
GBoftwo:=proc(f,g,Var::list(name))
Groebner:-Basis([f,g],':-plex'(op(Var)))
end proc:
GBoftwo(x^2+y,x+z^2,[x,y,z])
[ 4 2 ]
[z + y, z + x]
with(Groebner):
# and now, just a few characters longer...
Basis([x^2+y,x+z^2],plex(x,y,z))
[ 4 2 ]
[z + y, z + x]