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