在函数和shell

时间:2015-10-02 12:00:17

标签: ipython sage modular-arithmetic

我使用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类型...

2 个答案:

答案 0 :(得分:1)

事实证明,在sage shell中键入一个整数会产生与使用Sage库的python程序中相同的结果:

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

这与我自己的程序中的<type 'int'>相同!

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

答案 1 :(得分:1)

要详细说明Thom的答案,在./assets/img/ 文件中,您无法使用Sage所做的各种预先准备工作 - 尤其是.py s int s。从您文件中的int(或来自sage.rings.integer.Integer)导入可能有效,或者(我建议这样做)只需将文件sage.all扩展名设为.sage而不是.py是最简单的,并且最不可能遇到其他微妙的差异。