ошибка при вызове функций в sage

ребята, при вызове первой функции как SAES_ToStateMatrix([0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15]) это дает мне

[a^3 + a a^3 + a]
[a^3 + a a^3 + a]

но при передаче вывода как SAES_FromStateMatrix([[a^3 + a a^3 + a],[a^3 + a a^3 + a]]) появилась ошибка " invalid syntax " так как избежать этой ошибки

вот мой код

F = GF(2);
L.<a> = GF(2^4);
V = L.vector_space();
VF8 = VectorSpace(F, 8);

def SAES_ToStateMatrix(block):
    r"""
    Converts a bit list into an SAES State Matrix
    """
    B = block;

    # form the plaintext block into a matrix of GF(2^n) elements
    S00 = L(V([B[0], B[1], B[2], B[3]]));
    S01 = L(V([B[4], B[5], B[6], B[7]]));
    S10 = L(V([B[8], B[9], B[10], B[11]]));
    S11 = L(V([B[12], B[13], B[14], B[15]]));

    state_matrix = Matrix(L, [[S00,S01],[S10,S11]]);

    return state_matrix;

def SAES_FromStateMatrix(state_matrix):
    r"""
    Converts an SAES state_matrix to a bit list.
    """

    output = [];

    # convert state matrix back into bit list
    for r in xrange(2):
        for c in xrange(2):
            v = V(state_matrix[r,c]);
            for j in xrange(4):
                output.append(Integer(v[j]));

    return output;

person noazet abdo    schedule 26.10.2013    source источник
comment
Это настоящий отступ вашего кода?   -  person aIKid    schedule 26.10.2013
comment
a a в a^3 + a a^3 + a не является допустимым выражением Python, это причина вашей синтаксической ошибки.   -  person Lukas Graf    schedule 26.10.2013
comment
да, это настоящий ... любая помощь?   -  person noazet abdo    schedule 26.10.2013
comment
@ Лукас Графит: написано в шалфее (математическая среда)   -  person noazet abdo    schedule 26.10.2013
comment
Он все еще должен быть действительным python.   -  person Lukas Graf    schedule 26.10.2013
comment
@LukasGraf, если первая функция может вернуть это, она должна быть действительной в его среде.   -  person aIKid    schedule 26.10.2013
comment
Но да, я сомневаюсь.   -  person aIKid    schedule 26.10.2013
comment
@alKid Так и должно быть. Но это, видимо, не так. Не знаю, ошибка ли это в sage или он сделал что-то не так при реализации функции SAES_ToStateMatrix.   -  person Lukas Graf    schedule 26.10.2013
comment
@noazetabdo: можете ли вы предоставить полную трассировку?   -  person aIKid    schedule 26.10.2013
comment
Итак, @noazetabdo, когда вы говорите it gives me.., что именно вы имеете в виду? Судя по коду, функция SAES_ToStateMatrix() должна возвращать экземпляр Matrix(). Таким образом, [a^3 + a a^3 + a] [a^3 + a a^3 + a], вероятно, является строковым представлением (в математической нотации) этой матрицы, но не должно быть выражением Python. Так что передайте фактический матричный объект.   -  person Lukas Graf    schedule 26.10.2013
comment
@noazetabdo Было бы очень полезно, если бы вы предоставили полный код, особенно ту часть, где вы вызываете эти две функции, с фактическими значениями и передадите результат от одной в качестве входных данных другой.   -  person Lukas Graf    schedule 26.10.2013
comment
О, и @alKid прав насчет отступа. Если код действительно имеет такой отступ, все, что находится ниже комментария # convert state matrix..., больше не будет частью функции SAES_FromStateMatrix.   -  person Lukas Graf    schedule 26.10.2013


Ответы (1)


Мне кажется, вы запутались в строковом представлении объекта и самом объекте.

Короче: передайте фактический результат функции, а не его строковое представление:

mat = SAES_ToStateMatrix([0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15])
SAES_FromStateMatrix(mat)

Объяснение

Когда вы вводите что-то в интерактивный интерпретатор Python (которым является среда sage, а также некоторые другие математические навороты), он оценивает введенное вами выражение Python и печатает строковое представление результата на приставка.

Так, например, если вы создаете словарь и просто вводите его имя, Python печатает строковое представление этого словаря:

>>> d = dict(foo=1, bar=2)
>>> d
{'foo': 1, 'bar': 2}

Это также называется циклом чтения-оценки-печати (REPL).

Теперь для словаря его строковое представление оказывается точно таким же, как и синтаксис литерального определения словаря ({key: value, ...}. Подробнее о литералах см. ниже).

Однако это справедливо не для всех объектов. Для распространенных типов Python принято, что их строковое представление является чем-то, что при оценке в интерпретаторе Python воссоздает объект с тем же состоянием. Но это всего лишь соглашение, на которое нельзя положиться, и это просто невозможно для более сложных объектов. Например:

>>> class Foobar(object):
...     def __init__(self):
...         self.attr = 'foo'
...
>>> f = Foobar()
>>> f
<__main__.Foobar object at 0x109ee7750>

Здесь строковое представление экземпляров класса Foobar равно <scope.Foobar object at memory_address>. Что является строковым представлением по умолчанию для объектов.

Можно определить строковое представление, определив метод __repr__:

>>> class Foobar(object):
...     def __init__(self, value):
...         self.value = value
...     def __repr__(self):
...         return '<Foobar instance with value=%s>' % self.value
...
>>> f = Foobar(42)
>>> f
<Foobar instance with value=42>

Итак, вы видите, __repr__ может возвращать что угодно - может быть допустимым выражением Python для воссоздания этого объекта или нет:

Для многих типов эта функция пытается вернуть строку, которая дала бы объект с тем же значением при передаче в eval(), в противном случае представление представляет собой строку, заключенную в угловые скобки, содержащую имя типа объекта вместе с дополнительными информация, часто включающая название и адрес объекта.

Литералы

Для некоторых примитивных типов существуют так называемые литералы (специальные символы), которые являются способами (встроенными в синтаксис языка) для выражения общих типов данных.

Например:

Диктофоны

Форма для создания словаря с помощью конструктора dict():

>>> dict(foo=1, bar=2)

Форма для создания словаря с использованием литералов { и }:

>>> {'foo': 1, 'bar': 2}

Списки

>>> list((1, 2, 3))

против использования литералов [ и ]:

>>> [1, 2, 3]

Мнимые числа

>>> 3.14j

Плавающие

>>> 3.14e-10

Итак, если вы снова введете {'foo': 1, 'bar': 2} в интерпретатор и получите обратно dict, это сработает, потому что строковое представление словаря точно такое же, как буквальная форма для определения словаря.

Матрица мудреца

Теперь, в случае класса Matrix мудреца, похоже, что строковое представление представляет собой некоторую математическую нотацию матрицы, но это не допустимое выражение Python. Как это могло произойти? a не определен там, где речь идет о Python, поэтому, даже если бы это не было связано с недопустимым синтаксисом, ввод чего-то вроде [a^3 + a a^3 + a] в Python вызовет NameError, если только a не было ранее определено с фактическим значением. Таким образом, вы также не можете вводить в Python алгебраические формулы, такие как x = 2 * y, без фактического определения y.

Что вам нужно сделать, так это передать фактическое возвращаемое значение SAES_ToStateMatrix(lst) в SAES_FromStateMatrix(). Например, сначала сохранив его во временной переменной:

mat = SAES_ToStateMatrix([0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15])
SAES_FromStateMatrix(mat)

или передача результата функции напрямую, работает так же хорошо:

SAES_FromStateMatrix(SAES_ToStateMatrix([0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15]))
person Lukas Graf    schedule 26.10.2013