Se você é sério sobre o problema, pode não tentar encontrar uma solução com o menor número de multiplicações, mas com o menor tempo de execução.
Considere um modelo em que você possa iniciar uma multiplicação em cada ciclo, mas cada multiplicação leva um número fixo de ciclos, digamos 3 ciclos. Um método que calcula x ^ n com k multiplicações pode levar 3k ciclos (se cada multiplicação depender de um resultado que foi calculado antes), enquanto um método que usa mais multiplicações pode ser executado mais rapidamente.
Por exemplo: Para calcular x ^ 15, você pode calcular nessa ordem x ^ 2 = x * x, x ^ 3 = (x ^ 2) * x, x ^ 6 = (x ^ 3) ^ 2, x ^ 7 Se x = x ^ 6 * x, x ^ 14 = (x ^ 7) ^ 2, x ^ 15 = x ^ 14 * x. Seis multiplicações, mas cada uma depende da anterior.
Ou calcule x ^ 2, x ^ 4 = (x ^ 2) ^ 2, x ^ 3 = x ^ 2 * x, x ^ 5 = (x ^ 4) * x, x ^ 15 = x ^ 5 * x ^ 3, então você tem apenas quatro multiplicações, dependendo dos resultados anteriores.