在鼠尾草中定义功能的不同方法

时间:2019-03-01 09:58:58

标签: python sage

我想知道为什么这两个“程序”产生不同的输出

    f(x)=x^2
    f(90).mod(7)

    def f(x):
        return(x^2)
    f(90).mod(7)

谢谢

1 个答案:

答案 0 :(得分:1)

好问题!让我们更深入地研究有问题的功能。

f(x)=x^2
def g(x):
    return(x^2)

print type(g(90))
print type(f(90))

这产生

<type 'sage.rings.integer.Integer'>
<type 'sage.symbolic.expression.Expression'>

因此,您看到的是使用f(x)表示法定义的 symbolic 函数和使用def关键字的 Python 函数之间的区别。在Sage中,前者可以访问很多普通Sage整数所没有的东西(例如微积分)。

在这种情况下,我为您推荐的是

sage: a = f(90)
sage: ZZ(a).mod(7)
1

或者实际上可能更强大

sage: mod(a,7)
1

更长的解释。

对于符号性内容,mod不是您想的。实际上,我不确定它会做任何事情(不过,请参阅mod的文档以了解如何将其用于理想情况下的多项式模块化工作)。这是代码(可通过x.mod??访问,可通过x.mod?访问文档):

    from sage.rings.ideal import is_Ideal
    if not is_Ideal(I) or not I.ring() is self._parent:
        I = self._parent.ideal(I)
        #raise TypeError, "I = %s must be an ideal in %s"%(I, self.parent())
    return I.reduce(self)

事实证明,对于通用环(如符号“环”),在最后一步没有任何反应:

return f 

这就是为什么我们需要以另一种方式要求它再次成为整数。参见Trac 27401