优化/纠正我在python中的米勒rabin素性测试

时间:2016-11-17 12:06:45

标签: python rabin

这是我的代码:

    import random
def one_d(n):
    b = n
    # initialize n
    s = 0
    # while loop, terminating when s becomes odd
    while n % 2 == 0:
        # increment s
        s = s+1
        # divide n by 2
        n = n/2
    tuple1 = tuple([s,n])
    return tuple1
    print "2^",s,"*",n,"=", b
def miller_rabin(n, a):
    list1 = []
    tuple1 = one_d(n-1)
    for r in xrange(tuple1[0]):
        list1.append((a**(2**(r)*tuple1[1])) % n)
        if list1[r] == n-1 or list1[r] == 1:
            return "True"
    else:
        return "False"
def isprime(n):
    for i in xrange(10):
        a = random.randrange(2, n-1)
        if miller_rabin(n, a) == "False":
            return "False"
    return "True

据我所知,这个测试应该可以处理非常大的数字,但我的脚本卡在50034901这样的数字上。我假设我在某处犯了错误/严重低效 - 因为我的脚本仍然有效对于较小的数字。

1 个答案:

答案 0 :(得分:0)

在进一步调查之后,我意识到这是因为我使用“%”代码来执行模数计算,这比使用python的'pow'函数效率低得多。前者在计算模数之前计算完整指数,因此必须处理非常大的数。后者逐步进行,每次通过模数n重新调整,因此更有效