Python 在sage中调用函数时出错

Python 在sage中调用函数时出错,python,read-eval-print-loop,sage,repr,Python,Read Eval Print Loop,Sage,Repr,伙计们,当调用第一个函数作为SAES_-ToStateMatrix([0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15])时, [a^3+a^3+a] [a^3+a a^3+a] 但是通过将输出作为状态矩阵([[a^3+a^3+a],[a^3+a^3+a]]中的SAES_传递, 出现错误“无效语法”,如何避免此错误 这是我的密码 F = GF(2); L.<a> = GF(2^4); V = L.vector_space(); VF8 = VectorSp

伙计们,当调用第一个函数作为
SAES_-ToStateMatrix([0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15])时,

[a^3+a^3+a]
[a^3+a a^3+a]
但是通过将输出作为状态矩阵([[a^3+a^3+a],[a^3+a^3+a]]中的SAES_传递, 出现错误“无效语法”,如何避免此错误

这是我的密码

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;
F=GF(2);
L.=GF(2^4);
V=L.向量_空间();
VF8=向量空间(F,8);
def SAES_TOSTATE矩阵(块):
r”“”
将位列表转换为SAES状态矩阵
"""
B=块;
#将明文块形成GF(2^n)元素的矩阵
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]);
状态矩阵=矩阵(L,[[S00,S01],[S10,S11]];
返回状态矩阵;
来自状态矩阵(状态矩阵)的定义:
r”“”
将SAES状态矩阵转换为位列表。
"""
输出=[];
#将状态矩阵转换回位列表
对于X范围内的r(2):
对于X范围内的c(2):
v=v(状态_矩阵[r,c]);
对于X范围内的j(4):
append(整数(v[j]);
返回输出;

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

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

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}
这也被称为读取评估打印循环()

现在,对于字典来说,它的字符串表示恰好是字典的文本定义的语法(
{key:value,…}
。有关文本的详细信息,请参阅下文

但是,并非所有对象都是这样。对于常见的Python类型,有一种约定,即它们的字符串表示形式是某种东西,在Python解释器中进行计算时,将重新创建具有相同状态的对象。但这只是一种约定,不是您可以依赖的东西,对于更复杂的对象来说根本不可能r例如:

>>> class Foobar(object):
...     def __init__(self):
...         self.attr = 'foo'
...
>>> f = Foobar()
>>> f
<__main__.Foobar object at 0x109ee7750>
因此,您可以看到,
\uuuuu repr\uuuuu
可以返回任何内容-可以是有效的python表达式来重新创建该对象,也可以不是:

对于许多类型,此函数尝试返回 当传递给
eval()
时,将产生具有相同值的对象, 否则,表示为尖括号中的字符串 包含对象类型的名称以及 附加信息通常包括客户的姓名和地址 反对

直接常量 对于某些基元类型,有所谓的(特殊符号),它们是表示公共数据类型的方式(内置于语言语法中)

例如:

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

>>> list((1, 2, 3))
>>> 3.14j
>>> 3.14e-10
使用
dict()
构造函数创建字典的窗体:

>>> dict(foo=1, bar=2)
表单使用
{
}
文本创建字典:

>>> {'foo': 1, 'bar': 2}
>>> [1, 2, 3]
列表

>>> list((1, 2, 3))
>>> 3.14j
>>> 3.14e-10
与使用
[
]
文字相比:

>>> {'foo': 1, 'bar': 2}
>>> [1, 2, 3]
虚数

>>> list((1, 2, 3))
>>> 3.14j
>>> 3.14e-10
浮动

>>> list((1, 2, 3))
>>> 3.14j
>>> 3.14e-10
因此,如果您将
{'foo':1,'bar':2}
输入到解释器中,并获得一个dict,这是有效的,因为字典的字符串表示形式与定义字典的文本形式完全相同

圣人矩阵 现在,在sage的
Matrix
类中,字符串表示法看起来像是矩阵的数学符号,但它不是一个有效的python表达式。这怎么可能呢?
a
在涉及python的地方没有定义,所以即使不是因为无效语法,也要输入类似
[a^3+a^3+a]
进入Python会导致
名称错误
,除非
a
以前是用实际值定义的。因此,如果不实际定义
y
,也不能在Python中输入
x=2*y
这样的代数公式

您需要做的是将
SAES\u ToStateMatrix(lst)
的实际返回值传递给
SAES\u 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]))

这是你代码的真实缩进吗?
a^3+a^3+a
中的
a a
不是有效的python表达式,这就是你语法错误的原因。是的,这是真实的缩进…有什么帮助吗?@Lukas Grafit:是用sage(数学环境)编写的@noazetabdo:你能提供完整的回溯吗?