我对 SageMath(部分基于 Python 的数学软件系统)有以下相当奇怪的问题。也许应该提到的是,这个问题似乎与一些特定的 SageMath 库(处理排列和李代数)有关。这是由于某种原因无法编译的代码部分:
gl = lie_algebras.gl(QQ, 4)
Ugl = gl.pbw_basis()
E = matrix(Ugl, 4, 4, Ugl.gens())
for sigma in Permutations(4):
for tau in Permutations(4):
pr = sigma.signature() * tau.signature()
for i in range(4):
pr = pr * E[sigma[i] - 1, tau[i] - 1]
有趣的是,虽然上面的代码不能很好地工作,但只需添加“1 *”即可解决问题,如下所示:
gl = lie_algebras.gl(QQ, 4)
Ugl = gl.pbw_basis()
E = matrix(Ugl, 4, 4, Ugl.gens())
for sigma in Permutations(4):
for tau in Permutations(4):
pr = sigma.signature() * tau.signature()
for i in range(4):
pr = 1 * pr * E[sigma[i] - 1, tau[i] - 1]
我的实验表明,SageMath 函数
signature()
存在一些问题,因为如果我将行 pr = sigma.signature() * tau.signature()
替换为 pr = 1
,那么两个版本都会成功编译。第一个摘录的错误消息的最后一块如下:
/usr/lib/python3/dist-packages/sage/algebras/lie_algebras/poincare_birkhoff_witt.py in _act_on_(self, x, self_on_left)
513 # Try the _acted_upon_ first as it might have a direct PBW action
514 # implemented that is faster
--> 515 ret = x._acted_upon_(self, not self_on_left)
516 if ret is not None:
517 return ret
AttributeError: 'int' object has no attribute '_acted_upon_'
因此,整数对李代数元素的作用可能会发生一些奇怪的事情(某些与类型相关的问题?)。
当然,由于第二个版本有效,我可以继续,但它看起来很奇怪,我真的很想了解这个错误的根源(以避免将来出现类似的错误)。
根本问题是 Sage 中有两种类型的整数:Python 的
int
和 Sage 的 Integer
。后者对于 Sage 中完成的大部分算术来说更好,但由于某种原因,sigma.signature()
返回一个 int
。将 int
乘以 Integer
(如 1
)会自动将结果转换为 Integer
,这就是第二个示例有效的原因。您还可以通过显式将 pr
转换为整数来解决此问题:
pr = Integer(sigma.signature() * tau.signature())
事实上,有些事情对我来说很奇怪,因为
signature
方法的签名说
Signature: s.signature() -> 'Integer'
所以它应该返回一个
Integer
。对我来说这看起来像是一个错误,否则编写代码的人都认为在签名中指定返回类型会强制该方法返回该类型,但我认为它不会那样工作。