Shadow Academy トップ > 我流・物理数学 > コラッツの問題


コラッツの問題

ある数nに対して、その数nが奇数ならば、その数を3倍して1を足す。
一方、その数nが偶数ならば、2で割る、という操作を繰り返す。
この操作は、「コラッツの問題」とか、或いは、固有名詞に依拠しない表現として、
「3n+1問題」とも呼ばれるが、どんな初期値から始めても、
有限回の操作のうちに必ず1に到達する、と予想されており、
これを「コラッツ予想」と呼ぶ。2020年時点において、
未だ数学の未解決問題である。以下のスクリプトは、JavaScriptを用いて、
与えられた自然数の初期値n0に対して、上記の操作を繰り返すものである。




初期値:n0
区切り文字:

計算結果:

操作回数:



ソースコード

collatz.html

<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>

collatz.js

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;
  // 計算結果をテキストエリアへ出力する
};



Shadow Academy トップへ戻る

inserted by FC2 system