【JavaScript】累乗根を組みこみ関数または自力で計算する方法

更新日:2023/07/12

以前の記事で、JavaScriptで平方根と立方根を求める方法をお伝えしました。
最後に、累乗根についても組みこみ関数または自力で計算する方法をお伝えします。

 

組み込み関数を使用する

JavaScriptは累乗根の算出を目的とした組み込みメソッドはありません。
ですが、べき乗を求めるメソッドがあるので、こちらを使用できます。

べき乗を求めるメソッド

Math.pow( base, exponent )

たとえば、次の累乗根を求めたいとき、

ma : aのm乗根

次のように引数を渡します。

Math.pow( a , 1 / m )

このメソッドは、次項のべき乗演算子と内部アルゴリズムが同じです。

 

べき乗演算子を使用する

べき乗演算子はある値を指定回数掛け算します。

a ** 5 → a * a * a * a * a (aを5回掛け算)

ここで、指定回数に 1 / m を指定すると m乗根を求めることができます。

a ** ( 1 / 5 ) → 5a

この方法を使って、10から30までの5乗根と10乗根を求めてみます。


for( i = 10 ; i <= 30 ; i ++ ) {
    const r1 = i ** ( 1 / 5 );
    const r2 = i ** ( 1 / 10 );
    console.log( `${ i } : 5乗根 ${r1}(${r1**5}) 10乗根 ${r2}(${r2**10})` );
}

結果は次のようになります。

10 : 5乗根 1.5848931924611136(10.000000000000004) 10乗根 1.2589254117941673(10.000000000000005)
11 : 5乗根 1.615394266202178(11.000000000000004) 10乗根 1.2709816152101405(10.99999999999999)
12 : 5乗根 1.6437518295172258(12) 10乗根 1.2820888539868154(11.999999999999995)
13 : 5乗根 1.6702776523348104(13) 10乗根 1.2923922207808318(12.999999999999998)
14 : 5乗根 1.6952182030724354(13.999999999999998) 10乗根 1.3020054543174677(14.000000000000002)
15 : 5乗根 1.7187719275874789(15.000000000000004) 10乗根 1.3110194230397498(14.99999999999999)
16 : 5乗根 1.7411011265922482(15.999999999999998) 10乗根 1.3195079107728942(15.999999999999993)
17 : 5乗根 1.7623403478323172(17.000000000000007) 10乗根 1.3275316748885193(17.000000000000014)
18 : 5乗根 1.7826024579660034(18) 10乗根 1.335141362540313(18.00000000000001)
19 : 5乗根 1.8019831273171423(19) 10乗根 1.3423796509621049(19.00000000000001)
20 : 5乗根 1.8205642030260802(20) 10乗根 1.3492828476735634(20.000000000000018)
21 : 5乗根 1.838416287252544(21) 10乗根 1.355882106693847(21.00000000000002)
22 : 5乗根 1.8556007362580844(22.000000000000004) 10乗根 1.362204366553743(22.00000000000001)
23 : 5乗根 1.8721712305548575(23) 10乗根 1.368273083326153(23)
24 : 5乗根 1.888175022589804(24) 10乗根 1.3741088103166372(24.00000000000001)
25 : 5乗根 1.9036539387158786(25.000000000000007) 10乗根 1.379729661461215(25.00000000000001)
26 : 5乗根 1.9186451916253062(26) 10乗根 1.3851516854212416(25.999999999999993)
27 : 5乗根 1.9331820449317627(26.999999999999996) 10乗根 1.3903891703159093(26.999999999999982)
28 : 5乗根 1.9472943612303364(28.000000000000007) 10乗根 1.3954548940149718(27.999999999999993)
29 : 5乗根 1.961009057454548(29) 10乗根 1.400360331291396(29.000000000000007)
30 : 5乗根 1.97435048583482(30.00000000000001) 10乗根 1.405115826483646(29.999999999999996)

累乗根は値が二つの時と、一つの時があります。

二つの時は正と負の値を持ちます。

値が二つのケース

// 4 √ 2
const result = 2 ** ( 1 / 4 );

console.log( result ** 4 ); // 結果: 1.9999999999999998
console.log( (-1 * result) ** 4 ); // 結果: 1.9999999999999998

累乗根を求めた後に、検算しています。
このとき、マイナスを掛けて符号を反転したものも同じ値になっていますね。

次は一つのケースです。

値が一つのケース

// 5 √ 2
const result = 2 ** ( 1 / 5 );

console.log( result ** 5 ); // 結果: 2.000000000000001
console.log( (-1 * result) ** 5 ); // 結果: -2.000000000000001

こちらは、二つ目の結果がマイナス値になりました。
そのため累乗根の値ではありません。

答えが二つかどうかの確認は、上記コードのように符号を反転させて検算した結果の符号をチェックします。

const func = (result,base)=>
    `${result}${Math.sign(base) === Math.sign( (-1*result) ** base ) ? ` または ${ -1 * result}` : ""}`;

console.log( func( 2 ** ( 1 / 4 ) , 4 ) );
 // 結果: 1.189207115002721 または -1.189207115002721
console.log( func( 2 ** ( 1 / 5 ) , 5 ) );
 // 結果: 1.148698354997035

 

自力で計算する

平方根と立方根の記事でニュートン法を紹介したので、累乗根でもやってみます。

ニュートン法は次のような公式でした。

xn+1 = xn - f(xn) / f´(xn)

求めたい累乗根を、mv とします。

f(x)f´(x) は、次のようになります。

f(x) = xm - v
f´(x) = mxm-1

公式に当てはめます。

xn+1 = xn - (xnm - v) / mxnm-1
  = xn - xn / m + v / mxnm-1

累乗で掛ける回数を減らす方向で変形してみました。

これを使ってコードを作成してみます。

const radical_root = ((threshold)=>{
    const th = threshold; // 閾値
    return (value,exponent) =>{
        let before_x,x= value;
        do{
            before_x = x;
            x = before_x - before_x / exponent +  value/(exponent*(before_x**(exponent-1)));
        }while( Math.abs( before_x - x ) > th );
        return x;
    };
})(0.00000001);

この関数を使って、10から30までの立方根を求めてみます。

for( i = 10 ; i <= 30 ; i ++ ) {
    const r1 = cube_root(i);
    const r2 = Math.cbrt(i);
    console.log( i,r1 , r2 , r1 - r2 );
}

次のような結果になりました。

10 : 5乗根 1.5848931924611134(9.999999999999996) 10乗根 1.258925411794167(9.999999999999988)
11 : 5乗根 1.6153942662021779(10.999999999999995) 10乗根 1.2709816152101407(11.00000000000001)
12 : 5乗根 1.643751829517226(12.000000000000007) 10乗根 1.2820888539868154(11.999999999999995)
13 : 5乗根 1.6702776523348104(13) 10乗根 1.2923922207808318(12.999999999999998)
14 : 5乗根 1.6952182030724354(13.999999999999998) 10乗根 1.3020054543174677(14.000000000000002)
15 : 5乗根 1.7187719275874789(15.000000000000004) 10乗根 1.31101942303975(15.000000000000014)
16 : 5乗根 1.7411011265922482(15.999999999999998) 10乗根 1.3195079107728942(15.999999999999993)
17 : 5乗根 1.762340347832317(16.999999999999996) 10乗根 1.327531674888519(16.999999999999986)
18 : 5乗根 1.7826024579660034(18) 10乗根 1.335141362540313(18.00000000000001)
19 : 5乗根 1.8019831273171423(19) 10乗根 1.3423796509621047(18.99999999999998)
20 : 5乗根 1.8205642030260802(20) 10乗根 1.3492828476735632(19.999999999999986)
21 : 5乗根 1.838416287252544(21) 10乗根 1.3558821066938467(20.99999999999999)
22 : 5乗根 1.8556007362580844(22.000000000000004) 10乗根 1.362204366553743(22.00000000000001)
23 : 5乗根 1.8721712305548575(23) 10乗根 1.3682730833261527(22.999999999999964)
24 : 5乗根 1.888175022589804(24) 10乗根 1.3741088103166372(24.00000000000001)
25 : 5乗根 1.9036539387158784(24.999999999999993) 10乗根 1.379729661461215(25.00000000000001)
26 : 5乗根 1.9186451916253062(26) 10乗根 1.3851516854212416(25.999999999999993)
27 : 5乗根 1.9331820449317627(26.999999999999996) 10乗根 1.3903891703159093(26.999999999999982)
28 : 5乗根 1.9472943612303362(27.999999999999993) 10乗根 1.3954548940149718(27.999999999999993)
29 : 5乗根 1.961009057454548(29) 10乗根 1.400360331291396(29.000000000000007)
30 : 5乗根 1.9743504858348198(29.999999999999993) 10乗根 1.405115826483646(29.999999999999996)

更新日:2023/07/12

書いた人(管理人):けーちゃん

スポンサーリンク

記事の内容について

null

こんにちはけーちゃんです。
説明するのって難しいですね。

「なんか言ってることおかしくない?」
たぶん、こんなご意見あると思います。

裏付けを取りながら記事を作成していますが、僕の勘違いだったり、そもそも情報源の内容が間違えていたりで、正確でないことが多いと思います。
そんなときは、ご意見もらえたら嬉しいです。

掲載コードについては事前に動作確認をしていますが、貼り付け後に体裁を整えるなどをした結果動作しないものになっていることがあります。
生暖かい視線でスルーするか、ご指摘ください。

ご意見、ご指摘はこちら。
https://note.affi-sapo-sv.com/info.php

 

このサイトは、リンクフリーです。大歓迎です。