多倍長演算ライブラリ ルーチン28



[ 簡単な説明 ]

a の n 乗を求めます。n を2進数に変換して、平方(2乗)ルーチン(=lsqr( ))を用いて効率よくべき乗を求めています。


プログラム・ソース("lpwr.c")           top (トップに戻る)
/*		lpwr.c		*/
#include "longint.h"

/* power LINT ^ int */

LINT lpwr(LINT a, int n)
{
	int r;
	LINT x;

	x.len = x.sign = 0;
	if(n < 0)
	{
		fprintf(stderr, "Error : Illegal parameter (n < 0)  in spwr()\n");
		return x;
	}
	x.len = 1;
	x.num[1] = 1;
	if(n == 0)	return x;
	if(a.len * n > MAXLEN)
	{
		fprintf(stderr, "Error : Too large  in lpwr()\n");
		return x;
	}
	while(n > 0)
	{
		r = n % 2;
		n /= 2;
		if(r == 1)	lmul1(&x, a);
		a = lsqr(a);
	}
	return x;
}