高木のブログ

Denoでコラッツの問題を確認してみた

2021/07/10

はてブにあがっていた記事(数学の未解決問題に『1億2000万円』の懸賞金がかけられる→内容は簡単に理解できます。数学自慢の方々挑戦してみて - Togetter)を読んで気になったので、Denoでコラッツの問題を確認してみた

コラッツの問題とは

「任意の正の整数 n をとり、

  • n が偶数の場合、n を 2 で割る
  • n が奇数の場合、n に 3 をかけて 1 を足す

という操作を繰り返すと、どうなるか」というものである。「どんな初期値から始めても、有限回の操作のうちに必ず 1 に到達する(そして 1→4→2→1 というループに入る)」という主張が、コラッツの予想である。

コラッツの問題 - Wikipedia

Deno(TypeScript)で確認する

collatz.ts
export function collatz(number: number): number {
  if (number % 2 === 0) {
    return number / 2;
  } else {
    return number * 3 + 1;
  }
}
app.ts
import { collatz } from "./collatz.ts";

let number = Number(Deno.args[0]);

while (number > 1) {
  console.log(number);
  number = collatz(number);
}

console.log(number);
$ deno run app.ts 6
6
3
10
5
16
8
4
2
1
$ deno run app.ts 11
11
34
17
52
26
13
40
20
10
5
16
8
4
2
1

テスト

ちゃんとテストも書いた

collatz_test.ts
import { assertEquals } from "https://deno.land/std@0.97.0/testing/asserts.ts";
import { collatz } from "./collatz.ts";

Deno.test("collatz(2)", () => {
  assertEquals(collatz(2), 1);
});

Deno.test("collatz(3)", () => {
  assertEquals(collatz(3), 10);
});
$ deno test collatz_test.ts
test collatz(2) ... ok (8ms)
test collatz(3) ... ok (6ms)

test result: ok. 2 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out (36ms)

ytkg

Written by ytkg, Twitter, GitHub