二項定理をJavaScriptで表現しました

JavaScript入門者によるコード作成練習です。
趣味の高校数学をネタにJavaScriptで簡単なアプリを作ります。
初心者による手探りのコードなので、もっといい方法や間違いがあればどしどしツッコミ下さい。

今回は二項定理（Binomial theorem）のアルゴリズムをJavaScriptで表現しました。
使用したソフトはVisual Studio Codeのみ。
言語は簡単はHTMLとJavaScriptです。

二項定理のキモは組み合わせ（Combination）の計算です。
組み合わせの計算のキモは階乗（Factorial）の計算です。

そのため、基本的な構造は、1,階乗の計算をする関数を作成、2,組み合わせの計算をする関数を作成、3,二項定理を計算する関数の作成、の3点となります。

1,階乗の計算をする関数

```fatorial.js
//nの階乗を求める関数
function factorial(n){
    var sum = 1;
    for(var i = 0; i < n; i++){
        localN = n - i;
        sum = sum * localN;
    }
    return sum;
}
```
ある数nの階乗の計算は下記のように計算します。

```math

n! = (n - 0)(n - 1)(n -2) ・・・ 2 \times 1 \\
0! = 1 \\

```

項数はn個になります。
例えば5の階乗であれば、5 * 4 * 3 * 2 * 1 = 120です。
また、定義より0!は1になります。
これをfor文で表現しています。
ローカル変数sumの初期値を1とすることで、0の階乗がうまいこと1と出力されました。

2,組み合わせの計算をする関数

```combinationN.js

//nCkを求める関数
function combinationN(n, k){
    var ansOfComb = factorial(n) / (factorial(k) * factorial(n - k))
    return  ansOfComb;
}
```
ある数nからk個を取り出す組み合わせの計算は下記のように計算します。

```math
{}_n \mathrm{ C }_k = \frac{n!}{k!(n - k)!}

```
この公式には階乗の計算が3つ含まれています。
つまり、n!、k!、(n - k)!の3つです。これらを先ほどのユーザー定義関数factorialに突っ込んで計算します。

3,二項定理の計算をする関数

```binomialTherrem.js

//二項定理
function binomialTherrem(a, b, r){
    var localR = r, coeffieients = [];

    //指数の数＝項数、計算を繰り返す
    for (var i = 0; i <= r; i++){
        //localRには、画面から取得した指数の数を1ずつ減算した数が入る
        //iには、0から画面の指数の数まで1ずつ加算した数が入る
        localR = r - i;

        //係数を求める計算（組み合わせと各項の係数の乗算）
        //.toFixed(0)について・・・JSで表現できる桁数の限界を越えた場合の対策
        var num = combinationN(r, localR).toFixed(0) * ( a ** localR) * (b ** i);

        //a、bの指数を入れる。<sup>タグで累乗を表現
        var str = "a" + "<sup>" + localR + "</sup>" + "b" + "<sup>" + i + "</sup>" + "<br>"; 

        //画面出力用の配列（coeffieients）に各項の値を入れていく
        coeffieients.push(num + str);
    }
    return coeffieients;
}
```
二項展開は各項の係数（coeffieient）を求める計算です。
そのため、配列を利用して各項の係数を末尾に追加していきます（coeffieients.push(num);の箇所）。
以上で計算するための関数作成は完了しました。
ここまで二項定理と言ってきましたが、実はこのプログラムで行っていることは、正確に言うと「二項展開」です。1次の2項の和のn乗を展開した時の二項係数を求めるのが目的でした。
計算結果を画面に表示する時は、係数とa,bのn乗のかたちで返したいので、\<sup\>タグを使って各項の指数を表します。


次に画面からの数値取得とそれを返す関数を書きます。

```cilc.js

function culc(){
    //2数を画面から取得
    var numA = document.getElementById('id01').value;
    var numB = document.getElementById('id02').value;
    var numR = document.getElementById('id03').value;

    numA = Number(numA);
    numB = Number(numB);
    numR = Number(numR);

    //関数呼び出し
    var ans = binomialTherrem(numA, numB, numR);
    //画面に出力
    document.getElementById('answer').innerHTML = ans;           
}
```

```二項定理.html

<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8" />
<title>二項定理</title>
</head>
<body>
     <p> 
         (  
        <!--第1項（a）-->
        <input type="text" id="id01">a
        +
        <!--第2項（b）-->
        <input type="text" id="id02">b
         )
        <!--指数（r）-->
        **<input type="text" id="id03">
    </p>

        <p>The answer is</p>
        <p id="answer"></p>
        <!--ボタン押下で計算開始-->
        <input type="button" value="anser" onclick="culc();">

        <p>The answer is</p>
        <p id="answer"></p>
    <script type="text/javascript" src="./scripts/math.js"></script>
</body>
</html>
```

以上で二項定理のアルゴリズムをJavaScriptで表現するアプリの説明を終わります。

```all.js

function culc(){
    //2数を画面から取得
    var numA = document.getElementById('id01').value;
    var numB = document.getElementById('id02').value;
    var numR = document.getElementById('id03').value;

    numA = Number(numA);
    numB = Number(numB);
    numR = Number(numR);

    //関数呼び出し
    var ans = binomialTherrem(numA, numB, numR);
    //画面に出力
    document.getElementById('answer').innerHTML = ans.join('');
        
}


//nの階乗を求める関数
function factorial(n){
    var sum = 1;
    for(var i = 0; i < n; i++){
        localN = n - i;
        sum = sum * localN;
    }
    return sum;
}

//nCkを求める関数
function combinationN(n, k){
    var ansOfComb = factorial(n) / (factorial(k) * factorial(n - k))
    return  ansOfComb;
}

//二項定理
function binomialTherrem(a, b, r){
    var localR = r, coeffieients = [];

    //指数の数＝項数、計算を繰り返す
    for (var i = 0; i <= r; i++){
        //localRには、画面から取得した指数の数を1ずつ減算した数が入る
        //iには、0から画面の指数の数まで1ずつ加算した数が入る
        localR = r - i;

        //係数を求める計算（組み合わせと各項の係数の乗算）
        //.toFixed(0)について・・・JSで表現できる桁数の限界を越えた場合の対策
        var num = combinationN(r, localR).toFixed(0) * ( a ** localR) * (b ** i);

        //a、bの指数を入れる。<sup>タグで累乗を表現
        var str = "a" + "<sup>" + localR + "</sup>" + "b" + "<sup>" + i + "</sup>" + "<br>"; 

        //画面出力用の配列（coeffieients）に各項の値を入れていく
        coeffieients.push(num + str);
    }
    return coeffieients;
}
```