math.hを使わずにn乗根(ただしnは整数)を計算するためのC言語プログラム
数学の教育用の覚書。累乗根の近似値を具体的に計算する方法を習わずにn乗根を受け入れていたんだなあ - あらきけいすけの雑記帳の補遺。累乗根の計算でmath.hのpow()関数を使う部分が論点先取っぽくて気に入らなかったので、整数べきを計算する関数iPow()に書き換えた。iPow()はaのn乗をO(log(n))回程度の計算で実行する*1。
#include <stdio.h>
double iPow ( // n乗の計算をする関数
double base // (base) の (power) 乗の近似値を求める
,int power // べきは整数
) {
double buff=1;
do {
if ( power & 1 ) buff*= base;
power>>= 1;
base*= base;
} while ( power );
return buff;
}
double calcNthRoot ( // n乗根の計算をする関数
double base // (base) の (1/order) 乗の近似値を求める
,int order //
,double PREC // 収束の精度
){
double root=base ,rootPrev;
do {
rootPrev= root;
root=((order-1)*root)/order + base/(order*iPow(root,order-1));
} while ( (rootPrev-root)/root > PREC );
return root;
}
int main ( int argc, char* argv[] ) {
double base=3; // 3 の70乗根の計算
int order=70;
printf("%fの%d乗根は%f\n",base,order,calcNthRoot(base,order,1.e-10));
}*1:参考文献: http://oshiete.goo.ne.jp/qa/3609014.html [2020.6.23追記]Alexander A. Stepanov, Daniel E. Rose, 株式会社クイープ (訳), 『その数式、プログラムできますか?』, (2015, 翔泳社), §2.1 エジプト乗法, p.9. によればiPow()の算法は"Egyptian multiplication", "Russian peasant algorithm"と呼ばれる。