Вычисление степени

 

При возведении целого числа в неотрицательную степень обычно используют определение степени, т.е. в цикле многократно умножают число на себя. Однако для длинных чисел этот алгоритм не является эффективным. Поэтому целесообразно использовать алгоритмы меньшей сложности, например, описаный ниже.

(Из книги А. Шеня "Программирование: теоремы и задачи".) Дано целое число а и целое неотрицательное число n. Вычислить а в степени n. Другими словами, необходимо составить программу, при исполнении которой значения переменных а и n не меняются, а значение некоторой другой переменной (например, b) становится равным а в степени n. (При этом разрешается использовать и другие переменные.) Требуется, чтобы число действий (выполняемых операторов присваивания) было порядка log2 n (то есть не превосходило бы C * log2 n для некоторой константы C; log2 n — это степень, в которую нужно возвести 2, чтобы получить n).

Решение.
		k := n; b := 1; c := a;
		{a в степени n = b * (c в степени k)}
		while k <> 0 do
		begin
			if k mod 2 = 0
			then begin
				k := k div 2;
				c := c * c
			     end
			else begin
				k := k - 1;
				b := b * c
			     end
		end;

Каждый второй раз (не реже) будет выполняться первый вариант оператора выбора (если k нечетно, то после вычитания единицы становится четным), так что за два цикла величина k уменьшается по крайней мере вдвое.


Рейтинг ресурсов УралWeb
X