AttributeError в Sage в списке вызовов () - PullRequest
2 голосов
/ 13 апреля 2019

У меня была проблема с ошибкой в ​​Sage (я просто не могу найти способ ее решить)

Вот код

nb = 8
varl = [ c + str( p ) for c in 'xyz' for p in range(nb)]
B = BooleanPolynomialRing ( names = varl )
B.inject_variables ()
P.<p> = PolynomialRing ( B )
Byte.<t> = P.quotient_ring ( p^8 + p^4 + p^3 + p + 1)
X = B.gens()[: nb ]
Y = B.gens()[ nb :2*nb ]
x = sum ([ X [ j ]*t^j for j in range(nb)])
y = sum ([ Y [ j ]*t^j for j in range(nb)])

E3 = x*y
ep3 = E3.list()
latex(ep3)

и вывод

Defining x0, x1, x2, x3, x4, x5, x6, x7, y0, y1, y2, y3, y4, y5, y6, y7, z0, z1, z2, z3, z4, z5, z6, z7
Error in lines 12-12
Traceback (most recent call last):
  File "/cocalc/lib/python2.7/site-packages/smc_sagews/sage_server.py", line 1188, in execute
    flags=compile_flags) in namespace, locals
  File "", line 1, in <module>
  File "sage/structure/element.pyx", line 489, in sage.structure.element.Element.__getattr__ (build/cythonized/sage/structure/element.c:4611)
    return self.getattr_from_category(name)
  File "sage/structure/element.pyx", line 502, in sage.structure.element.Element.getattr_from_category (build/cythonized/sage/structure/element.c:4720)
    return getattr_from_other_class(self, cls, name)
  File "sage/cpython/getattr.pyx", line 389, in sage.cpython.getattr.getattr_from_other_class (build/cythonized/sage/cpython/getattr.c:2540)
    raise AttributeError(dummy_error_message)
AttributeError: 'QuotientRing_generic_with_category.element_class' object has no attribute 'list'

Я не понимаю, почему это не работает. Я пытался сделать это на cocalc.com, а также в настольной версии Sage, но это не сработало.

1 Ответ

1 голос
/ 13 апреля 2019

К сожалению, E3.list() не работает. Может быть, раньше в Sage 6.7 вышла упомянутая статья, но сейчас нет. Должно работать следующее: держите все, что у вас есть, включая E3 = x*y. На данный момент E3 равно

x7*y7*t^14 + (x6*y7 + x7*y6)*t^13 + (x5*y7 + x6*y6 + x7*y5)*t^12 + (x4*y7 + x5*y6 + x6*y5 + x7*y4)*t^11 + (x3*y7 + x4*y6 + x5*y5 + x6*y4 + x7*y3)*t^10 + (x2*y7 + x3*y6 + x4*y5 + x5*y4 + x6*y3 + x7*y2)*t^9 + (x1*y7 + x2*y6 + x3*y5 + x4*y4 + x5*y3 + x6*y2 + x7*y1)*t^8 + (x0*y7 + x1*y6 + x2*y5 + x3*y4 + x4*y3 + x5*y2 + x6*y1 + x7*y0)*t^7 + (x0*y6 + x1*y5 + x2*y4 + x3*y3 + x4*y2 + x5*y1 + x6*y0)*t^6 + (x0*y5 + x1*y4 + x2*y3 + x3*y2 + x4*y1 + x5*y0)*t^5 + (x0*y4 + x1*y3 + x2*y2 + x3*y1 + x4*y0)*t^4 + (x0*y3 + x1*y2 + x2*y1 + x3*y0)*t^3 + (x0*y2 + x1*y1 + x2*y0)*t^2 + (x0*y1 + x1*y0)*t + x0*y0

Итак, сделайте:

E3L = E3.lift()
[E3L.monomial_coefficient(_) for _ in E3L.monomials()]

Это возвращает

[x7*y7,
 x6*y7 + x7*y6,
 x5*y7 + x6*y6 + x7*y5,
 x4*y7 + x5*y6 + x6*y5 + x7*y4,
 x3*y7 + x4*y6 + x5*y5 + x6*y4 + x7*y3,
 x2*y7 + x3*y6 + x4*y5 + x5*y4 + x6*y3 + x7*y2,
 x1*y7 + x2*y6 + x3*y5 + x4*y4 + x5*y3 + x6*y2 + x7*y1,
 x0*y7 + x1*y6 + x2*y5 + x3*y4 + x4*y3 + x5*y2 + x6*y1 + x7*y0,
 x0*y6 + x1*y5 + x2*y4 + x3*y3 + x4*y2 + x5*y1 + x6*y0,
 x0*y5 + x1*y4 + x2*y3 + x3*y2 + x4*y1 + x5*y0,
 x0*y4 + x1*y3 + x2*y2 + x3*y1 + x4*y0,
 x0*y3 + x1*y2 + x2*y1 + x3*y0,
 x0*y2 + x1*y1 + x2*y0,
 x0*y1 + x1*y0,
 x0*y0]

Вы также можете сделать latex(...) примененным ко всему, или вы можете сделать

[latex(E3L.monomial_coefficient(_)) for _ in E3L.monomials()]

чтобы получить список выражений LaTeX для коэффициентов.

В качестве альтернативы:

E3L = E3.lift()
E3L.list()

создает список коэффициентов, но в порядке увеличения, а не уменьшения: возвращает

[x0*y0,
 x0*y1 + x1*y0,
 x0*y2 + x1*y1 + x2*y0,
 x0*y3 + x1*y2 + x2*y1 + x3*y0,
 x0*y4 + x1*y3 + x2*y2 + x3*y1 + x4*y0,
 x0*y5 + x1*y4 + x2*y3 + x3*y2 + x4*y1 + x5*y0,
 x0*y6 + x1*y5 + x2*y4 + x3*y3 + x4*y2 + x5*y1 + x6*y0,
 x0*y7 + x1*y6 + x2*y5 + x3*y4 + x4*y3 + x5*y2 + x6*y1 + x7*y0,
 x1*y7 + x2*y6 + x3*y5 + x4*y4 + x5*y3 + x6*y2 + x7*y1,
 x2*y7 + x3*y6 + x4*y5 + x5*y4 + x6*y3 + x7*y2,
 x3*y7 + x4*y6 + x5*y5 + x6*y4 + x7*y3,
 x4*y7 + x5*y6 + x6*y5 + x7*y4,
 x5*y7 + x6*y6 + x7*y5,
 x6*y7 + x7*y6,
 x7*y7]
...