0:00:01.000,0:00:05.000 「ある方向では簡単で、逆方向では難しい」 0:00:05.000,0:00:07.000 そんな計算手順を考えましょう。 0:00:07.000,0:00:12.000 ここで登場するのが、「合同算術」です。これは、「時計演算」とも呼ばれています。 0:00:12.000,0:00:20.000 たとえば、46を12で割った余りを求める場合、46単位の長さのヒモを用意します。 0:00:20.000,0:00:24.000 そして、そのヒモを周の長さが12単位の「法」と呼ばれる時計に巻き付けます。 0:00:24.000,0:00:28.000 そして、ロープの端が来たところが解になります。 0:00:28.000,0:00:32.000 ここでは 46 を 12 で割った余り、つまり剰余は 10 になります。 0:00:32.000,0:00:39.000 簡単ですね。これを機能させるために、まず17などの素数の「法」を扱います。 0:00:39.000,0:00:44.000 17の「原始根」を設定します。今回は3で考えます。 0:00:44.000,0:00:48.000 3には重要な性質があります。さまざまな指数で累乗したときに、 0:00:48.000,0:00:52.000 解が時計の周囲に均等に分散されるのです。 0:00:52.000,0:01:00.000 3は「生成元」と呼ばれています。3を任意の指数 x で累乗した場合、 0:01:00.000,0:01:05.000 解は、等しい頻度で、偏りなく、0と17の間の任意の整数になります。 0:01:05.000,0:01:08.000 しかし、逆向きの演算は困難です。 0:01:08.000,0:01:14.000 たとえば、3を何乗して17で割った余りが12になるか簡単に分かるでしょうか。 0:01:14.000,0:01:17.000 これは「離散対数」の問題と呼ばれます。 0:01:17.000,0:01:20.000 ここまで、一方向の関数について考えました。 0:01:20.000,0:01:23.000 これは簡単に実行できますが、逆方向は難しい関数です。 0:01:23.000,0:01:30.000 12という数字が与えられても、それを生み出した指数を見つけるには、大変な試行錯誤が必要です。 0:01:30.000,0:01:32.000 どれぐらい大変でしょうか。 0:01:32.000,0:01:39.000 小さな数字なら簡単です。けれど、何百桁にもなる素数の「法」を使用した場合、 0:01:39.000,0:01:42.000 実際には解くことができなくなります。 0:01:42.000,0:01:47.000 地球上のすべてのコンピュータを使っても、全ての可能性のある数を見つけ出すには、 0:01:47.000,0:01:49.000 何千年もかかってしまうでしょう。 0:01:49.000,0:01:53.000 つまり、一方向関数の強みは、逆方向に計算するのに膨大な時間がかかるという点なのです。