模数算法创建

时间:2014-09-12 22:25:58

标签: algorithm

好吧,这是一个家庭作业问题,我一直在困扰我的大脑

  

显示一个算法,该算法在输入整数a,b上,其中a为n位长且b 中的mod b

我提出了以下算法,我想知道我是否走在正确的轨道上:

modulus(a,b)
c = a-b;
modulus (c,b)
result c; 

这是正确的吗?或者我是否直觉性地做到了?有小费吗?

我试图用伪代码写出算法。是的,它询问实施模数。

1 个答案:

答案 0 :(得分:1)

要计算mod b,您必须从a中减去b的倍数,直到结果小于b。为简单起见,我假设a> = 0,b> 0,但你可以使用关系mod(-a,b)= mod(a,-b)= -mod(a,b)来恢复负面签名的案例。

实施mod的最天真(但效率低下)的方法是:

def mod(a, b):
    while a >= b:
        a -= b
    return a

当a远大于b时,这很可怕。复杂度是O(a / b),在最坏的情况下是O(2 ^ n),其中n是比特数。相反,我们可以尝试减去b的大倍数,我们可以通过位移来实现这一点。

def mod(a, b):
    bs = b
    while bs <= a:
        bs <<= 1
    while bs > b:
        bs >>= 1
        if a >= bs: a -= bs
    return a

在这段代码中,我们继续将b(在变量bs中)左移,直到它大于a。然后一步一步,我们将它转​​回b,如果可以的话减去a的值。这本质上是二进制长除法的实现。

至于时间复杂度:左移是O(n)(假设我们正在处理任意大数,其中n是位数),比较和减法也是如此。这使得此实现中的两个while循环都是O(n ^ 2)。