[ 簡単な説明 ]
a の n 乗を求めます。n を2進数に変換して、平方(2乗)ルーチン(=lsqr( ))を用いて効率よくべき乗を求めています。 |
/* 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; } |