【问题标题】:Getting different results for the same equation in a function and the shell在函数和 shell 中为同一个方程获得不同的结果
【发布时间】:2015-10-02 12:00:17
【问题描述】:

我已经使用 Sage 实现了 Pollard 的 Rho 对数,如下程序存储在 pollardrho.py 中。

def pollardrho(g, h, G):
    k, m = 1, 0
    t = g**k * h**m
    i, j = 1, 0
    r = g**i * h**j

    def step(t, k, m):
        if lift(t) % 3 == 0:
            return (t * g, k+1, m)
        if lift(t) % 3 == 1:
            return (t * h, k, m+1)
        if lift(t) % 3 == 2:
            return (t ** 2, 2*k, 2*m)

    while True:
        t, k, m = step(t, k, m)
        r, i, j = step(*step(r, i, j))
        if t == r:
            print("Found a cycle")
            print("g^%s h^%s == g^%s h^%s" % (k, m, i, j))
            print("g^(%s - %s) == h^(%s - %s)" % (i, k, m, j))
            l = g.multiplicative_order()
            print("(%s - %s) / (%s - %s) %% %s" % (i, k, m, j, l))
            return (i - k) / (m - j) % l  # this is where everything goes wrong.

使用G = GF(1013), g = G(3), h = G(245) 运行它会得到以下输出:

sage: pollardrho(g, h, G)
Found a cycle
g^262 h^14 == g^16870 h^1006
g^(16870 - 262) == h^(14 - 1006)
(16870 - 262) / (14 - 1006) % 1012
995

但是:

sage: (16870 - 262) / (14 - 1006) % 1012
375

请注意,这是完全不同的结果!

如果我检查i, j, k, m的类型,它们都是int类型...

【问题讨论】:

    标签: ipython sage modular-arithmetic


    【解决方案1】:

    事实证明,在 sage shell 中键入整数与在使用 Sage 库的 python 程序中执行相同的结果不同:

    sage: type(1234)
    <type 'sage.rings.integer.Integer'>
    

    这与我在自己的程序中得到的 &lt;type 'int'&gt; 不同!

    使用k, m = Integer(1), Integer(0) 解决了我的问题,我现在得到了正确的离散日志。

    【讨论】:

    • 是的!这是绝对正确的。我会给出一个跟进作为答案,以便人们看到它。
    【解决方案2】:

    要详细说明 Thom 的答案,在 .py 文件中,您不能使用 Sage 所做的各种准备工作 - 特别是,ints 是 ints。从文件中的sage.rings.integer.Integer(或sage.all)导入可能会起作用,或者(我建议这样做)只是使你的文件扩展名为.sage而不是.py是最简单的,并且最不可能遇到其他微妙的问题差异。

    【讨论】:

    • .sage 文件是否仍然可以使用 'from x import y' 或者在这种情况下我需要使用 load() 吗?
    • 嗯,这是个好问题。我假设答案是load(),因为我从来没有做过任何其他事情(这对我来说更容易),但是由于.sage 文件随后被预解析为.py 文件,我想它也可能有效,如果你'已经创建了一些模块。试试看!
    • 因为我现在在电脑上而不是在手机上,所以我已经能够对其进行测试,它似乎不起作用。所以这是一个不幸的缺点。
    • 为了完整起见,load('pollardrho.py') 也不会用Integer 替换整数,而load('pollardrho.sage') 会。因此,不只是 import 语句不起作用,它确实取决于文件扩展名。
    猜你喜欢
    • 1970-01-01
    • 2022-08-12
    • 2013-09-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-02-08
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多