高速べき乗計算

y = xのn乗 を計算する「高速べき乗アルゴリズム」を考える. 
   x, y , n はそれぞれ整数型(おおきな桁数まで扱えるとする) 
   n には 1 以上の整数しか入力しないものとする. 

2進法の考え方を利用すると,xy を非常に早く計算することが出来る.

例1 nが奇数の場合だけに通用する方法

  アルゴリズムの概要 

      (1) n, x の入力
      (2) y := x  (x を y に代入する)
      (3) n = 1 ならば 終了
      (4) そうでなければ,
           n := n div 2 (n を 2 で割った商を n に代入する)
           x := x * x   (x の2乗を x に代入する)
      (5) ( nが奇数 ) でなければ (3) へ戻る
      (6) y := y * x (y と x の積を y へ代入する) そして (3) へ戻る

  プログラム

program bekijyou(input,output);

var y,x,n:integer;

begin
	write(output,'n=');readln(input,n);
	write(output,'x=');readln(input,x);
	y:=x;
	while n>1 do
	begin
		n:=n div 2;  // nを2で割った商をnに代入する
		x:=x*x;      // xの2乗をxに代入する
                if (n mod 2)=1 then      // nが奇数でなければ戻る。つまり奇数の時は以下を実行する
		y:=y*x;      // 計算後戻る
	end;
	writeln(output,'y=',y);
end.

例2 nが奇数でも偶数でも通用する方法

  アルゴリズムの概要

      (1) n, x の入力
      (2) nが偶数ならば、y := 1、nが奇数ならばy:=x
      (3) n = 1 ならば 終了
      (4) そうでなければ,
           n := n div 2 (n を 2 で割った商を n に代入する)
           x := x * x   (x の2乗を x に代入する)
      (5) ( nが奇数 ) でなければ (3) へ戻る
      (6) y := y * x (y と x の積を y へ代入する) そして (3) へ戻る

  プログラム

program bekijyou(input,output);

var y,x,n:integer;

begin
	write(output,'n=');readln(input,n);
	write(output,'x=');readln(input,x);
	if (n mod 2)=0 then y:=1 else y:=x;
	while n>1 do
	begin
		n:=n div 2;  // nを2で割った商をnに代入する
		begin
			x:=x*x;      // xの2乗をxに代入する
			if (n mod 2)=1 then
			y:=y*x;      // 計算後戻る
		end;
	end;
	writeln(output,'y=',y);
end.