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)版
ご意見、ご要望、不具合などのご連絡
ご意見、ご要望、不具合などのご連絡は次からお願いします。
- コメント
本投稿への コメントを書き込む からのご連絡してください。コメントは認証方式となっており、当方認証しないと公開表示されません。
公開を希望されない方はその旨ご連絡ください。 - Twitter
@dratech2020 https://twitter.com/dratech2020 の該当ツイートに返信するか、ハッシュタグ「#コラッツ予想のからくり #プログラミングの深淵を求めて」を付けてツイートしてください。
(すぐに気が付かない場合がありますので、ご了承ください)
変更来歴
- 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; */
}
コメント