上級 レッスン1 読了4分

素数の時計における算術

有限集合内での加算、乗算、除算。それがビットコインが実際に機能する算術です。

10時になって、5時間待つと3時になります。15時ではありません。誰もこれを不思議に思わず、新しいルールを学ぶ必要もなく、みんな子供の頃からこの計算をしています。これは、ビットコインが最初から最後まで行う計算そのものであり、名前があります:モジュラー算術です。

有限体とは、内部に有限の要素があり、その中で四則演算が機能し、常にその範囲内で結果が得られる集合です。ビットコインの場合、要素は0からp-1までの整数で、ルールは簡単です:いつも通り計算を行い、その結果をpで割った余りを取ります。

継ぎ目が同じ点を通り、カウントが再開されます。これがビットコインが知っている唯一の算術です。

足し算、引き算、掛け算には特に難しいことはありません。モジュール7の体では、5に4を足すと2になります。なぜなら、9を7で割ると余りが2だからです。3に5を掛けると1になります。なぜなら、15を7で割ると余りが1だからです。引き算は逆数を足すことです:-3は4と同じです。なぜなら、3に4を足すと時計が一周するからです。

割り算は新しい考えを必要とし、これはこのレッスンで最も重要な考えです。有限体には小数点がないため、aで割ることは部分に分けることを意味しません。それはaの逆数、つまりaに掛けると1になる数を掛けることを意味します。モジュール7では、3の逆数は5です。なぜなら、15を7で割ると余りが1だからです。したがって、3で割ることは5を掛けることです。

ここでタイトルの答えを導く質問:なぜpは素数である必要があるのか?それは、そうでなければすべての要素が逆数を持たないからです。モジュール12の時計で試してみてください:4は何に掛けても4の倍数しか生み出さず、それらのどれも余りが1になりません。4には逆数がなく、4での割り算は不可能であり、集合は体ではなくなります。これは、モジュールと共通の約数を持つすべての数で起こります。素数のモジュールは、それ以下の誰とも約数を共有しません。

素数の時計では、すべての部品に対応するものがあります。合成数の時計では、ペアのない部品が残ります。

実際に逆数を計算する方法は2つあります。1640年のフェルマーの小定理は、aをp-1乗すると余りが1になることを保証しています。したがって、aをp-2乗すると逆数になり、指数計算で解決します。さらに速いのは拡張ユークリッドのアルゴリズムで、ギリシャ人がすでに知っていた一連の割り算で、数ステップで逆数を返します。世界中のウォレットは、この2つのうちの1つを毎秒何千回も実行しており、誰も気づきません。

ビットコインのpはこれです:2の256乗から2の32乗を引き、さらに977を引いたものです。78桁の素数です。この選択は装飾的ではありません。2の累乗に非常に近いように意図的に設定されており、2^256に非常に近いモジュールで数を減らすことは、割り算なしでシフトと加算で行われます。これは、高価な操作と安価な操作の違いであり、何十億回も繰り返されます。

2の累乗に非常に近く選ばれた:ほとんど余裕がなく、そのため速くフィットします。

最後の注意点として、ここから先でよくある混乱を避けるためのものがあります。この歴史には2つの大きな数があり、それらは異なります。pは体のサイズであり、点の座標が存在する時計です。また、nという数もあり、ジェネレーターが到達する点の数であり、秘密鍵や署名の数が存在する時計です。両方とも素数で、両方とも256ビットで、互いに非常に近いですが、それらを混同すると、正しいように見える計算と合わない結果を生み出します。

時計が組み立てられたら、その上に曲線を置く必要があります。次のレッスンでは、y² = x³ + 7、この方程式を満たす点と、2つの点を足して3つ目を生み出すルールについて学びます。