x에 x를 30번 곱하면 x31이 된다.
x2=x×x,x3=x2×x,x4=x3×x,…,x31=x30×x
만약 중간 결과를 제곱할 수 있다면, 8번의 연산만으로 x31을 구할 수 있다.
x2=x×x,x3=x2×x,x6=x3×x3,x7=x6×x,x14=x7×x7,x15=x14×x,x30=x15×x15,x31=x30×x
앞서 나온 계산 결과들을 서로 곱하는 방법까지 함께 쓰면 x31을 7번의 연산으로 구할 수 있다.
x2=x×x,x4=x2×x2,x8=x4×x4,x10=x8×x2,x20=x10×x10,x30=x20×x10,x31=x30×x
이것이 곱셈만으로 x31을 구하는 가장 효율적인 방법이다.
만약 나눗셈도 쓸 수 있다면 연산 횟수를 더 줄일 수 있다. x31을 곱셈 5번과 나눗셈 1번으로 구할 수 있다.
x2=x×x,x4=x2×x2,x8=x4×x4,x16=x8×x8,x32=x16×x16,x31=x32÷x
이것은 나눗셈이 곱셈만큼 빠를 때 x31을 계산하는 가장 효율적인 방법이다.
x에서 시작해 xn을 만드는 데 드는 연산 횟수의 최솟값을 구하는 프로그램을 작성하시오. 문제에서 설명한 곱셈과 나눗셈만 사용할 수 있다. 모든 중간 결과는 항상 x의 양의 거듭제곱이어야 한다. 즉 x−3 같은 것이 나와서는 안 된다.