Использование тождеств ...
x^0 = 1
x^(2n) = (x*x)^n
x^(2n+1) = x * (x*x)^n
... мы можем написать функцию на Haskell, которая вычисляет k th степень 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
Далее, мы можем посмотреть на сумму кросс-суммы числа с основанием 2.t.
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)
Так что можно сказать, что
- Q (n) - количество «нечетных» случаев
nat_pow
; следовательно,
- M (n)> = Q (n) всегда выполняется.
Тем не менее, я думаю, что должно быть что-то еще.