Здесь необходимо заметить, что:
2^2 = 4
2^4 = (2^2)*(2^2)
2^8 = (2^4)*(2^4)
2^16 = (2^8)*(2^8)
2^32 = (2^16)*(2^16)
2^64 = (2^32)*(2^32)
2^128 = (2^64)*(2^64)
... and in total of 25 steps ...
2^33554432 = (2^16777216)*(16777216)
Затем, так как:
2^43112609 = (2^33554432) * (2^9558177)
, вы можете найти оставшиеся (2^9558177)
, используя тот же метод, и поскольку (2^9558177 = 2^8388608 * 2^1169569)
, вы можете найти 2^1169569
, используя тот же метод, и, поскольку (2^1169569 = 2^1048576 * 2^120993)
, вы можете найти 2^120993
, используя тот же метод, и так далее ...
РЕДАКТИРОВАТЬ: ранее былоошибка в этом разделе, теперь она исправлена:
Кроме того, дальнейшее упрощение и оптимизация, отметив, что:
2^43112609 = 2^(0b10100100011101100010100001)
2^43112609 =
(2^(1*33554432))
* (2^(0*16777216))
* (2^(1*8388608))
* (2^(0*4194304))
* (2^(0*2097152))
* (2^(1*1048576))
* (2^(0*524288))
* (2^(0*262144))
* (2^(0*131072))
* (2^(1*65536))
* (2^(1*32768))
* (2^(1*16384))
* (2^(0*8192))
* (2^(1*4096))
* (2^(1*2048))
* (2^(0*1024))
* (2^(0*512))
* (2^(0*256))
* (2^(1*128))
* (2^(0*64))
* (2^(1*32))
* (2^(0*16))
* (2^(0*8))
* (2^(0*4))
* (2^(0*2))
* (2^(1*1))
Также обратите внимание, что 2^(0*n) = 2^0 = 1
Используя этот алгоритм, вы можете вычислить таблицу 2^1
, 2^2
, 2^4
, 2^8
, 2^16
... 2^33554432
в 25 умножениях.Затем вы можете преобразовать 43112609
в его двоичное представление и легко найти 2^43112609
, используя менее 25 умножений.В общей сложности вам нужно использовать менее 50 умножений, чтобы найти любое 2^n
, где n
находится в диапазоне от 0 до 67108864.