圣人语法 A.<x>

sage syntax A.<x>

sage 中,我可以在变量 x 的字段上创建一个 PolynomialRing,如下所示:

A.<x> = PolynomialRing(GF(2))

如图doc.

我的问题纯粹是语法问题:A.<x> 是什么?在普通的 python 这将是无效的语法(对吗?)?是否有关联的 __something__ 函数被调用?或者这里发生了什么?所有这些如何分配给 A(和 x)?

反汇编得到:

sage: from dis import dis
sage: def f():
....:     A.<x> = PolynomialRing(GF(2))
....:     return A
....: 
sage: dis(f)
  2           0 LOAD_GLOBAL              0 (PolynomialRing)
              3 LOAD_GLOBAL              1 (GF)
              6 LOAD_GLOBAL              2 (Integer)
              9 LOAD_CONST               1 (2)
             12 CALL_FUNCTION            1
             15 CALL_FUNCTION            1
             18 LOAD_CONST               2 ('names')
             21 LOAD_CONST               5 (('x',))
             24 CALL_FUNCTION          257
             27 STORE_FAST               0 (A)
             30 LOAD_FAST                0 (A)
             33 LOAD_ATTR                3 (_first_ngens)
             36 LOAD_CONST               4 (1)
             39 CALL_FUNCTION            1
             42 UNPACK_SEQUENCE          1
             45 STORE_FAST               1 (x)

  3          48 LOAD_FAST                0 (A)
             51 RETURN_VALUE        

括号是否调用 _first_ngens

Here is an example of the syntax you need:

sage: preparse("A.<x> = PolynomialRing(GF(2))")
"A = PolynomialRing(GF(Integer(2)), names=('x',)); (x,) = A._first_ngens(1)"

为了详细说明,Sage 内置了一个预解析器,该预解析器采用数学上有意义的无效 Python 输入并给出有效 Python。实际上,即使您不认为它存在,它也存在很多:

sage: preparse("2+2")
'Integer(2)+Integer(2)'

所以算法是 Sage 任意精度 Integers,而不是 Python ints。最著名的例子可能是

sage: preparse("f(x)=x^2")
'__tmp__=var("x"); f = symbolic_expression(x**Integer(2)).function(x)'

这看起来有点疯狂,但使我们能够使用 "normal" 数学符号来定义符号函数,但是它们不是 def Python 以相同方式定义的函数。

(最后,关于为什么该语法在您的原始示例中有效,显然历史表明这也是 Magma 的语法。)