《Algorithms》书中18页给出了乘法的递归算法的伪代码,并且之前也给了公式。但是由于除法只有伪代码没有公式的证明支持,我为了让自己知其然而且还要知其所以然,于是想自己证明之。
首先 我们设 a=(x1)*y+(b1) 并且【a/2】=(x2)*y+(b2)
把a除以2并且做取整运算。这个时候会出现两种情况,第一种是a为偶数,则 【a/2】 = a/2 ,第二种是【a/2】 = (1/2)*(a-1)
a为偶数的时候,上面等式的右边则是(1/2)*((x1)*y+(b1))。 a为奇数,上面等式右边是(1/2)*((x1)*y+(b1-1))。
分别和【a/2】=(x2)*y+(b2)相比,匹配系数。
则有:
a为基数时
x1 = 2*(x2)
b1 = 2*(b2)
a为偶数时
x1 = 2*(x2)
b1 = 2*(b2) + 1 //注1
所以,有书上的伪代码递推式:
function divide(x,y)
Input: Two n-bit integers x and y, where y 1
Output: The quotient and remainder of x divided by y
if x = 0: return (q,r) = (0,0)
(q,r) = divide(bx=2c,y)
q = 2 q; r = 2 r
if x is odd: r = r + 1
if r >= y: r = r - y; q = q + 1 //接注1 如果b1(也就是r)大于y,那么b1要减去y,并且(x2)加1.
return (q,r)