コラッツ予想演算 ブラウザ(BigInt)版

ツール
スポンサーリンク
スポンサーリンク

Excel版簡易確認用のため48bit制限で作りましたが、本格確認用としてJavascriptのBigIntを利用し非常に大きい数値(10進数100桁や環境により1,000桁も可能)で開始したコラッツ数列を求めることができます

本記事に関連する新しいツールがあります(2023/07/05追記)

概要

コラッツ予想演算 ブラウザ(BigInt)版(Collatz Conjecture Calculater BigInt Edition)は、コラッツ予想の数列コラッツ予想[KAI]の数列の10進数と2進数を求めるものです。
主にコラッツ予想とコラッツ予想[KAI]の論理(3n+1と3n’+dが2のべき乗に収束すること)が正しいかを確認するためのものです。

ツール

制限や特徴などは後回しにしてツールから公開します。

コラッツ予想演算 ブラウザ(BigInt)版

ツールはこちら(別タブが開きます)

ご意見、ご要望、不具合などのご連絡

ご意見、ご要望、不具合などのご連絡は次からお願いします。

変更来歴

  • Rev. 1 2021-12-25
    新規公開

制限や特徴

  • 本ツールは、[演算開始]ボタンを押しても通信は発生せず(サーバーアクセスなし)、 ブラウザ(クライアント)内部だけで演算します
    このため、ご利用の環境(ブラウザの種類、マシンのスペックなど)によって、 処理できる桁数の制限が違います
    非常に大きい数値では処理時間と消費メモリが大きくなるため、 正しく動作しない場合がありますのでご了承ください。
  • Excel版では48bit(2進数48桁,10進数だと15桁ぐらい)の制限がありましたが、本ブラウザ版はJavascriptのBigIntを利用することで、非常に大きい数値、10進数100桁や、ご利用の環境(ブラウザの種類、マシンのスペックなど)により10進数1,000桁などで開始してもコラッツ数列を求めることができます
  • 開始時の数値の先頭に 0b (ゼロビー)を付けることで2進数で開始することができます
    ex.) 0b11011 → 10進数で、27 で開始するのと同じ
  • コラッツ予想[KAI]のn'(2進数)とd(2進数)から、n’/dを視覚で分かりやすくするため、下位の対応する”0“を赤で表示します
    (Excel版は、Excelマクロの制限で1文字ずつ色を変えることができなかった)

関連情報

コラッツ予想の式

“2”より”3″が大きいのに、すべての正の整数のどの値で開始しても、nは増加傾向にならず、減少して”1″に到達する(その後”1→4→2→1→…”の無限ループになる)という予想。
このように矛盾した結果にたどり着くのは、何故なのか?

コラッツ予想[KAI]の式

元のコラッツ予想の式の n/2 が2進数では「右に1ビットシフト」であり、繰り返すうちに数値として見るときの基準点が開始時の数値nからずれるため、この式は、そのずれを矯正することで2進数で見た時に視覚的に見やすくするための式です。
詳細は、関連投稿の「徹底解説 コラッツ予想のからくり」を参照してください。

コラッツ予想のからくりを簡単に言うと

関連投稿

徹底解説 コラッツ予想のからくり

これらの投稿は下記の「コラッツ予想をプログラマーが検証してみた」の要点のみ抽出し再構築、説明不足だった部分を加筆してまとめたものです。

#1 特徴&論理編
#2 からくり編
#3 結論&証明編
コラッツ予想のからくりのまとめ

コラッツ予想をプログラマーが検証してみた

#1 要件を確認する
#2 Excelで作ってみた
#3 さらに角度を変えて検証したら・・・!!!
#4 最後に

実施例

以下は、Ryzen 7 PRO 4750GE、メモリ32GB、Firefox 95.0.2 にて実施した例です。

(注) 開始時の値、実施環境(ブラウザの種類、マシンススペックなど)により完走できない場合があります。

「27」で開始した例

「27」で開始すると、最初に”n=1″に到達したSTEP数は、111 で、n’=270 に到達したことが確認できます。

「9を100個」で開始した例

「9を100個」で開始すると、最初に”n=1″に到達したSTEP数は、3,274 で、n’=22,136 に到達したことが確認できます。

「9を1,000個」で開始した例

「9を1,000個」で開始すると、最初に”n=1″に到達したSTEP数は、30,578 で、n’=220,034 に到達したことが確認できます。

ソースコード(2023/01/03追加)

Web開発の経験がある方なら、ソースコードを参照できることはご存じだと思いますが、すべての人がその方法を知っているとは限らないので、ツールのソースコードを下記に示します。
(処理の大部分は、色分けや列の選択などの見た目の処理ですが・・・)

<!DOCTYPE html>
<html lang="ja">
<!-- コラッツ予想演算ブラウザ(BigInt)版 -->
<!-- $Id$ -->
<!-- (C)2021 プログラミングの深淵を求めて https://www.seekabypro.com/ -->
<!-- (C)2021 どらテク(どらぐ~んテクノロジー) https://twitter.com/dratech2020 -->

<head>
<meta charset="UTF-8" />
<meta name="robots" content="noindex" />
<title>コラッツ予想演算 ブラウザ(BigInt)版</title>
<link rel="stylesheet" type="text/css" href="./css/collatz_conjecture.css">
<script src="https://ajax.googleapis.com/ajax/libs/jquery/3.6.0/jquery.min.js" type="text/javascript"></script>
<script src="./js/collatz_conjecture.js" type="text/javascript"></script>
</head>
<body>

<div id="collatz_conjecture">
    <h1>コラッツ予想演算 ブラウザ(BigInt)版<br />(Collatz Conjecture Calculater BigInt Edition)</h1>
    <a href="/2021/12/25/collatz_browser/">ツールの概要などはこちら</a>
    <hr />
<div>
スポンサーリンク<br />
<!-- タイムセール -->
<script async src="https://pagead2.googlesyndication.com/pagead/js/adsbygoogle.js?client=ca-pub-8619355229490992"
     crossorigin="anonymous"></script>
<ins class="adsbygoogle"
     style="display:block"
     data-ad-format="fluid"
     data-ad-layout-key="-fb+5w+4e-db+86"
     data-ad-client="ca-pub-8619355229490992"
     data-ad-slot="7816371727"></ins>
<script>
     (adsbygoogle = window.adsbygoogle || []).push({});
</script>
<!-- <iframe src="https://rcm-fe.amazon-adsystem.com/e/cm?o=9&p=48&l=ur1&category=monthlydealevent&banner=1HPM1BDB3KH5W49MXS82&f=ifr&linkID=46bf41ec4f9a9e837584c19e1949d087&t=dratech202006-22&tracking_id=dratech202006-22" width="728" height="90" scrolling="no" border="0" marginwidth="0" style="border:none;" frameborder="0" sandbox="allow-scripts allow-same-origin allow-popups allow-top-navigation-by-user-activation"></iframe> -->
<iframe src="https://rcm-fe.amazon-adsystem.com/e/cm?o=9&p=48&l=ur1&category=hatsuuri&banner=09FH2BYMZHPBEA9ARAR2&f=ifr&linkID=27171199ed70ecd169ba1d4c89a2de36&t=dratech202006-22&tracking_id=dratech202006-22" width="728" height="90" scrolling="no" border="0" marginwidth="0" style="border:none;" frameborder="0" sandbox="allow-scripts allow-same-origin allow-popups allow-top-navigation-by-user-activation"></iframe>
<div><span><a href="https://amzn.to/3XjWQcb">Amazon Prime Video:シン・ウルトラマン</a><br><a href="https://amzn.to/3X9OgwN">Amazon Prime Video:DAICON FILM版 帰ってきたウルトラマン</a></span></div>
</div>
    <hr />
    <div id="cc_start_input">
        開始の数値入力(先頭に 0b を付けると2進数として扱います)<br />
        <input id="cc_input" name="cc_input" type="text" onkeypress="return input_onkeypress();">
        <span id="cc_input_length">0</span>桁
        <input id="cc_start" name="cc_start" type="button" value="演算開始">
        <br />
        <span><font color="RED">※半角数値(10進数は'0'~'9'、2進数は'0','1')以外は削除して処理します。</font></span>
        <br />
        <input id="cc_clear" name="cc_clear" type="button" value="クリア">
        <span><font color="RED">※入力と合わせて演算結果もクリアされます。</font></span>
    </div>
    <hr />
    <div class="cc_goal_step">
        <span>
            <span>
                <font color="RED">
                    ※無限ループ防止のため、n=1に
                    <span id="cc_goal_after">3</span>
                    回到達したとき、または、STEPが
                    <span id="cc_step_limit">MAX</span>
                    になるまで実行します。
                </font>
            </span>
            <br />
            GOAL-STEP :
            <span id="cc_goal_step">0</span>
            <span>(最初にn=1となったSTEP)</span>
        </span>
    </div>
    <div class="cc_goal_kai">
        <span>
            GOAL-n'   :
            2<sup id="cc_goal_kai_bin0_count">0</sup>=
            <span id="cc_goal_kai_dec">1</span>
        </span>
    </div>
    <div class="cc_count_even">
        <span>
            COUNT-EVEN:
            <span id="cc_count_even">0</span>
            回(STEP=0分は含まず、最初にn=1到達となるまで)
        </span>
    </div>
    <div class="cc_count_odd">
        <span>
            COUNT-ODD :
            <span id="cc_count_odd">0</span>
            回(STEP=0分は含まず、最初にn=1到達となるまでで、到達分を含む)
        </span>
    </div>
    <div class="cc_max_n_step">
        <span>
            <span>n-MAX-STEP:</span>
            <span id="cc_n_max_step">0</span>
        </span>
    </div>
    <div class="cc_max_n">
        <span>
            <span>n-MAX     :</span>
            <span id="cc_n_max">0</span>
        </span>
    </div>
    <div class="cc_time">
        <span>
            Processing Time:
            <span id="cc_proc_time">0(ms)</span>
            <br />
        </span>
    </div>
    <hr />
    <div class="cc_display">
        <span>
            <span>
                表示指定
                <font color="RED">
                    ※オフにしたものは見えないだけで、処理時間や消費メモリは小さくなりません
                </font>
            </span>
            <br />
            <div class="cc_display_collatz">
                <span>コラッツ予想の列</span>
                <input id="cc_display_all_on" name="cc_display_all_on" type="button" value="全表示">
                <input id="cc_display_all_of" name="cc_display_all_of" type="button" value="全非表示">
                <br />
                <label class="cc_label"><input id="cc_display_item_step" name="cc_item_step" type="checkbox" checked>STEP</label>
                <label class="cc_label"><input id="cc_display_item_dec" name="cc_item_dec" type="checkbox" checked>n(10進数)</label>
                <label class="cc_label"><input id="cc_display_item_odd_even" name="cc_item_odd_even" type="checkbox" checked>E/O</label>
                <label class="cc_label"><input id="cc_display_item_dec_length" name="cc_item_dec_length" type="checkbox" checked>n(桁数)</label>
                <label class="cc_label"><input id="cc_display_item_bin" name="cc_item_bin" type="checkbox" checked>n(2進数)</label>
                <label class="cc_label"><input id="cc_display_item_bin_length" name="cc_item_bin_length" type="checkbox" checked>n(bit数)</label>
                <label class="cc_label"><input id="cc_display_item_bin1_count" name="cc_item_bin1_count" type="checkbox" checked>n("1"数)</label>
            </div>
            
            <div class="cc_display_collatz_kai">
                <span>コラッツ予想[KAI]の列</span>
                <input id="cckai_display_all_on" name="cckai_display_all_on" type="button" value="全表示">
                <input id="cckai_display_all_of" name="cckai_display_all_of" type="button" value="全非表示">
                <br />
                <label class="cc_label"><input id="cc_display_kai_item_dec" name="cckai_item_dec" type="checkbox" checked>n'(10進数)</label>
                <label class="cc_label"><input id="cc_display_kai_item_dec_length" name="cckai_item_dec_length" type="checkbox" checked>n'(桁数)</label>
                <label class="cc_label"><input id="cc_display_kai_item_d_dec" name="cckai_item_d_dec" type="checkbox" checked>d(10進数)</label>
                <label class="cc_label"><input id="cc_display_kai_item_d_dec_length" name="cckai_item_d_dec_length" type="checkbox" checked>d(桁数)</label>
                <label class="cc_label"><input id="cc_display_kai_item_bin" name="cckai_item_bin" type="checkbox" checked>n'(2進数)</label>
                <label class="cc_label"><input id="cc_display_kai_item_bin_length" name="cckai_item_bin_length" type="checkbox" checked>n'(bit数)</label>
                <label class="cc_label"><input id="cc_display_kai_item_d_bin" name="cckai_item_d_bin" type="checkbox" checked>d(2進数)</label>
                <label class="cc_label"><input id="cc_display_kai_item_d_bin_length" name="cckai_item_d_bin_length" type="checkbox" checked>d(bit数)</label>
                <label class="cc_label"><input id="cc_display_kai_item_d_bin0_count" name="cckai_item_d_bin0_count" type="checkbox" checked>d("0"数)</label>
            </div>
            <div class="cc_display_item_width">
                <span>列幅指定:</span>
                <label class="cc_label"><input id="cc_display_item_width1" name="cc_display_item_width" type="radio" value="all" checked>制限なし</label>
                <label class="cc_label"><input id="cc_display_item_width2" name="cc_display_item_width" type="radio" value="scroll" >制限あり(内部スクロール表示)</label>
            </div>
            <div class="cc_display_line">
                <span>行スクロール指定:</span>
                <label class="cc_label"><input id="cc_display_line1" name="cc_display_line" type="radio" value="scroll" checked>内部スクロール表示</label>
                <label class="cc_label"><input id="cc_display_line2" name="cc_display_line" type="radio" value="all" >全行表示</label>
            </div>
        </span>
    </div>
<hr />
</div>

<div class="cc_list">
ここに演算結果が入ります。
</div>

<hr />
スポンサーリンク<br />
<div>
<script async src="https://pagead2.googlesyndication.com/pagead/js/adsbygoogle.js?client=ca-pub-8619355229490992"
     crossorigin="anonymous"></script>
<ins class="adsbygoogle"
     style="display:block"
     data-ad-format="fluid"
     data-ad-layout-key="-fb+5w+4e-db+86"
     data-ad-client="ca-pub-8619355229490992"
     data-ad-slot="7816371727"></ins>
<script>
     (adsbygoogle = window.adsbygoogle || []).push({});
</script>
</div>

<hr />
(C)2021 プログラミングの深淵を求めて
<a href="https://www.seekabypro.com/">https://www.seekabypro.com/</a>
<br />
(C)2021 どらテク(どらぐ~んテクノロジー)
Twitter:
<a href="https://twitter.com/dratech2020">@dratech2020</a>
<a href="https://twitter.com/dratech2020">https://twitter.com/dratech2020</a>
<br />
</body>
</html>
// コラッツ予想演算ブラウザ(BigInt)版(Collatz Conjecture Calculater BigInt Edition)
// $Id$
// (C)2021 プログラミングの深淵を求めて https://www.seekabypro.com/
// (C)2021 どらテク(どらぐ~んテクノロジー) https://twitter.com/dratech2020
const CC_RADIX=2n;
const CC_ODD=3n;
const CC_GOAL_AFTER=3;
const CC_STEP_LIMIT=65535;
const CC_STRING_ODD ="ODD";
const CC_STRING_EVEN="EVN";
const CC_COLOR_HEAD ="#BDD7EE";
const CC_COLOR_ODD  ="#FFF2CC";
const CC_COLOR_EVEN ="#DDEBF7";
const CC_COLOR_N_MAX="#C6E0B4";
const CC_COLOR_GOAL ="#C7A1E3";
//
const CC_CLASS_STEP				= "cc_item_step";
const CC_CLASS_DEC				= "cc_item_dec";
const CC_CLASS_ODD_EVEN 		= "cc_item_odd_even";
const CC_CLASS_DEC_LENGTH		= "cc_item_dec_length";
const CC_CLASS_BIN				= "cc_item_bin";
const CC_CLASS_BIN_LENGTH		= "cc_item_bin_length";
const CC_CLASS_BIN1_COUNT		= "cc_item_bin1_count";
const CC_CLASS_KAI_DEC			= "cckai_item_dec";
const CC_CLASS_KAI_DEC_LENGTH	= "cckai_item_dec_length";
const CC_CLASS_KAI_D_DEC		= "cckai_item_d_dec";
const CC_CLASS_KAI_D_DEC_LENGTH	= "cckai_item_d_dec_length";
const CC_CLASS_KAI_BIN			= "cckai_item_bin";
const CC_CLASS_KAI_BIN_LENGTH	= "cckai_item_bin_length";
//const CC_CLASS_KAI_BIN0_COUNT	= "cckai_item_bin0_count";	//CC_CLASS_KAI_D_BIN0_COUNTと同じ結果となる
const CC_CLASS_KAI_D_BIN		= "cckai_item_d_bin";
const CC_CLASS_KAI_D_BIN_LENGTH	= "cckai_item_d_bin_length";
const CC_CLASS_KAI_D_BIN0_COUNT	= "cckai_item_d_bin0_count";
//
const CC_DATA_STEP				= "STEP";
const CC_DATA_DEC				= "DEC";
const CC_DATA_ODD_EVEN			= "ODD_EVEN";
const CC_DATA_DEC_LENGTH		= "DEC_LENGTH";
const CC_DATA_BIN				= "BIN";
const CC_DATA_BIN_LENGTH		= "BIN_LENGTH";
const CC_DATA_BIN1_COUNT		= "BIN1_COUNT";
const CC_DATA_KAI_DEC			= "KAI_DEC";
const CC_DATA_KAI_DEC_LENGTH	= "KAI_DEC_LENGTH";
const CC_DATA_KAI_D_DEC 		= "D_DEC";
const CC_DATA_KAI_D_DEC_LENGTH	= "D_DEC_LENGTH";
//
const CC_COLUMN = {
	//head_tag:"<div>",
	head_class:"cc_head",
	//data_tag:"<div>",
	data_class:"cc_item",
	row:[
		{
			tag:"<span>",
			class:CC_CLASS_STEP,
			text:"STEP",
		},
		{
			tag:"<span>",
			class:CC_CLASS_DEC,
			text:"n(10進数)",
		},
		{
			tag:"<span>",
			class:CC_CLASS_ODD_EVEN,
			text:"E/O",
		},
		{
			tag:"<span>",
			class:CC_CLASS_DEC_LENGTH,
			text:"n(桁数)",
		},
		{
			tag:"<span>",
			class:CC_CLASS_BIN,
			text:"n(2進数)",
		},
		{
			tag:"<span>",
			class:CC_CLASS_BIN_LENGTH,
			text:"n(bit数)",
		},
		{
			tag:"<span>",
			class:CC_CLASS_BIN1_COUNT,
			text:"n(\"1\"数)",
		},
		{
			tag:"<span>",
			class:CC_CLASS_KAI_DEC,
			text:"n'(10進数)",
		},
		{
			tag:"<span>",
			class:CC_CLASS_KAI_DEC_LENGTH,
			text:"n'(桁数)",
		},
		{
			tag:"<span>",
			class:CC_CLASS_KAI_D_DEC,
			text:"d(10進数)",
		},
		{
			tag:"<span>",
			class:CC_CLASS_KAI_D_DEC_LENGTH,
			text:"d(桁数)",
		},
		{
			tag:"<span>",
			class:CC_CLASS_KAI_BIN,
			text:"n'(2進数)",
		},
		{
			tag:"<span>",
			class:CC_CLASS_KAI_BIN_LENGTH,
			text:"n'(bit数)",
		},
		{
			tag:"<span>",
			class:CC_CLASS_KAI_D_BIN,
			text:"d(2進数)",
		},
		{
			tag:"<span>",
			class:CC_CLASS_KAI_D_BIN_LENGTH,
			text:"d(bit数)",
		},
		{
			tag:"<span>",
			class:CC_CLASS_KAI_D_BIN0_COUNT,
			text:"d(\"0\"数)",
		},
	],
}

//
jQuery(document).ready(function() {
	jQuery("#cc_goal_after").text(CC_GOAL_AFTER.toLocaleString());
	jQuery("#cc_step_limit").text(CC_STEP_LIMIT.toLocaleString());
	cc_oninput();
	jQuery("#cc_input").on("input", function() {
		cc_oninput();
	});
	jQuery("#cc_start").on("click", function() {
		cc_onclike();
	});
	jQuery("#cc_clear").on("click", function() {
		jQuery("#cc_input").val("");
		cc_oninput();
		jQuery(".cc_list").remove();
		let cc_list = jQuery("<div>",{ class:"cc_list", text:"ここに演算結果が入ります。", });
		jQuery("#collatz_conjecture").append(cc_list);
	});
	jQuery("#cc_display_all_on").on("click", function() {
		cc_display_checkboxn("cc_display_item_",true);
	});
	jQuery("#cc_display_all_of").on("click", function() {
		cc_display_checkboxn("cc_display_item_",false);
	});
	jQuery("#cckai_display_all_on").on("click", function() {
		cc_display_checkboxn("cc_display_kai_item_",true);
	});
	jQuery("#cckai_display_all_of").on("click", function() {
		cc_display_checkboxn("cc_display_kai_item_",false);
	});

	jQuery("input:checkbox[id ^= 'cc_display_']").on("change", function() {
		cc_display_column(jQuery(this).attr("name"));
	});
	jQuery("input:radio[id ^= 'cc_display_item_width']").on("change", function() {
		cc_display_item_width(jQuery(this).attr("name"));
	});
	jQuery("input:radio[id ^= 'cc_display_line']").on("change", function() {
		cc_display_row(jQuery(this).attr("name"));
	});
});

//
function cc_oninput() {
	let inp=jQuery("#cc_input").val();
	let len=0;
	if ( inp.indexOf("0b") === 0 ) {
		len=inp.replace(/^0b/,"").replace(/[^01]/g,"").length.toLocaleString();
	} else {
		len=inp.replace(/[^0-9]/g,"").length.toLocaleString();
	}
	jQuery("#cc_input_length").text(len);
}
//
function cc_onclike() {
	const n_start = jQuery("#cc_input").val();
	//
	let n=0n;
	if ( n_start.indexOf("0b") === 0 ) {
		n=BigInt("0b"+n_start.replace(/[^01]/g,""));
	} else {
		n=BigInt(n_start.replace(/[^0-9]/g,""));
	}
	if ( n == 0n ) {
		window.alert("入力値が0または数値以外です。");
		return false;
	}
	if ( n.toString().length > 100 ) {
		if ( !window.confirm("100桁より大きい数値が指定されました。\n処理時間、消費メモリが大きくなり正しく動作しない可能性があります。\n続けますか?") ) {
			return false;
		}
	}
	let proc_start_time = performance.now();
	let n_max=n;
	let n_max_step=0;
	let kai=n;
	let d=1n;
	let goal_after=0;
	let goal_kai=0;
	let step=0;
	let goal_step=0;
	let count_even=0;
	let count_odd=0;
	//
	let old_cc_list = jQuery(".cc_list");
	if ( old_cc_list.length > 0 ) {
		old_cc_list.remove();
	}
	//
	let collatz_conjecture=jQuery("#collatz_conjecture");
	let cc_list = jQuery("<div>",{ class:"cc_list", });
	//cc_list.scrollTop(0);
	//cc_list.scrollLeft(0);
	collatz_conjecture.append(cc_list);
	//
	let cc_table = jQuery("<table>",{ class:"cc_table", });
	cc_table.append(cc_make_head());
	//STEP0
	cc_table.append(cc_make_item(step,n,kai,d));
	do {
		let even_odd=0n;
		step++;
		[n,even_odd] = cc_exec(n);
		if ( n > n_max ) {
			n_max = n;
			n_max_step = step;
		}
		[kai,d] = cckai_exec(kai,d);
		cc_table.append(cc_make_item(step,n,kai,d));
		if ( goal_after == 0 ) {
			if ( even_odd == 0n ) {
				count_even++;
			} else {
				count_odd++;
			}
		}
		if ( n == 1n ) {
			if ( goal_after == 0 ) {
				goal_step=step;
				goal_kai=kai;
			}
			goal_after++;
		}
	} while( ((n>1n) || goal_after<CC_GOAL_AFTER) && (step<CC_STEP_LIMIT) );
	cc_list.append(cc_table);
	//
	jQuery("#cc_goal_step").text(goal_step.toLocaleString());
	jQuery("#cc_n_max").text(n_max.toLocaleString());
	jQuery("#cc_n_max_step").text(n_max_step.toLocaleString());
	let goal_kai_bin = goal_kai.toString(2);
	if ( goal_kai_bin.replace(/[^1]/g,"") == "1" ) {
		jQuery("#cc_goal_kai_bin0_count").text(goal_kai_bin.replace(/[^0]/g,"").length.toLocaleString());
		jQuery("#cc_goal_kai_dec").text(goal_kai.toLocaleString());
	} else {
		jQuery("#cc_goal_kai_bin0_count").text("Not Exponentiation");
		jQuery("#cc_goal_kai_dec").text("");
		let tag = jQuery(
			"<font>",{ 
			color:"RED",
			text:goal_kai.toLocaleString(), 
		});
		tag.css("font-weight","bold");
		jQuery("#cc_goal_kai_dec").append(tag);
	}
	jQuery("#cc_count_even").text(count_even.toLocaleString());
	jQuery("#cc_count_odd").text(count_odd.toLocaleString());
	//
	cc_bgcolor(".cc_item_odd_even");
	//
	cc_n_max_bgcolor(n_max_step,".cc_item_dec",".cc_item_step");
	//
	cc_goal_bgcolor(".cc_item_dec");
	cc_goal_bgcolor(".cc_item_bin1_count");
	//
	jQuery.each(CC_COLUMN["row"], function(index,column) {
		cc_display_column(column["class"]);
	});
	//
	cc_display_item_width("cc_display_item_width");
	cc_display_row("cc_display_line");
	//
	let proc_end_time = performance.now();
	jQuery("#cc_proc_time").text((proc_end_time - proc_start_time).toLocaleString()+"(ms)");
}

//
function cc_display_checkboxn(cn,flag) {
	let chk = jQuery("input:checkbox[id ^= '"+cn+"']");
	chk.prop("checked",flag);
	chk.each(function(index) {
		cc_display_column(jQuery(this).attr("name"));
	});
}

//
function cc_display_column(cn) {
	let inp = jQuery("input:checkbox[name = '"+cn+"']");
	let obj = jQuery("."+cn).parent();
	if ( inp.is(":checked") == false ) {
		obj.css("display","none");
	} else {
		obj.css("display","");
	}
}

//
function cc_display_item_width(cn) {
	let chk = jQuery("input:radio[name = '"+cn+"']").filter(':checked');
	let val = jQuery(chk).val();
	jQuery.each([
		CC_CLASS_DEC,
		CC_CLASS_BIN,
		CC_CLASS_KAI_DEC,
		CC_CLASS_KAI_D_DEC,
		CC_CLASS_KAI_BIN,
		CC_CLASS_KAI_D_BIN,
	],function(index,value) {
		let obj = jQuery("."+value);
		if ( val == "all" ) {
			obj.css("max-width","");
			obj.css("overflow","");
			obj.css("scrollbar-width","");
		} else {
			obj.css("max-width","140px");
			obj.css("overflow","auto");
			obj.css("scrollbar-width","thin");
		}
	});
}

//
function cc_display_row(cn) {
	let chk = jQuery("input:radio[name = '"+cn+"']").filter(':checked');
	let obj = jQuery(".cc_list");
	let val = jQuery(chk).val();
	if ( val == "all" ) {
		obj.css("max-height","");
	} else {
		obj.css("max-height","480px");
	}
}

//
function cc_exec(n) {
	let bit0 = n & 1n;
	if ( bit0 == 0n ) {
		//n = n / CC_RADIX;
		n >>= 1n;
	} else {
		n = CC_ODD * n + 1n;
	}
	let even_odd = n & 1n;
	return [n,even_odd];
}

//
function cckai_exec(n,d) {
	let bit_mask = n & d;
	if ( bit_mask == 0n ) {
		//d *= CC_RADIX;
		d <<= 1n;
	} else {
		n = CC_ODD * n + d;
	}
	return [n,d];
}

//
function cc_odd_even(n) {
	let bit0 = n & 1n;
	let oe = CC_STRING_ODD;
	if ( bit0 == 0n ) {
		oe = CC_STRING_EVEN;
	}
	return oe;
}

//
function cc_make_head() {
	let cc_item = jQuery("<tr>",{ class:CC_COLUMN["head_class"], });
	jQuery.each(CC_COLUMN["row"], function(index,column) {
		let cls = "cc_th";
		if ( column["class"].indexOf("cckai_") === 0 ) {
			cls = "cc_th_kai";
		}
		let td = jQuery("<th>",{ class:cls, });
		let item=jQuery(column["tag"],{ 
			class:column["class"],
			text:column["text"], 
			style:"text-align:center;"
		});
		td.append(item);
		cc_item.append(td);
	});
	return cc_item;
}

//
function cc_make_item(step,n,kai,d,) {
	let cc_item = jQuery("<tr>",{ class:CC_COLUMN["data_class"], });
	let n2_string = n.toString(2);
	let kai2_string = kai.toString(2);
	let d2_string = d.toString(2);
	let d2_0_string = d2_string.replace(/[^0]/g,"");
	//
	jQuery.each(CC_COLUMN["row"], function(index,column) {
		let cls = "cc_td";
		if ( column["class"].indexOf("cckai_") === 0 ) {
			cls = "cc_td_kai";
		}
		let td = jQuery("<td>",{ class:cls, });
		let text="";
		if ( column["class"] == CC_CLASS_STEP ) {
			text=step.toLocaleString();
		} else if ( column["class"] == CC_CLASS_DEC ) {
			text=n.toLocaleString();
		} else if ( column["class"] == CC_CLASS_ODD_EVEN ) {
			text=cc_odd_even(n);
		} else if ( column["class"] == CC_CLASS_DEC_LENGTH ) {
			text=n.toString().length;
		} else if ( column["class"] == CC_CLASS_BIN ) {
			text=n2_string;
		} else if ( column["class"] == CC_CLASS_BIN_LENGTH ) {
			text=n2_string.length;
		} else if ( column["class"] == CC_CLASS_BIN1_COUNT ) {
			text=n2_string.replace(/[^1]/g,"").length;
		} else if ( column["class"] == CC_CLASS_KAI_DEC ) {
			text=kai.toLocaleString();
		} else if ( column["class"] == CC_CLASS_KAI_DEC_LENGTH ) {
			text=kai.toString().length;
		} else if ( column["class"] == CC_CLASS_KAI_D_DEC ) {
			text=d.toLocaleString();
		} else if ( column["class"] == CC_CLASS_KAI_D_DEC_LENGTH ) {
			text=d.toString().length;
		} else if ( column["class"] == CC_CLASS_KAI_BIN ) {
			//AFTER
		} else if ( column["class"] == CC_CLASS_KAI_BIN_LENGTH ) {
			text=kai2_string.length;
		} else if ( column["class"] == CC_CLASS_KAI_D_BIN ) {
			//AFTER
		} else if ( column["class"] == CC_CLASS_KAI_D_BIN_LENGTH ) {
			text=d2_string.length;
		} else if ( column["class"] == CC_CLASS_KAI_D_BIN0_COUNT ) {
			text=d2_0_string.length;
		}
		//
		if ( column["class"] == CC_CLASS_KAI_BIN ) {
			let regexp = new RegExp(d2_0_string+"$");
			let kai2_0_string = kai2_string.replace(regexp,"");
			let kai2_0_span = jQuery(column["tag"],{ 
				class:column["class"],
				text:kai2_0_string, 
			});
			kai2_0_span.append(jQuery("<font>",{ 
				color:"RED",
				text:d2_0_string, 
			}));
			td.append(kai2_0_span);
			cc_item.append(td);
		} else if ( column["class"] == CC_CLASS_KAI_D_BIN) {
			let d2_0_span = jQuery(column["tag"],{ 
				class:column["class"],
				text:"1", 
			});
			d2_0_span.append(jQuery("<font>",{ 
				color:"RED",
				text:d2_0_string, 
			}));
			td.append(d2_0_span);
			cc_item.append(td);
		} else {
			td.append(jQuery(column["tag"],{ 
				class:column["class"],
				text:text, 
			}));
			cc_item.append(td);
		}
	});
	return cc_item;
}

//
function cc_bgcolor(c) {
	let max=0;
	jQuery(c).each(function(index) {
		if ( index == 0 ) {
			jQuery(this).parent().parent().css("background-color",CC_COLOR_HEAD);
		} else {
			let bgcolor=CC_COLOR_EVEN;
			let oe = jQuery(this).text();
			if ( oe == CC_STRING_ODD ) {
				bgcolor=CC_COLOR_ODD;
			}
			jQuery(this).parent().parent().css("background-color",bgcolor);
		}
	});
}

//
function cc_n_max_bgcolor(max_step,dec,step) {
	let dec_obj = jQuery(dec);
	let step_obj = jQuery(step);
	let step_text = jQuery(step_obj[max_step+1]).text();
	if ( step_text == max_step ) {
		jQuery(dec_obj[max_step+1]).parent().css("background-color",CC_COLOR_N_MAX);
	}
}

//
function cc_goal_bgcolor(c) {
	let obj = jQuery(c);
	jQuery(c).each(function(index) {
		if ( index > 0 ) {
			let text = jQuery(this).text();
			if ( text == 1 ) {
				jQuery(this).parent().css("background-color",CC_COLOR_GOAL);
			}
		}
	});
}


//キーコードを応答する
function get_keycode(e) {
	if (!e)  e = window.event;
	return e.keyCode;
}

//onkeypress向け
function input_onkeypress(obj,value,ev) {
	let c = get_keycode(ev);
	if (c == 13) {
		cc_onclike();
		return false;
	} else {
		return true;
	}
}
/* コラッツ予想演算ブラウザ(BigInt)版(Collatz Conjecture Calculater BigInt Edition) */
/* $Id$ */
/* (C)2021 プログラミングの深淵を求めて https://www.seekabypro.com/ */
/* (C)2021 どらテク(どらぐ~んテクノロジー) https://twitter.com/dratech2020 */

body,
#collatz_conjecture {
	margin: 0px;
	padding: 2px;
	font-family: "MS ゴシック",monospace,Helvetica;
	font-size: 12pt;
}

.cc_label {
	line-height: 1.75em;
	padding: 0.1em;
	cursor: pointer;
	border: 1px solid #CCCCCC;
	border-radius: 0.25em;
}

.cc_label:hover {
	border:1px solid #FF6600;
	background:#FFFFCC;
	border-radius: 0.25em;
}

#cc_input {
	font-family: "MS ゴシック",monospace,Helvetica;
	text-align: right;
	width: 400px;
	font-size: 12pt;
}

#cc_start_input {
	white-space: nowrap;
	overflow: auto;
	scrollbar-width: thin;
	display: block;
}

#cc_start,
#cc_display_all_on,
#cckai_display_all_on {
	color: #0000AA;
}

#cc_clear,
#cc_display_all_of,
#cckai_display_all_of {
	color: #FF0000;
}

.cc_goal_step,
.cc_goal_kai,
.cc_max_n ,
.cc_max_n_step ,
.cc_time,
.cc_display,
.cc_display_item_width,
.cc_display_line {
	font-size: 12pt;
	white-space: nowrap;
	overflow: auto;
	scrollbar-width: thin;
	display: block;
}

.cc_display_collatz,
.cc_display_collatz_kai,
.cc_display_item_width {
	margin-bottom: 4px;
	overflow: auto;
	scrollbar-width: thin;
}

.cc_display_collatz {
	border:2px solid #000000;
}

.cc_display_collatz_kai {
	border:2px solid #008000;
}

.cc_display_item_width {
	border:2px solid #000000;
}

.cc_display_line {
	border:2px solid #0000FF;
}

#cc_count_even,
#cc_count_odd,
#cc_goal_step,
#cc_n_max {
	text-shadow: 1px 1px 1px black;
	font-weight: bold;
}

#cc_count_even {
	color: #DDEBF7;
}

#cc_count_odd {
	color: #FFF2CC;
}

#cc_goal_step {
	color: #C7A1E3;
}

#cc_n_max {
	color: #C6E0B4;
}

.cc_list {
	margin: 0px;
	padding: 2px;
	font-size: 9pt;
	border:2px solid #0000FF;
	white-space: nowrap;
	width: auto;
	/* max-height: 480px; //js側 */
	overflow: auto;
	scrollbar-width: thin;
	display: block;
}

.cc_table {
	border-collapse: collapse;
	border-spacing: 0;
	border: none;
	padding: 0px;
	margin: 0px;
	width 100%;
}

.cc_item,
.cc_head {
	padding: 0px;
	vertical-align: top;
}

.cc_tr, .cc_th, .cc_td, .cc_th_kai, .cc_td_kai  {
	border:2px solid #000000;
	vertical-align: top;
	font-weight: normal;
}

.cc_th_kai, .cc_td_kai  {
	border:2px solid #008000;
}

.cc_item_step,
.cc_item_dec,
.cc_item_odd_even,
.cc_item_dec_length,
.cc_item_bin,
.cc_item_bin_length,
.cc_item_bin1_count,
.cckai_item_dec,
.cckai_item_dec_length,
.cckai_item_d_dec,
.cckai_item_d_dec_length,
.cckai_item_bin,
.cckai_item_bin_length,
.cckai_item_bin0_count,
.cckai_item_d_bin,
.cckai_item_d_bin_length,
.cckai_item_d_bin0_count {
	padding: 1px;
	text-align: right;
	/* border:1px solid #000000; */
	display: block;
	vertical-align: top;
}

.cckai_item_dec,
.cckai_item_dec_length,
.cckai_item_d_dec,
.cckai_item_d_dec_length,
.cckai_item_bin,
.cckai_item_bin_length,
.cckai_item_bin0_count,
.cckai_item_d_bin,
.cckai_item_d_bin_length,
.cckai_item_d_bin0_count {
	/* border:1px solid #008000; */
}

コメント

タイトルとURLをコピーしました