2

伙计们在调用第一个函数时,因为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;
4

1 回答 1

2

在我看来,您对对象的字符串表示对象本身感到困惑。

简而言之:传入函数的实际结果,而不是它的字符串表示:

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 表达式,并在控制台上打印结果的字符串表示形式。

因此,例如,如果您创建一个 dict 并输入其名称,Python 会打印该 dict 的字符串表示形式:

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

这也称为read-eval-print-loop ( 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)

{使用and}字面量创建字典的表单:

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

列表

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

与使用[and]文字相比:

>>> [1, 2, 3]

虚数

>>> 3.14j

花车

>>> 3.14e-10

因此,如果您{'foo': 1, 'bar': 2}重新输入解释器,并返回一个 dict,这是可行的,因为字典的字符串表示形式与定义字典的文字形式完全相同。

贤者矩阵

现在,在 sageMatrix类的情况下,字符串表示看起来像是矩阵的某种数学符号,但它不是有效的 python 表达式。怎么会这样?a在涉及 Python 的地方没有定义,所以即使不是因为语法无效,[a^3 + a a^3 + a]在 Python 中输入类似的东西也会导致 a NameError,除非a之前用实际值定义过。因此x = 2 * y,如果没有实际定义y.

您需要做的是传递 to 的实际返回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]))
于 2013-10-26T18:31:10.473 回答