Denoでコラッツの問題を確認してみた
2021/07/10
はてブにあがっていた記事(数学の未解決問題に『1億2000万円』の懸賞金がかけられる→内容は簡単に理解できます。数学自慢の方々挑戦してみて - Togetter)を読んで気になったので、Denoでコラッツの問題を確認してみた
コラッツの問題とは
「任意の正の整数 n をとり、
- n が偶数の場合、n を 2 で割る
- n が奇数の場合、n に 3 をかけて 1 を足す
という操作を繰り返すと、どうなるか」というものである。「どんな初期値から始めても、有限回の操作のうちに必ず 1 に到達する(そして 1→4→2→1 というループに入る)」という主張が、コラッツの予想である。
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/[email protected]/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)