LoginSignup
0
1

More than 5 years have passed since last update.

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

Last updated at Posted at 2019-01-28

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の階乗の計算は下記のように計算します。


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個を取り出す組み合わせの計算は下記のように計算します。

{}_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;
}
0
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
1