うさぎとかめでループしているか判断する?コンピュータ理工学(CS)の面白さ #1

はじめに

こんにちは!山梨大学工学部コンピュータ理工学科4年の木島です。学生寮「芙蓉寮」に住んでいます。
今回はCS(コンピュータ理工学)の分野をご紹介します。
CSというと最近はAI(人工知能)ばかりが注目されがちですが、AIに直接は関係しないところでも面白い世界は広がっているのです。

ところで、皆さんは以下の数式を見て何か気づくことはありますか?

1/7=0.142857142857…
5/108=0.04629629…

実はこれらは、同じ数字の並びが無限に繰り返される「循環小数」になる割り算です。
人間がこれをみた時、直感的にループしているなと判断するのは簡単です。
では、コンピュータにこのループを見つけさせるには、どうすれば良いでしょうか?

一つの方法は、出てきた数字をすべて記録しておくことです。
過去の記録と比較すればいつかループは見つかります。
しかし、この方法は数字が何万桁も続く場合、記録するためのメモリが膨大になり、確認にも時間がかかってしまいます。

アルゴリズムの紹介

そこで登場するのが、今回ご紹介する「うさぎとかめのアルゴリズム」[1]です。
ここでイソップ寓話の「うさぎとかめ」を思い出してください。足の速いうさぎと、遅いかめが競争するお話です。
このアルゴリズムでは、その特徴をうまく利用します。

例として、以下のように数字が進むコースを考えます。 1 → 2 → 3 → 4 → 5 → 6 → 4 → 5 → 6 … (1, 2, 3と進んだ後、4, 5, 6の間をぐるぐると回り続けます)
このコースに、うさぎとかめを走らせてみましょう。
以下のルールに従って、うさぎとかめは動きます。

  • かめ
    • 1回に「1つ」進む
  • うさぎ
    • 1回に「2つ」進む(かめの2倍の速さ)

それでは、問題を解いていきます。
1.初期位置
 うさぎとかめは同時に「1」の地点からスタートします。

2.最初の移動
 かめは「2」へ、うさぎは2つ進んで「3」へ行きます。

3.次の移動
 かめは「3」へ、うさぎは「3」から4→5と進んで「5」へ行きます。

4.その次の移動
 かめは「4」へ入ります。 うさぎは「5」から6→4と進んで、なんと「4」へ戻ってきます。

お気づきでしょうか?
ここで2人は「4」の地点でばったり出会いました。

もしコースが一直線でループしていなければ、足の速いうさぎはかめを置いてきぼりにして、二度と会うことはありません。
しかし、コースがループしている場合、先頭を走るうさぎが周回遅れになって、後ろから来るかめに追いついてしまうのです。
つまり、「2人が出会った=ループが存在する」と判定できるわけです。

これがCSの面白いところです。
「すべての操作を記憶する」という力技ではなく、「速度の違う2つのポインタ」を用意する」という工夫だけで、少ないメモリで高速に問題を解決できるのです。
以下にRust言語で実装した例を示します。


実行した結果が以下の通りです。

範囲内にループがあるかどうかが検出できますね!

まとめ

今回はうさぎとかめのアルゴリズムで、ループが範囲内にあるかどうかを検出する方法について紹介しました。
このアルゴリズム以外でもCS分野には面白い内容が多分に含まれます。
今後もこの様なCS分野の内容を紹介していきたいと思います。

参考文献
[1] Educative.io, “Why does Floyd’s cycle detection algorithm work?,” Educative. [オンライン]. URL<https://www.educative.io/answers/why-does-floyds-cycle-detection-algorithm-work>. [閲覧日:2025-12-07].