好吧,这是一个家庭作业问题,我一直在困扰我的大脑
显示一个算法,该算法在输入整数a,b上,其中a为n位长且b 中的mod b
我提出了以下算法,我想知道我是否走在正确的轨道上:
modulus(a,b)
c = a-b;
modulus (c,b)
result c;
这是正确的吗?或者我是否直觉性地做到了?有小费吗?
我试图用伪代码写出算法。是的,它询问实施模数。
答案 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)。