【问题标题】:error in calling functions in sage在sage中调用函数时出错
【发布时间】:2013-11-05 17:57:51
【问题描述】:

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

【问题讨论】:

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

标签: python read-eval-print-loop sage repr


【解决方案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 表达式,并打印出 字符串表示控制台上的结果。

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

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

这也称为 read-eval-print-loop (REPL)。

现在,对于字典,它的字符串表示恰好是完全字典的字面定义的语法是什么({key: value, ...}。有关 literals。

但是,并非所有对象都如此。对于常见的 Python 类型,它们的字符串表示是一种约定,当在 Python 解释器中评估时,将重新创建具有相同状态的对象。但这只是一个约定,不是您可以依赖的东西,而且对于更复杂的对象根本不可能。例如:

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

这里,Foobar 类实例的字符串表示是&lt;scope.Foobar object at memory_address&gt;。这是对象的默认字符串表示形式。

可以通过定义__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() 时会产生一个具有相同值的对象, 否则表示是用尖括号括起来的字符串 包含对象类型的名称以及 附加信息通常包括姓名和地址 对象。

文字

对于某些原始类型,有所谓的literals(特殊符号)是表示通用数据类型的方式(内置于语言的语法中)。

例如:

字典

使用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,这是可行的,因为字典的字符串表示与定义字典的字面形式完全相同。

贤者的矩阵

现在,在 sage 的 Matrix 类的情况下,看起来字符串表示是矩阵的某种数学符号,但它不是有效的 Python 表达式。怎么会这样? a 没有在涉及 Python 的地方定义,因此即使不是因为语法无效,在 Python 中输入类似 [a^3 + a a^3 + a] 的内容也会导致 NameError,除非 a 之前定义了一个实际值。所以你不能在没有实际定义y的情况下将x = 2 * y之类的代数公式输入Python。

你需要做的是将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]))

【讨论】:

    猜你喜欢
    • 2021-05-07
    • 2012-10-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-07-22
    • 2018-12-21
    相关资源
    最近更新 更多