ある数nに対して、その数nが奇数ならば、その数を3倍して1を足す。
一方、その数nが偶数ならば、2で割る、という操作を繰り返す。
この操作は、「コラッツの問題」とか、或いは、固有名詞に依拠しない表現として、
「3n+1問題」とも呼ばれるが、どんな初期値から始めても、
有限回の操作のうちに必ず1に到達する、と予想されており、
これを「コラッツ予想」と呼ぶ。2020年時点において、
未だ数学の未解決問題である。以下のスクリプトは、JavaScriptを用いて、
与えられた自然数の初期値n0に対して、上記の操作を繰り返すものである。
<form><!-- getElementByIdを使用する為、name属性を指定しない --> 初期値:<i>n</i><sub>0</sub>=<input type="text" id="input"> <br> 区切り文字: <label for="comma"> <input type="radio" name="separator" id="comma" checked>,(半角コンマ) </label><!-- 半角コンマ --> <label for="rarr"> <input type="radio" name="separator" id="rarr">→(右向き矢印) </label><!-- 右向き矢印 --> <br> <input type="button" value="計算する" onClick="collatz()"><br> 計算結果:<br> <textarea id="output" cols="50" rows="20"></textarea><br> 操作回数:<input type="text" id="counter"> </form> |
var collatz = function(){ var n = parseInt(document.getElementById("input").value); var separator; // 区切り文字を表す変数を宣言 var counter = 0; // 操作回数を記憶する変数を初期値0と共に宣言 var result = ""; // 計算結果を表す変数を空の初期値と共に宣言 // ラジオボタンで選択された入力データ形式に対応する区切り文字を、区切り文字を表す変数separatorに代入 if(document.getElementById("comma").checked == true){ separator = ", "; } // 半角コンマ if(document.getElementById("rarr").checked == true){ separator = "→"; } // 右向き矢印 if(isNaN(n)==true){ // 初期値nの値が半角の数値ではない場合に alert("半角の数値を入力して下さい"); // アラートを表示して return false; // 処理を中断する } else if(n<=0){ // 初期値nの値が自然数ではない場合に alert("数値は、自然数を入力して下さい"); // アラートを表示して return false; // 処理を中断する } else { result = n; } while(n != 1){ result += separator; counter++; // 操作回数は、区切り文字の数に等しい if(n % 2 != 0){ n = 3 * n + 1; } else { n = n / 2; } result += n } document.getElementById("counter").value = counter; // 操作回数をテキストエリアへ出力する document.getElementById("output").value = result; // 計算結果をテキストエリアへ出力する }; |