使用身份......
x^0 = 1
x^(2n) = (x*x)^n
x^(2n+1) = x * (x*x)^n
...我们可以编写一个Haskell函数来计算 x 的 k 次幂,其中 x 乘以 k 。
nat_pow :: Double -> Integer -> Double
nat_pow x 0 = 1
nat_pow x k
| m==0 = nat_pow (x*x) n -- k == 2*n <=> m == 0
| otherwise = x * nat_pow (x*x) n -- k == 2*n+1
where
(n,m) = k `divMod` 2 -- n <- k `div` 2; m <- k `mod` 2
例如:
nat_pow x 6
= nat_pow x^2 3
= x^2 * natpow (x^2)^2 1
= x^2 * (x^2)^2 * natpow ((x^2)^2)^2) 0
= x^2 * (x^2)^2 * 1
此外,我们可以看一下w.r.t base 2的数字的交叉和。
crossSum_2 42 = 3 (because (42)_10 = (101010)_2)
问题:nat_pow x k
要求的乘数和crossSum_2 k
之间的链接是什么?
到目前为止我有什么:
设Q(k)为k的二进制交叉和; M(k)nat_pow n k
的乘法数。然后我可以看到
M(2k) = 1 + M(k)
M(2k+1) = 1 + M(2k)
Q(2k) = Q(k)
Q(2k+1) = 1 + Q(k)
所以可以这么说
nat_pow
;因此但是,我认为必须有更多内容。
答案 0 :(得分:3)
M(2k) = 1 + M(k) M(2k+1) = 1 + M(2k) Q(2k) = Q(k) Q(2k+1) = 1 + Q(k)
事实上,我们可以使两个定义之间的并行更加接近。在M(2k+1) = 1 + M(2k)
中,我们可以展开我们对M(2k)
:
M(2k) = 1 + M(k)
M(2k+1) = 1 + 1 + M(k)
Q(2k) = Q(k)
Q(2k+1) = 1 + Q(k)
现在很明显,与Q
相比,M
在每次“递归调用”中再添加一个。因此M(k)
将Q(k)
加上递归调用M
的总数 - 在这种情况下也是k
中的总位数。 (只有一个问题:我们没有写过上面Q
和M
的基本情况。一旦我们将其考虑在内,这是否会改变答案?基本情况需要看什么?就像在反事实世界中给出另一个答案“这会改变答案吗?”?)