Python 3中的模块化取幂实现

时间:2013-09-14 18:19:22

标签: python algorithm python-3.x pseudocode modular-arithmetic

基本上这是一个家庭作业问题。我应该在Python3中实现这两个伪代码算法。我做错了什么,我无法弄清楚是什么(看起来这应该很简单,所以我不确定是什么/我在哪里拙劣。这可能是我的算法或我缺乏Python的经验。我'我不确定哪个。)。

请告诉我我做错了什么,不要发布任何代码。如果我得到答案的代码,我会被抄袭剽窃(我非常不想要)。

第一种算法(基础扩展):


    procedure base expansion(n, b: positive integers with b > 1)
    q := n
    k := 0
    while q ≠ 0
        ak := q mod b
        q := q div b
        k := k + 1
    return (ak-1, ... , a1, a0) {(ak-1 ... a1 a0)b is the base b expansion of n}

第二种算法(模块化扩展):


    procedure modular exponentiation(b: integer, n = (ak-1ak-2...a1a0)2, m: positive integers)
    x := 1
    power := b mod m
    for i := 0 to k - 1
        if ai = 1 then x := (x * power) mod m
        power := (power * power) mod m
    return x {x equals bn mod m}

看起来很简单,这就是我在Python3中实现的内容(我请求所有Python程序员的宽恕,这对我来说是一种非常新的语言)

def baseExp(n, b):
    q = n
    a = []
    while (q != 0):
        a.append(q % b)
        q = q // b
        pass
    return a

def modularExp(b, n, m):
    a = baseExp(n, b)
    x = 1
    power = b % m
    for i in range(0, len(a)):
        if (a[i] == 1):
            x = (x * power) % m
            pass
        power = (power * power) % m
        pass
    return x

这似乎应该有效,但当我尝试解决7 644 mod 645时,我得到了答案79,但正确的答案应该是436。

如果有人在没有给我任何代码的情况下指出我的错误,我会非常感激。

1 个答案:

答案 0 :(得分:1)

只有当b等于2时,你的方法才有效,这与通过平方取幂相同,但是在b> 1的情况下它会失败。 2.方法如下:

您的字符串n可以包含[0,b-1]范围内的数字,因为它是基数b中数字n的表示。在您的代码中,您只检查数字1,在b = 7的情况下,可以有[0,6]范围内的任何数字。您必须按如下方式修改算法:

// take appropriate remainders where required
// Correction 1 :
In the for loop,
Check if a[i] = 1, then x = x * power
else if a[i] = 2, then x = x * power^2
else if a[i] = 3, then x = x * power^3
.
.
.
.
till a[i] = b-1, then x = x * power^(b-1)
// Correction 2 :
After checking a[i] 
power = power^b and not power = power^2 which is only good for b = 2

您现在应该得到正确答案。