Синтаксис мудреца А. <x> - PullRequest
0 голосов
/ 29 октября 2018

in sage я могу создать PolynomialRing над полем в переменной x, например:

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

как показано в документ .

Мой вопрос здесь чисто о синтаксисе: что такое A.<x>? в простом питоне это будет неверный синтаксис (верно?)? и есть ли связанная __something__ функция, которая вызывается? или что здесь происходит? как все это присвоение Ax)?

разборка дает:

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?

1 Ответ

0 голосов
/ 30 октября 2018

Вот пример синтаксиса, который вам нужен :

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 с, а не с Python int с. Самый известный пример, вероятно,

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

, который выглядит немного сумасшедшим, но позволяет нам использовать "нормальные" математические обозначения для определения символических функций, которые, однако, не являются def функциями Python таким же образом.

(Наконец, что касается того, почему этот синтаксис работает в вашем исходном примере, очевидно, история состоит в том, что это также синтаксис Магмы.)

...