そのルールは単純。
一見、コラッツ予想の計算かな?と思いますが、実はそんなに単純ではありません。数探し さんが書きました:1、偶数なら2で割る
2、奇数なら3倍して1を足す
これを繰り返して●を691コ以上つぶしてください。
まず、「●を691コ以上つぶしてください」と書いてありますが、●がつぶれる条件が明記されていません。すなわち、「未定義」です。
とりあえずやってみましょう。
まずは適当に、「3」を入力すると、「●は7コつぶれました。」と出ました。
「65537」を入力すると、「●は99コつぶれました。」と出ました。
ということは、「(つぶれる●の数)=(コラッツ予想の計算の反復回数)」と予想できます。
しかし、予想はあくまでも予想です。
試しに「96883183」と入力してみます。
すると、コラッツ予想の計算の反復回数は810なのに、なんと「●は748コつぶれました。」と出ました。予想はハズレです。 ところで、この「数探し」のページには、
「数発見者TOP5!」(WebArchive)というページと、
「数発見者!」(WebArchive)というページがあり、
それぞれ●がつぶれた個数の多い順と数の小さい順であると予想できます。
では、本当かどうか検証してみましょう。
数 | 数探しで●がつぶれた個数 | コラッツ予想の反復回数 | 出典
----------------+--------------------------+------------------------+---------------------
456516565122594 | 748 | 827 |
456516565122595 | 748 | 827 |
456516565122584 | 748 | 827 | 数発見者TOP5!
276749658141367 | 697 | 697 |
934030096227116 | 691 | 691 |
----------------+--------------------------+------------------------+---------------------
3732423 | 596 | 596 |
5649499 | 612 | 612 |
8397953 | 592 | 592 |
10011263 | 618 | 618 |
11197270 | 595 | 595 |
45651656512259 | 635 | 635 | 数発見者!
456516565122595 | 748 | 827 |
456516565122594 | 748 | 827 |
601787017641345 | 662 | 662 |
197021973422908 | 681 | 681 |
276749658141367 | 697 | 697 |
934030096227116 | 691 | 691 |
単にカンストだったようです。(なぜこのような一見中途半端な数値でカンストなのかはわかりませんが)
しかし、新たな不自然な点が出てきました。
「数発見者!」のページに載っている数字のほとんどが、●を(一般的な意味で)691コ以上潰していないのに、
このページに登録されている点です。
さらに、例えば●を596コつぶす数字を入力してもダイアログは出ませんでしたが、
●を681コつぶす数字を入力すると、「●が691コ以上つぶれました!」というダイアログが出てきました。
表に載っている数字だからかと思い、表に載っていない「18901151」を入力してみたところ、やはりダイアログが出てきました。 ●を691コつぶす「14934241」を入力してもダイアログが出て、
それぞれ671、661、651、641、631、621、611、601コつぶす
23456487、29921758、37869727、48562939、58237599、13002751、16497899、19906257を入力してもダイアログが出なかったので、
おとぎの国の高橋君の要領で数字の大小関係が入れ替わっている、ということもなさそうです。
もう少し検証してみましょう。
試しに「1234567890123456」と入力してみると「15桁以内にしてください」と怒られてしまったので、
言われた通りに15桁の「999999999999999」を入力します。
すると、なんと●は399コしかつぶれませんでした!この数に対するコラッツ予想の計算の反復回数は567です。 やはり、カンストとは別に、「(●がつぶれる数)=(コラッツ予想の計算の反復回数)」という予想は誤りだったことがわかりました。
[hr]
今回検証用の数を求めたプログラム
#include
#include
const int CC_MAX = 99999999;
const int OUTPUT_MAX = 100000;
int cc(long long n) {
int count = 0;
while (n > 1) {
n = (n % 2 == 1 ? n * 3 + 1 : n / 2);
count++;
}
return count;
}
struct cc_t {
int n, count;
// countの降順、nの昇順で並べ替える用
bool operator cct.count;
}
};
int main(void) {
static cc_t cc_list[CC_MAX];
#ifdef _OPENMP
#pragma omp parallel for schedule(dynamic)
#endif
for (int i = 0; i < CC_MAX; i++) {
cc_list[i].n = i + 1;
cc_list[i].count = cc(i + 1);
}
std::sort(cc_list, cc_list + CC_MAX);
puts("# rank n count");
for (int i = 0; i < OUTPUT_MAX && i < CC_MAX; i++) {
printf("%8d %8d %5d\n", i + 1, cc_list[i].n, cc_list[i].count);
}
if (OUTPUT_MAX < CC_MAX) {
if (OUTPUT_MAX * 2 < CC_MAX) {
putchar('\n');
for (int i = CC_MAX - OUTPUT_MAX; i < CC_MAX; i++) {
printf("%8d %8d %5d\n", i + 1, cc_list[i].n, cc_list[i].count);
}
} else {
for (int i = OUTPUT_MAX; i < CC_MAX; i++) {
printf("%8d %8d %5d\n", i + 1, cc_list[i].n, cc_list[i].count);
}
}
}
return 0;
}
[hr]
今回検証に使用した環境
Windows Vista Home Premium SP2 32ビット
Intel(R) Core(TM)2Duo T8100 @2.10GHz 2.10GHz
RAM 4.00GB
Firefox 31.0