JavaScript入門者によるコード作成練習です。
趣味の高校数学をネタにJavaScriptで簡単なアプリを作ります。
初心者による手探りのコードなので、もっといい方法や間違いがあればどしどしツッコミ下さい。
今回は二項定理(Binomial theorem)のアルゴリズムをJavaScriptで表現しました。
使用したソフトはVisual Studio Codeのみ。
言語は簡単はHTMLとJavaScriptです。
二項定理のキモは組み合わせ(Combination)の計算です。
組み合わせの計算のキモは階乗(Factorial)の計算です。
そのため、基本的な構造は、1,階乗の計算をする関数を作成、2,組み合わせの計算をする関数を作成、3,二項定理を計算する関数の作成、の3点となります。
1,階乗の計算をする関数
//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,組み合わせの計算をする関数
//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,二項定理の計算をする関数
//二項定理
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>タグを使って各項の指数を表します。
次に画面からの数値取得とそれを返す関数を書きます。
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;
}
<!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で表現するアプリの説明を終わります。
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;
}