计算n ^ k的乘法次数和n的二进制交叉和之间的链接

时间:2018-05-17 15:06:53

标签: haskell math

使用身份......

       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)

所以可以这么说

  1. Q(n)是&#34; odd&#34;案件nat_pow;因此
  2. M(n)&gt; = Q(n)始终成立。
  3. 但是,我认为必须有更多内容。

1 个答案:

答案 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中的总位数。 (只有一个问题:我们没有写过上面QM的基本情况。一旦我们将其考虑在内,这是否会改变答案?基本情况需要看什么?就像在反事实世界中给出另一个答案“这会改变答案吗?”?)