圣人语法 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 任意精度 Integer
s,而不是 Python int
s。最著名的例子可能是
sage: preparse("f(x)=x^2")
'__tmp__=var("x"); f = symbolic_expression(x**Integer(2)).function(x)'
这看起来有点疯狂,但使我们能够使用 "normal" 数学符号来定义符号函数,但是它们不是 def
Python 以相同方式定义的函数。
(最后,关于为什么该语法在您的原始示例中有效,显然历史表明这也是 Magma 的语法。)
在 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 任意精度 Integer
s,而不是 Python int
s。最著名的例子可能是
sage: preparse("f(x)=x^2")
'__tmp__=var("x"); f = symbolic_expression(x**Integer(2)).function(x)'
这看起来有点疯狂,但使我们能够使用 "normal" 数学符号来定义符号函数,但是它们不是 def
Python 以相同方式定义的函数。
(最后,关于为什么该语法在您的原始示例中有效,显然历史表明这也是 Magma 的语法。)