No.312 - ダブル・レインボー [アート]
先日、新聞を読んでいたらダブル・レインボー(二重の虹。二重虹)のことが出ていました。そして、以前にこのブログで引用した絵画を思い出しました。今回はそのことを書きます。
二重の虹
まず、ダブル・レインボーについて書かれた朝日新聞の記事を引用します。以降の引用において下線は原文にはありません。
ダブル・レインボーは私も2~3度、見たことがあります。最近では2年ほど前です。早朝、海岸の遊歩道を朝日を背に西に向かって歩いているときに、くっきりと見えました。雨上がりの、湿気のある空気がたちこめている雰囲気だったと記憶しています。
引用した記事には、ダブル・レインボーが見える条件として「豊富な水滴」「強い太陽光」とあります。確かにそうだと思いますが、私の感じではもう一つ条件があって、それは「暗い背景」だと思います。外側の副虹は内側の主虹に比べて輝度が随分低いわけです。記事にあるように、太陽光が水滴で2回反射するからです。従って、ダブル・レインボーの背景の空(や風景)は、できるだけ暗い方が虹が見えやすい。
私の経験した海岸の遊歩道でも、東の空は雲もなく明るいのに、虹が見える西の空は薄灰色の雲が立ちこめていました。黒雲だともっとはっきりと見えたのでしょう。普通の虹でも背景が重要だと思いますが、輝度が低いダブル・レインボー(の外側の虹)では一層重要である、そう思います。
ともかく、ダブル・レインボーは珍しい現象です。記事の見出しである「5分間の奇跡」の "奇跡" というのは少々言い過ぎだと思いますが、日常生活では滅多にお目にかかれない気象現象なのは確かでしょう。以下にダブル・レインボーが見える原理を示した図を引用しておきます。
このダブル・レインボーで思い出す芸術作品が、パリのオルセー美術館が所蔵しているミレーの『春』という作品です。
ジャン = フランソワ・ミレー
左上に虹が描かれています。うっかりすると見過ごしそうですが、この虹はダブル・レインボーです。
近景は畑でしょうか。小道があって木立があります。遠方には林が見える。画面の下や左の方は暗いが、近景の半分から向こうの林にまで光が当たっています。雨上がりの光景なのでしょう。遠方の空には、雨を降らせたと思われる黒雲が立ちこめ、空は暗い。その黒雲を背景に、かすかに副虹が見えるダブル・レインボーがかかっています。黒雲の薄暗さが虹を引き立てていて、この雰囲気はダブル・レインボーを実際に見た経験とも合っています。虹の位置関係からすると、背後から強い光があたっているはずです。それは夕日を思わせます。
この絵の題名は『春』なので、春の情景なのでしょう。だけど、何となく幻想的な雰囲気です。手前から遠方に「暗・明・暗」と変化していて、暗と明の世界の同居というか、2つの世界の狭間の光景のような感じがあります。
そして ・・・・・・。
よく見ると、奥の木立のそばに人物が描かれています。さらにもっとよく見ると、空には白い鳥が飛んでいる。これについて三菱一号館美術館の上席学芸員、安井裕雄氏が日本経済新聞にコラムを書いていました。
この絵には、うっかりすると見過ごしてしまいそうなアイテムが3つ描かれています。① ダブル・レインボー、② 人物、③ 鳥、の3つです。そして三菱一号館美術館 上席学芸員の安井氏によると、人物はミレーの腕の中で息を引き取ったテオドール・ルソーであり、鳥は天へと召されていくルソーの魂の象徴だというのです。テオドール・ルソーの没年は1867年です(55歳)。つまりこの絵はミレーが、亡くなったルソーの思い出を込めて描いたということになります。
とすると、これは少々複雑な絵です。バルビゾンのミレー家の裏の畑という現実の光景がベースなのだろうけれど、そこに幻想の光景が重ね合わされている。この複雑性が見る人の想像力を刺激するのでしょう。その刺激を受けた一人が黒澤明監督です。
黒澤 明
ミレーの『春』に触発された映画の一シーンがあります。黒澤明監督(1910-1998)の『夢』(1990)の一場面です。『夢』は8話からなるオムニバス映画で、その第1話が『日照り雨』です。その1シーンがこの映画のポスターになりました。
近景は美しい花畑で、遠くには暗い山と空、その間をつなぐようにかかる虹、そこに向かうように少年が立っています。このシーンがミレーの『春』へのオマージュです。その『日照り雨』は、次のような話です。
これを教訓話として考えると「人間は自然を乱すことなく、人間は自然界の掟に従って生きなければならない」ということでしょう。しかしそういう風に考えるよりも、これは黒澤監督の夢の実写化です。"不気味さ・怖さ" と "美しさ" が入り交じった幻想の世界と考えておけばよいのだと思います。
そこで、もう一度、ミレーの『春』をみると、手前は暗いがその向こうから林までに光が当たっています。まるでそのあたりがスポットライトに照らされているようです。これは虹の見える条件(=背後からの強い光)とはちょっと違う感じがする。
黒澤監督は、ミレーの『春』は現実の光景ではない、幻想の光景だと感じたのではないかと思います。『夢』は、黒澤監督が見た夢を映像化したものです。当然、現実そのものではないファンタジーの世界です。それがミレーの『春』とシンクロした。黒澤監督はもともと画家志望です。自作を展覧会に出品したこともあります。映画監督になってからも、絵コンテを自ら大量に描いたことで有名です。ミレーの絵が好きだったのかどうかは知りませんが、絵画から何かを感じることには長けていたと考えられます。
話を、ダブル・レインボーに戻します。しかしなぜ『春』に、滅多に見ることがないダブルレインボーが "微かに" 描かれているのでしょうか。黒澤明監督は "一重の普通の虹" で映像化しています。『春』も普通の虹でよいはずです。ここに描かれたダブル・レインボーも幻想の光景なのでしょうか。
しかし、これは現実の光景からヒントを得たのだと考えられます。つまり画家は、バルビゾンの自宅の裏庭から畑ごしにダブルレインボーを見たのだと推察します。というの、も『春』と構図がほぼ同じの『虹』という絵が残っているからです。
パステルで描かれたダブル・レインボー
その『春』とほぼ同じ構図のパステル画が、ポルトガルの首都・リスボンのグルベンキアン美術館にあります。No.192「グルベンキアン美術館」で引用しましたが、ここに再掲します。
この絵の題名は『虹』です。その題名どおり、ダブル・レインボーがくっきりと描かれている。これは実際に画家が自宅の裏の畑の方向を見た光景がもとになっていると考えられます。ミレーは、奇跡とは言わないまでも、滅多に出現しないダブル・レインボーを自宅から見て感じ入るところがあった。
このパステル画は、油彩画の『春』とほぼ同じ構図です。ただ、違いもあります。まず、奥の木立へと続く小道が描かれていません。また、空を飛ぶ白い鳥もいない。ただし、奥の木立のそばに小さく人物が描かれているところは共通しています。
ダブル・レインボーないしはもっと一般的に虹が、フランスでどういう象徴性で考えられているのかは知りません。しかし常識的に考えて悪い意味ではないと想像します。意味があるとしたら「幸運」とか「吉兆」でしょう。しかも滅多に見られないダブル・レインボーとなると、その象徴性が倍加されるはずです。
ミレーは珍しいダブル・レインボーを自宅の裏の畑から見て、亡くなったテオドール・ルソーの魂に重ね合わせたのではないでしょうか。だから奥の木立のそばにそっと人物(=ルソー)を描き込んだ。
画家が同じ構図のパステル画と油絵を制作するという場合、パステル画が先行すると考えるのが普通でしょう。パステル画を制作し、それをもとに油絵バージョンを描く。ミレーの『虹』と『春』の2作の場合もそうだったのではと想像します。
そして油絵にするとき、画家は2つのアイテムを追加した。一つは白い3羽の鳥で、これは天国に召されたルソーの魂です。そしてもう一つは、手前から人物のそばの木立へと続く小道です。この道はミレーとルソーの "絆" を象徴しているのではと思います。と同時に、ダブル・レインボーを画題の中心ではなく、構図の中に盛り込まれた1つの要素の位置づけにした。
オルセー美術館の公式サイトによると、この『春』は、テオドール・ルソーのパトロンだったフレデリック・アルトマンという人の依頼で制作された「四季、4部作」の一枚です(完成は1873年)。そして、『夏』『秋』『冬(未完)』の3作は "ミレーらしい" 農民の農作業が画題ですが、『春』だけは違っていて(一見すると)風景画です。しかしその「一見すると風景画」に秘密がある。
"春" は自然と生命が息を吹き返す時期であり、四季の始まりです。亡くなったテオドール・ルソーの思い出として描くには、"春" がピッタリだったのだと思います。
本文の冒頭に引用した朝日新聞のダブル・レインボーの写真は2021年4月8日のものでしたが、それから1ヶ月もたたない2021年5月2日の日本経済新聞(NIKKEI The STYLE)に虹の写真が掲載されました。「虹が立つ草原を行く」と題されたもので、タンザニアのセレンゲティ国立公園で撮影されたものです。草原を行く「ヌーの群れ」と「虹」のツーショット写真です。
この写真をよく見ると、実はうっすらと副虹が写っているのですね。ほんの微かですが ・・・・・・。つまり、ダブル・レインボーの写真ということになります。日経の読者の方も、気がつかなかった人が多いのではないでしょうか。
この写真でよく分かるのは「ダブル・レインボーは程度問題」ということです。くっきりと見える場合もあれば(=滅多にない)、全く見えないこともあり(=ほとんどの場合)、その間には無限の段階がある。我々も虹を見たとき、実は外側にある、ほんの微かな副虹を見逃していることがあるのではないでしょうか。そう感じさせるセレンゲティ国立公園の写真でした。
二重の虹
まず、ダブル・レインボーについて書かれた朝日新聞の記事を引用します。以降の引用において下線は原文にはありません。
|
ダブル・レインボーは私も2~3度、見たことがあります。最近では2年ほど前です。早朝、海岸の遊歩道を朝日を背に西に向かって歩いているときに、くっきりと見えました。雨上がりの、湿気のある空気がたちこめている雰囲気だったと記憶しています。
引用した記事には、ダブル・レインボーが見える条件として「豊富な水滴」「強い太陽光」とあります。確かにそうだと思いますが、私の感じではもう一つ条件があって、それは「暗い背景」だと思います。外側の副虹は内側の主虹に比べて輝度が随分低いわけです。記事にあるように、太陽光が水滴で2回反射するからです。従って、ダブル・レインボーの背景の空(や風景)は、できるだけ暗い方が虹が見えやすい。
私の経験した海岸の遊歩道でも、東の空は雲もなく明るいのに、虹が見える西の空は薄灰色の雲が立ちこめていました。黒雲だともっとはっきりと見えたのでしょう。普通の虹でも背景が重要だと思いますが、輝度が低いダブル・レインボー(の外側の虹)では一層重要である、そう思います。
ともかく、ダブル・レインボーは珍しい現象です。記事の見出しである「5分間の奇跡」の "奇跡" というのは少々言い過ぎだと思いますが、日常生活では滅多にお目にかかれない気象現象なのは確かでしょう。以下にダブル・レインボーが見える原理を示した図を引用しておきます。
![]() |
ダブル・レインボーが見える原理 |
光の反射によってできる光線の角度は、主虹(1回反射)が約42度、2回反射した副虹は約51度で、副虹の方が角度が大きい。従って副虹が外側に見える。気象庁の荒木健太郎博士の Twitter より引用した。ちなみに荒木博士は新海誠監督の「天気の子」の気象監修をされた方である(No.271)。 |
このダブル・レインボーで思い出す芸術作品が、パリのオルセー美術館が所蔵しているミレーの『春』という作品です。
ジャン = フランソワ・ミレー
![]() |
ジャン = フランソワ・ミレー (1814-1875) 「春」(1868-73) |
オルセー美術館 (フランス、パリ) |
左上に虹が描かれています。うっかりすると見過ごしそうですが、この虹はダブル・レインボーです。
近景は畑でしょうか。小道があって木立があります。遠方には林が見える。画面の下や左の方は暗いが、近景の半分から向こうの林にまで光が当たっています。雨上がりの光景なのでしょう。遠方の空には、雨を降らせたと思われる黒雲が立ちこめ、空は暗い。その黒雲を背景に、かすかに副虹が見えるダブル・レインボーがかかっています。黒雲の薄暗さが虹を引き立てていて、この雰囲気はダブル・レインボーを実際に見た経験とも合っています。虹の位置関係からすると、背後から強い光があたっているはずです。それは夕日を思わせます。
この絵の題名は『春』なので、春の情景なのでしょう。だけど、何となく幻想的な雰囲気です。手前から遠方に「暗・明・暗」と変化していて、暗と明の世界の同居というか、2つの世界の狭間の光景のような感じがあります。
そして ・・・・・・。
よく見ると、奥の木立のそばに人物が描かれています。さらにもっとよく見ると、空には白い鳥が飛んでいる。これについて三菱一号館美術館の上席学芸員、安井裕雄氏が日本経済新聞にコラムを書いていました。
|
この絵には、うっかりすると見過ごしてしまいそうなアイテムが3つ描かれています。① ダブル・レインボー、② 人物、③ 鳥、の3つです。そして三菱一号館美術館 上席学芸員の安井氏によると、人物はミレーの腕の中で息を引き取ったテオドール・ルソーであり、鳥は天へと召されていくルソーの魂の象徴だというのです。テオドール・ルソーの没年は1867年です(55歳)。つまりこの絵はミレーが、亡くなったルソーの思い出を込めて描いたということになります。
とすると、これは少々複雑な絵です。バルビゾンのミレー家の裏の畑という現実の光景がベースなのだろうけれど、そこに幻想の光景が重ね合わされている。この複雑性が見る人の想像力を刺激するのでしょう。その刺激を受けた一人が黒澤明監督です。
黒澤 明
ミレーの『春』に触発された映画の一シーンがあります。黒澤明監督(1910-1998)の『夢』(1990)の一場面です。『夢』は8話からなるオムニバス映画で、その第1話が『日照り雨』です。その1シーンがこの映画のポスターになりました。
![]() |
黒澤明監督作品 「夢」(1990) |
近景は美しい花畑で、遠くには暗い山と空、その間をつなぐようにかかる虹、そこに向かうように少年が立っています。このシーンがミレーの『春』へのオマージュです。その『日照り雨』は、次のような話です。
立派な門構えの家から少年が遊びに出ようとしたとき、太陽は出ているのに急に雨が降り出した。少年は母親から「こんな日照り雨の日には狐の嫁入りがある。狐はそれを見られるのが嫌だから、見てしまうと恐ろしいことが起こりますよ」と警告される。
余計に好奇心に駆られた少年は森に分け入り、狐の嫁入りを見てしまう。そして家に帰ったとき、門には母親が恐い顔をして立っていて、少年に短刀を差し出した ・・・・・・。
余計に好奇心に駆られた少年は森に分け入り、狐の嫁入りを見てしまう。そして家に帰ったとき、門には母親が恐い顔をして立っていて、少年に短刀を差し出した ・・・・・・。
これを教訓話として考えると「人間は自然を乱すことなく、人間は自然界の掟に従って生きなければならない」ということでしょう。しかしそういう風に考えるよりも、これは黒澤監督の夢の実写化です。"不気味さ・怖さ" と "美しさ" が入り交じった幻想の世界と考えておけばよいのだと思います。
そこで、もう一度、ミレーの『春』をみると、手前は暗いがその向こうから林までに光が当たっています。まるでそのあたりがスポットライトに照らされているようです。これは虹の見える条件(=背後からの強い光)とはちょっと違う感じがする。
黒澤監督は、ミレーの『春』は現実の光景ではない、幻想の光景だと感じたのではないかと思います。『夢』は、黒澤監督が見た夢を映像化したものです。当然、現実そのものではないファンタジーの世界です。それがミレーの『春』とシンクロした。黒澤監督はもともと画家志望です。自作を展覧会に出品したこともあります。映画監督になってからも、絵コンテを自ら大量に描いたことで有名です。ミレーの絵が好きだったのかどうかは知りませんが、絵画から何かを感じることには長けていたと考えられます。
余談ですが、絵画からインスピレーションを得た映画として、以前にリドリー・スコット監督の2作品を紹介しました。ジェロームの絵画『差し下おろされた親指』からヒントを得た映画『グラディエーター』(No.203)と、ホッパーの『ナイトホークス』に影響された『ブレードランナー』(No.288)です。黒澤監督とスコット監督は似ていて、2人とも画家としての素養があり、また自ら映画の絵コンテを作成しました。
話を、ダブル・レインボーに戻します。しかしなぜ『春』に、滅多に見ることがないダブルレインボーが "微かに" 描かれているのでしょうか。黒澤明監督は "一重の普通の虹" で映像化しています。『春』も普通の虹でよいはずです。ここに描かれたダブル・レインボーも幻想の光景なのでしょうか。
しかし、これは現実の光景からヒントを得たのだと考えられます。つまり画家は、バルビゾンの自宅の裏庭から畑ごしにダブルレインボーを見たのだと推察します。というの、も『春』と構図がほぼ同じの『虹』という絵が残っているからです。
パステルで描かれたダブル・レインボー
その『春』とほぼ同じ構図のパステル画が、ポルトガルの首都・リスボンのグルベンキアン美術館にあります。No.192「グルベンキアン美術館」で引用しましたが、ここに再掲します。
![]() |
ジャン = フランソワ・ミレー 「虹」(1872/73) |
グルベンキアン美術館 (ポルトガル、リスボン) |
この絵の題名は『虹』です。その題名どおり、ダブル・レインボーがくっきりと描かれている。これは実際に画家が自宅の裏の畑の方向を見た光景がもとになっていると考えられます。ミレーは、奇跡とは言わないまでも、滅多に出現しないダブル・レインボーを自宅から見て感じ入るところがあった。
このパステル画は、油彩画の『春』とほぼ同じ構図です。ただ、違いもあります。まず、奥の木立へと続く小道が描かれていません。また、空を飛ぶ白い鳥もいない。ただし、奥の木立のそばに小さく人物が描かれているところは共通しています。
ダブル・レインボーないしはもっと一般的に虹が、フランスでどういう象徴性で考えられているのかは知りません。しかし常識的に考えて悪い意味ではないと想像します。意味があるとしたら「幸運」とか「吉兆」でしょう。しかも滅多に見られないダブル・レインボーとなると、その象徴性が倍加されるはずです。
ミレーは珍しいダブル・レインボーを自宅の裏の畑から見て、亡くなったテオドール・ルソーの魂に重ね合わせたのではないでしょうか。だから奥の木立のそばにそっと人物(=ルソー)を描き込んだ。
画家が同じ構図のパステル画と油絵を制作するという場合、パステル画が先行すると考えるのが普通でしょう。パステル画を制作し、それをもとに油絵バージョンを描く。ミレーの『虹』と『春』の2作の場合もそうだったのではと想像します。
そして油絵にするとき、画家は2つのアイテムを追加した。一つは白い3羽の鳥で、これは天国に召されたルソーの魂です。そしてもう一つは、手前から人物のそばの木立へと続く小道です。この道はミレーとルソーの "絆" を象徴しているのではと思います。と同時に、ダブル・レインボーを画題の中心ではなく、構図の中に盛り込まれた1つの要素の位置づけにした。
オルセー美術館の公式サイトによると、この『春』は、テオドール・ルソーのパトロンだったフレデリック・アルトマンという人の依頼で制作された「四季、4部作」の一枚です(完成は1873年)。そして、『夏』『秋』『冬(未完)』の3作は "ミレーらしい" 農民の農作業が画題ですが、『春』だけは違っていて(一見すると)風景画です。しかしその「一見すると風景画」に秘密がある。
"春" は自然と生命が息を吹き返す時期であり、四季の始まりです。亡くなったテオドール・ルソーの思い出として描くには、"春" がピッタリだったのだと思います。
 補記:セレンゲティの虹  |
本文の冒頭に引用した朝日新聞のダブル・レインボーの写真は2021年4月8日のものでしたが、それから1ヶ月もたたない2021年5月2日の日本経済新聞(NIKKEI The STYLE)に虹の写真が掲載されました。「虹が立つ草原を行く」と題されたもので、タンザニアのセレンゲティ国立公園で撮影されたものです。草原を行く「ヌーの群れ」と「虹」のツーショット写真です。
![]() |
「虹がたつ草原を行く タンザニア」 |
(日本経済新聞 2021.5.2) |
この写真をよく見ると、実はうっすらと副虹が写っているのですね。ほんの微かですが ・・・・・・。つまり、ダブル・レインボーの写真ということになります。日経の読者の方も、気がつかなかった人が多いのではないでしょうか。
この写真でよく分かるのは「ダブル・レインボーは程度問題」ということです。くっきりと見える場合もあれば(=滅多にない)、全く見えないこともあり(=ほとんどの場合)、その間には無限の段階がある。我々も虹を見たとき、実は外側にある、ほんの微かな副虹を見逃していることがあるのではないでしょうか。そう感じさせるセレンゲティ国立公園の写真でした。
2021-05-29 11:43
nice!(0)
No.311 - 高校数学で理解するRSA暗号の数理(2) [科学]
(前回より続く)
4. RSA暗号の証明
4.1 | RSA暗号 |
RSA暗号の公開鍵・秘密鍵の作成方法と暗号化・複号化の計算式を定理として記述すると次の通りです。 と を相異なる素数とし、 とする。 を と素な数、 を、 を満たす数とする。この前提で、 暗号化: ならば 複号化: である。 ( :平文。:暗号文 ) |
RSA暗号において、暗号化・複号化に必要なのは公開鍵の と 秘密鍵の であり、それらを生成するのに使った と は不要です。というより、 と ないしは が漏れると暗号が破られてしまうので、これらの数は鍵を生成した後は破棄(情報を安全に抹消)する必要があります。
以下に、上の「複号化の式」が成り立つことを証明します。まず合同式の累乗 1.2 を使って「暗号化の式」の両辺を 乗すると、
となります。ここで、 なので、 と表現できます。従って、
となります。累乗を分解すると、
です。一方、フェルマの小定理 3.1 により、
となります。合同式の累乗の定理 1.2 により、この式の両辺を 乗すると、
が得られます。さらに、フェルマの小定理 3.1 により、
ですが、両辺を 乗して、
となります。ここで、 と は互いに素なので、1.5 の合同式の定理を に適用すると、
を導くことができます。この式の両辺を 1.2 を使って 乗すると、
であり、さらに両辺に合同式の乗算 1.1c を使って をかけると、
となります。従って、 を合わせると、
となり、RSA暗号の複号化の式が証明できました。
 最小公倍数  |
以上の証明の過程を改めて振り返ってみると、「 が の倍数であり、かつ の倍数」であれば、RSA暗号は成立することが分かります。つまり「 が と の公倍数」であれば成立する。そのような は、
の2通りに表現できます。すると、 なので、
と2通りに表せます。ここから、
となって、平文が復元できます。この考察から分かるのは、 の最小値は「 と の最小公倍数」ということです。最小公倍数を で表すと、
であればRSA暗号は成立します。そして一般に、
です。最大公約数・ は「2. ユークリッドの互除法」を使って高速に計算できるので や が巨大数であっても最小公倍数・ は計算可能です。
 累乗の剰余を求めるアルゴリズム  |
RSA暗号では、暗号化と複号化で "累乗(冪乗)の剰余"(冪剰余と呼ぶ)を求める計算が出てきます。この計算で使う公開鍵 も秘密鍵 も、また平文や暗号文も、実用的には10進数で300桁とか、そういった巨大な数です。
しかし巨大な数であっても、累乗の剰余計算ができるアルゴリズムがあります。その一つとして、ここでは「2分割法」で説明します。前回の「RSA暗号の例題」であげた、
の例で説明します。考え方としては「2.ユークリッドの互除法」と同じで、問題をより "小さな問題" に置き換えるというものです。つまり、133乗を求める代わりに
が求まったとしたら、 は、
で計算できます。さらに、その は、
が求まったとしたら、
で計算できます。この2分割を次々と続けていくと、82の16乗、8乗、4乗、2乗、1乗を 143 で割った剰余が求まれば良いことになります。これを逆にたどって電卓で順次計算してみると、
となり、答の 4 が求まりました。これをプログラム言語で記述すると次の通りです。
4.2 | 2分割法による冪剰余計算 | ||||||||||||||||||
を求める関数 RSA(Javascriptで記述)。
|
次はこのアルゴリズムの補足説明です。
e が 1 なら P % n が答なので、それを関数値として返す。% は Javascript の剰余演算子で、P mod n と同じ意味。 | |
e が 1 でないときは、e を半分(約半分)にして答を求める。Math.floor() は小数点以下を切り捨てる Javascript の組み込み関数。Javascript では実数と整数の区別がないので必要。 | |
その "半分の答" を2乗し、剰余を求めて仮の答 c とする。 | |
e が偶数なら c が正しい答。それを関数値として返す。 | |
e が奇数なら c にさらに P を掛け、剰余を求めて関数値として返す。 |
, , が10進数で300桁程度の巨大数とします。 は約300桁の数なので、"2分割法" を使うと1000回程度の剰余計算を繰り返すこと答が求まります。この程度の計算は現在のコンピュータで可能です。ただし可能といっても 1000回の繰り返しはさすがに大変なので、実用的にはこれを高速化する手法がいろいろと開発されています。
「2. ユークリッドの互除法」で、公開鍵
今までのまとめ
実用的な RSA暗号を構成するときに必要なのは、巨大な素数
今までのRSA暗号についての説明全体をまとめると、以下の2点になるでしょう。
RSA暗号は数論(整数論)の基礎から構成されている(合同、ユークリッドの互除法、フェルマの小定理、・・・・・)。 | |
RSA暗号における公開鍵・秘密鍵の生成式、暗号化・復号化の式は、実用的に計算可能である。 |
RSA暗号は現代の情報化社会にとって必須のものであり、社会インフラの重要な構成要素です。それは、数学が実用的に、かつ直接的に社会に役立っている例なのでした。
RSA暗号とオイラー関数・オイラーの定理 |
RSA暗号の成立性の証明はこれまでで尽きていますが、以降はRSA暗号と関係が深い「オイラー関数」を説明し、次に「オイラーの定理」を導いて、そこからRSA暗号の原理を導出します。まずその前提としての「中国剰余定理」です。
5. 中国剰余定理
5~6世紀頃の中国で成立した算術書『孫子算経』に、
3で割ると2余り
5で割ると3余り
7で割ると2余る数は何か
5で割ると3余り
7で割ると2余る数は何か
という問題が書かれています。答は23ですが、これを一般化した定理を「中国剰余定理」と呼んでいます。
5.1 | 中国剰余定理 |
与えられた を同時に満たす解 |
となり、1.1b により、
となります。同様に、
が言えます。
となります。以上のことは
となります。つまり、
です。従って、解
ここで
とおくと、
となる
とおくと、それが解になります。なぜなら
です。一方、合同の性質の 1.4 において
となります。1.4 の「
という2つの条件から、
となります。これが全ての
中国剰余定理の意味を直感的に理解するために、
この表をみると、
「互いに素」なゆえに成立するこのイメージは、次のオイラー関数の証明に役立ちます。
6. オイラー関数
|
以下の「オイラー関数」は、一般に関数名をギリシャ文字の
余談ですが、オイラーは20歳台後半で右目を失明しました。ここに掲載した肖像画にもそれが現れています。
6.1 | オイラー関数 |
オイラー関数 (素数のオイラー関数値) 6.1a (素数の積のオイラー関数値) 6.1b (素数の累乗のオイラー関数値) 6.1c なお「互いに素」は、すなわち「最大公約数が |
まず 6.1a ですが、素数
次に
です(6.1b)。上の式の1行目で、
さらに、
なので、
となります(6.1c)。このオイラー関数に関しては、次の「乗法性」が重要です。
6.2 | オイラー関数の乗法性 |
|
一般に、関数のこのような性質を "乗法性"、このような関数を "乗法的関数" と呼んでいます。証明は3段階で行います。キーワードは「中国剰余定理」と「1対1対応」です。
 第1段  |
仮定により
を同時に満たす
逆に、
ことになります。
 第2段  |
第1段の方法で作った「1対1に対応する
になります。なぜなら、もし
と表せるので
です。この2つを合わせると、
になります。「
です。その逆に「
ことになります。そして1対1の対応関係がつく集合の要素の数は等しい。ここが証明の根幹です。
 第3段  |
オイラー関数の定義により、
です。
です。さらにオイラー関数の定義により、
になります。第2段で証明したように「
となって、証明が完成しました。オイラー関数の乗法性を直感的に理解するために、中国剰余定理のところであげた表を使って
このオイラー関数の乗法性(6.2)と素数の累乗のオイラー関数値(6.1c)を用いると、一般の自然数
と表現できます。ここでオイラー関数の乗法性(6.2)を繰り返して使うと、
となります。また、素数の累乗のオイラー関数値(6.1c)によって、
です。以上を合わせると、任意の数
となります。つまり、
ちなみに、上のオイラー関数の公式の末尾の形(色を塗った部分)は、オイラーより以前に江戸時代の和算家・久留島義太(? - 1758)が発見しています。久留島義太は、関孝和、建部賢弘とともに三大和算家と呼ばれた人ですが、自分では書物を残すことがなかったので、業績は知人や弟子がまとめたものにしかありません。その一人、仙台藩の天文学者・戸板保佑の『久氏遺稿』の中に公式の記述ができます(鳴海 風「小説になる江戸時代の数学者」- 日本数学会「市民講演会」2007.3.31 による)。
その書物には
日本の数学者の中には「久留島・オイラーの関数」と呼ぶ人もいます。"オイラー何とか" という名前の定理や公式はいろいろあるので、その方が分かりやすいかもしれません。
7. オイラーによるフェルマの小定理の一般化(オイラーの定理)
オイラー関数を使うと、オイラーが発見した「一般化されたフェルマの小定理」の証明ができます。
7.1 | オイラーの定理 |
|
この証明を2段階に分けて行います。まず第1段階で
7.2 | |
|
が成り立つとします。そうすると、ある数
と表現できます。この式の左辺に 6.1c(素数の累乗のオイラー関数値)を適用すると、
となります。この両辺を
が得られます。この展開した右辺において、第2項は
となります。この結果、7.2 は
7.2 を使って 7.1 を証明します。
とおきます。すると 7.2 により、
が成立します。ここで、
とおくと、オイラー関数の乗法性(6.2)により、
となります。ここで、この式と合同式の累乗(1.2)を使って
が得られました。
となり、7.1 が正しいことが証明されました。
7.1 の証明の過程を振り返ってみると、次の 7.3 が成り立つことが分かります。
7.3 | オイラーの定理・その2 |
任意の数 と表す。 とすると、 が成り立つ( |
これは 7.1 の証明の後半(= 7.2 を使って証明する部分)からすぐに分かります。
と書き表すことができます。一方 7.2 より、
が成り立ちます。この合同式の両辺を 1.2(合同式の累乗) に従って
となり、これから、
が得られます。この式は
となり、7.3 が証明できました。この証明の過程から、
オイラーの定理(7.1)と、オイラーの定理・その2(7.3)を
として具体的に書いてみると次の通りです。
 オイラーの定理の別証明  |
いままでは「オイラー関数の乗法性」を導出して、それをもとにオイラーの定理(とその最小公倍数版)を証明しました。しかし単にオイラーの定理だけを証明したいのなら、以下のようにフェルマの小定理(3.1)のときと同じ論法で可能です。
と並べます。これらはすべて相異なる数です。次に
を作ります。そして、それぞれの数を
です。
とするとき、
さらに、
になります。なぜなら、もし
です。仮定より
となりますが、
となり、
ということは、
と書くとすると、
となります。そこで、1.1c(合同式の乗算)を上の
が得られます。ここで、そもそもの定義から
となって証明が完成しました。
8. RSA暗号の一般形
オイラー関数とオイラーの定理(オイラーによるフェルマの小定理の一般化)を用いると、RSA暗号(4.1)の一般形を次のように記述できます。
8.1 | RSA暗号の一般形 |
暗号化: 複号化: |
一般形にしてしまうと、複号化の式の証明はいたってシンプルになります。
となり証明できました。最後の式の変形のところで 7.1 と 1.2(合同式の累乗)を使っています。また 7.3 で証明したように、
実際のRSA暗号は
しかし実用的な暗号のためには、素因数分解が困難であり(=
全体のまとめ
最後に、RSA暗号についての説明全体をまとめると、以下のようになるでしょう。
RSA暗号は数論(整数論)の基礎から構成されている。その基礎には、ユークリッド、孫子算経、フェルマ、オイラーなどによる数学史の重要な発見が詰まっている。 | |
RSA暗号における公開鍵・秘密鍵の生成式、暗号化・復号化の式には巨大数の演算が現れるが、それは実用的に計算可能である。 | |
RSA暗号の原理は、整数の "加減乗除" と "累乗(冪乗)" の知識をベースとして、そこから論理を積み重ねることで理解可能である。つまり「高校数学程度の知識で理解」できる。 |
この最後の点が、ここに「RSA暗号の数理」を掲載した目的でした。
2021-05-15 11:49
nice!(0)
No.310 - 高校数学で理解するRSA暗号の数理(1) [科学]
No.235「三角関数を学ぶ理由」では、私たちが学校で勉強を学ぶ目的の一つが「論理的に考える力を養う」こととし、その典型例として数学をとりあげました。数学は「論理のみで成り立っている」からです。そのことを改めて示すために sin ⁡ θ の微分が cos ⁡ θ になることを、三角関数のそもそもの定義に立ち返って証明しました。
今回はその継続・発展で、別の数学の問題を取り上げます。現代社会で広く使われている公開鍵暗号(その中の RSA暗号)です。これを取り上げる理由は、
の3点です。以下の文章は元々別の目的のために作ったものですが、ここに掲載することにします。
公開鍵暗号
公開鍵暗号とは、
というタイプの暗号です。公開鍵暗号のメリットは多々ありますが、一番のメリットは「鍵を配送するコストがかからない」ことです。全ての鍵を秘匿する暗号だと、その鍵をどうやって配送して暗号化をしたい人に届けるかが大きな問題となります。暗号化通信で配送するというのは解決になりません。その暗号化通信の暗号鍵をどうやって配送するかという問題が残るからです。
公開鍵暗号では暗号化のための鍵がオープンなので、配送のコストはゼロです。暗号文を受け取りたい人が公開鍵と秘密鍵を生成し、公開鍵をオープンにすると誰でもその人に暗号文を送ることができます。
公開鍵暗号の設計の最大のポイントは、あたりまえですが、公開鍵から秘密鍵を推定したり導出したりできないことです。まさにそこに数学が使われていて、暗号文を解読できないようになっています。この「暗号化の鍵を公開してしまう」という革新的なアイデアというか、まさに "究極の逆転の発想" を論文として発表したのは、当時スタンフォード大学の研究者だったディフィー(米)とヘルマン(米)で、1976年のことでした。
そのディフィーとヘルマンのアイデアに基づいた最初の暗号が RSA暗号で、現代でも盛んに使われています。これは 1978年に MIT のリベスト(米)、シャミア(イスラエル)、エーデルマン(米)の3人のよって発明され、3人の頭文字をとってRSAと呼ばれています。
実はこの RSA暗号は、実用として何に使ったらいいのか、発表当時は使い道が分からなかったといいます。それが現代ではインターネットによる通信の重要技術として広く使われている。これにはコンピュータの処理速度の飛躍的向上も貢献しています。革新的な技術は、その応用環境が整った時点で、後から実用化される。よくあることです。
以下、このRSA暗号の数理を順に見ていきます。
RSA暗号の例題
まずRSA暗号はどういうものか、それを極めて簡単な例題で説明します。
平文(=暗号化する文)をP で、またそれを暗号化した暗号文を C で表します。例題として平文は1文字だけの英字で、それを整数に変換したものとします。RSA暗号にちなんで大文字の R が平文です。コンピュータで使われる ASCII(アスキー)コードでは、英大文字・英小文字・数字・特殊記号を 1 ~128 の数で表すので、それを使って数字化すると R は 82 です。つまり、
P = 82
が例題の平文です。
公開鍵は2つの数字のペアe n 、秘密鍵は一つの数字 d で、例題としては、
とします。この公開鍵と秘密鍵の作り方は後で述べます。平文から暗号文への変換(=暗号化)と、暗号文から平文への変換(=復号化)を次の計算で行います。以降の記述では、a を b で割った余り(=剰余)を a mod b と書きます(プログラム言語やEXCELで mod ⁡ a b と書くのと同じ意味です)。
例題の平文を暗号化の式に入れると、
C = 82 133 mod 143 = 4
となり、平文 "82 " に対する暗号文は "4 " です。82 133 は巨大な数ですが、剰余を求めるときにこの巨大数を計算する必要は全くありません。上の程度の計算なら電卓でも簡単にできます。そのやり方は後ほど示します(「4. RSA暗号の証明」)。暗号文の復号化は、暗号文 "4 " を復号化の式に入れると、
P = 4 37 mod 143 = 82
となり、元の平文である "82 " が復元できました。なお、この例では平文をわずか1文字(2 7 以下の数字)としましたが、実際に使われる暗号では 2 1024 程度(10進で約300桁程度)の数字です(= 平文を数字化したもの。平文が長い場合は複数に分割)。また、公開鍵 e n と秘密鍵 d も同程度の大きさの数字です。
この計算で暗号化と復号化が可能なのは、公開鍵と秘密鍵の作り方に工夫があるからです。まずn は2つの素数 p = 11 と q = 13 の積です。
またe は、e と p - 1 ⁢ q - 1 = 120 との最大公約数が 1 であるように決めてあります。e = 133 = 7 · 19 なので、133 と 120 との共通の約数は 1 だけです。さらに秘密鍵である d は、
d · e mod p - 1 ⁢ q - 1 = 1
となるように決めてあります。37 · 133 = 4921 = 41 · 120 + 1 なので成り立っています。このように鍵を仕込んでおくと暗号化と復号化が可能になる。そのことを証明するのが、本記事の目的です。その証明を、前提とする数学知識を最小限にしてやってみたいと思います。
公開鍵暗号は「公開鍵から秘密鍵が導出できない」ことが必須です。RSA暗号では、n = p · q と素因数分解ができれば、
d · e mod p - 1 ⁢ q - 1 = 1
の式を解いてd が求まります。しかし実用で使われるRSA暗号は最低でも n の桁数が10進数で300桁程度です(2進数で 1024ビット程度。平文も同等の長さ)。この程度の大きさの整数の素因数分解は、超高速コンピュータをもってしても困難です。もしコンピュータの速度がさらに向上するなら、鍵の桁数をさらに大きくすればよい。この素因数分解の困難性が、RSA暗号が成り立つ理由です。
以降でRSA暗号の暗号化と復号化の式が成り立つことの証明を行います。さらに、単に成り立つことだけでなく、RSA暗号に関わる各種の式が計算可能であることの説明をします。"式が正しい" ことと、その "式が実用的に計算可能である" ことは違うからです。素因数分解がまさにその例です。
まず、整数の性質についての用語の定義からです。用語は RSA暗号の式の証明に必要なものだけに絞ります。以降に現れる "数" やそれを表す記号は、ほとんど場合は整数のことですが、自然数(1以上の整数)を意味する場合もあります。どちらかは文脈から明らかなので、いちいち断りなく使います。
準備:用語の定義
割り切る・約数・因数・最大公約数
整数N を a で割ったときの余りがゼロのとき、N は a で割り切れると言い、また、a は N を割り切ると言います。このことを記号を使って、
a | N
と書きます。またこのときのa を N の約数と呼びます。N | N と 1 | N は常に成り立つので、1 と N は N の約数です。
N が 2つ以上の数の積で表されるとき、そのおのおのの数を N の因数と呼びます。因数は約数と同じものですが、見方の違いと言えるでしょう。
2つの数、N と M があったとき、共通の約数を公約数と言います。また、公約数のうち最大のものを最大公約数と呼び、gcd ⁡ N M で表します。
素数と素因数分解
2以上の整数N の約数が 1 と N のみのとき、N を素数と言い、そうでない数を合成数と言います。合成数は 1 と N 以外の約数を持ちます。約数(=因数)が素数のとき、それを素因数と呼びます。N が素数の場合は N が素因数です。
合成数は素因数の積で表現できます(=素因数分解)。なぜなら、定義によって合成数N は、1 でも N でもない数 a と b を使って N = a · b と表現(=分解)できますが、a や b が合成数なら、さらに分解を繰り返すことによって最終的には素数の積にたどり着くからです。なお便宜上、素数はそれ自身が素因数分解であるとします。
「素数」と「大きな数の素因数分解の困難性」が RSA暗号の基礎になっているのは、例題で説明した通りです。
素因数分解の一意性
素因数分解は、かけ算の順序を無視して一意に決まります(=素因数分解の一意性)。これは自明のように思えますが、証明をすると次の通りです。
いま(かけ算の順序は無視して)異なった2種類の素数列の積で表現できる合成数がある(=素因数分解が一意ではない)と仮定します。すると、そのような最小の数、N があるはずです。このとき N は、p i と q i を素数として、
N =
p 1 ⁢ p 2 ⁢ p 3 ⁢ … ⁢ p r
=
q 1 ⁢ q 2 ⁢ q 3 ⁢ … ⁢ q s
と表現できます。ここでp 1 に着目すると p 1 | N なので、p 1 | q i となる q i があるはずです。かけ算の順序は無視するので、p 1 | q 1 として一般性を失いません。ところが q 1 は素数なので、q 1 = p 1 しかあり得ない。そこで式の全体を p 1 で割ると、
N
p 1
= p 2 ⁢ p 3 ⁢ … ⁢ p r
= q 2 ⁢ q 3 ⁢ … ⁢ q s
となります。これはN p 1 が2つの異なった形に素因数分解できることを示しています。ところが N p 1 は N より小さい数なので「N が2つの異なった形に素因数分解できる最小の数」ということに矛盾します。従って「2つの異なった形で素因数分解できる数がある」という仮定が誤りであり、素因数分解の一意性が示されました。
互いに素
整数N と 整数 M の最大公約数が 1 のとき、つまり gcd ⁡ N M = 1 のとき、「N と M は互いに素である」と言います。これは N と M が共通の素因数を持たないことと同じです。なお、gcd ⁡ N 1 = 1 は常に成り立つので、1 は他の数と互いに素です。
以降の、RSA暗号の証明に至るプロセスでは「互いに素」に関連した数々の定理や証明が出てきます。RSA暗号は「素数」と「互いに素」の上に構築された暗号です。
用語の定義はここまでです。以降はRSA暗号の成立性の証明に入ります。まず、数の "合同" の概念からです。
1. 合同
合同の概念はRSA暗号の根幹の一つです。m を 2 以上の整数とするとき、2つの整数 a , b について
a と b は m を法として合同であると言い、
a ≡ b mod m
と書きます。少々ややこしいですが、はじめに書いたようにa mod b とすると「a を b で割った余り」の意味です。以下に、合同の性質でRSA暗号の証明に必要なものをあげます。
これらの性質は、それぞれの数を、
a = k a · m + r 1
b = k b · m + r 1
c = k c · m + r 2
d = k d · m + r 2
というように書いて計算をすればすぐにわかります。たとえば 1.1c(合同式の乗算)を証明するには、a と c の式をかけ算し、b と d の式をかけ算して、
m | a ⁢ c - r 1 ⁢ r 2
m | b ⁢ d - r 1 ⁢ r 2
が得られますが、2つの数が共にm で割り切れると、その差も m で割り切れます。従って、
m | a ⁢ c - r 1 ⁢ r 2 - b ⁢ d - r 1 ⁢ r 2
m | a ⁢ c - b ⁢ d
a ⁢ c ≡ b ⁢ d mod m
となります。
これは 1.1c で、c = a 、d = b とおいて 1.1c を "繰り返して使う" ことでわかります。"繰り返して使う" ことを証明として書くなら数学的帰納法になるでしょう。以降は「互いに素」に関連した合同の性質です。
合同の定義により
m | a ⁢ x - b ⁢ x
m | x ⁢ a - b
となります。ここで一般的に次の 1.3a が成り立つことに注意します。
m と x は互いに素なので、m と x に共通の素因数はありません。従って、m を素因数分解したときに現れる素因数は、すべて n の素因数のはずです。でないと、m | x ⁢ n とはならないからです。従って m | n となります。このことを m | x ⁢ a - b に適用すると、
m | a - b
a ≡ b mod m
となり、1.3 が証明されました。1.3 は以降の証明にたびたび出てくる重要な定理です。1.3 を一般化したのが次の 1.4 です。
a , b , x , y を、m と 剰余 r を使って次のように表します。
a
= k a · m + r a
b
= k b · m + r b
x
= k x · m + r
y
= k y · m + r
0 ≤
r a r b r
< m
このようにおくと、a ⁢ x ≡ b ⁢ y mod m より、
r · r a ≡ r · r b mod m
となります。一方、r と m は互いに素です。なぜなら、もし r と m が 1 ではない共通の約数 c をもつとすると、上の x の式から c は x の約数にもなり、x と m が互いに素ではなくなるからです。また、y の式から c は y の約数でもあり、y と m が互いに素という前提にも反します。このように r と m は互いに素なので 1.3 を使って、
r a ≡ r b mod m
となりますが、0 ≤ r a r b < m なので、r a = r b となり、
a ≡ b mod m
が示されました。
a ≡ b mod m なので、合同の定義から m | a - b です。また、a ≡ b mod n なので、合同の定義から n | a - b であり、a - b = k 1 ⁢ n と表せます。この式の a - b を m | a - b に代入すると、
m | k 1 ⁢ n
となります。m と n は互いに素なので 1.3a を使うと、
m | k 1
となり、従ってk 1 = k 2 ⁢ m と表せることになります。この k 1 を a - b = k 1 ⁢ n に代入すると、
a - b = k 2 ⁢ m ⁢ n
m ⁢ n | a - b
a ≡ b mod m ⁢ n
となって 1.5 が証明できました。
合同には数々の性質や定理がありますが、RSA暗号の証明に必要なものは以上です。次に、2つの数の最大公約数を求める「ユークリッドの互除法」です。これは最大公約数を求める計算方法というだけでなく、RSA暗号において公開鍵と秘密鍵を生成する際に必須のものです。
2. ユークリッドの互除法
ユークリッドの互除法は 2つの自然数(a と b 。a > b とします)の最大公約数を求める計算方法です。これはユークリッドの数学書である『原論』にあります。『原論』は紀元前 300年頃の成立といいますから、2300年ほど前の書物ということになります。
この計算方法では、割り算(除算)を何ステップか繰り返します。割り算において被除数(=割られる数)と除数(=割る数)、商(=答)、剰余(=余り)の関係は、
ですが、まず第1ステップとして、
とおき、
の計算をして、商1と剰余1を求めます。次に第2ステップとして、
とおいて割り算を行い、商2と剰余2を求めます。つまり、
です。この「除数と剰余を新たな被除数と除数にして割り算をする」ステップを次々と繰り返して行くと、剰余は次第に小さくなっていき、ついには剰余がゼロ(= 被除数が除数で割り切れる)となります。この時点での除数(= 一つ前のステップの剰余)がa と b の最大公約数です。
なぜそうなるのかが以下ですが、ポイントは割り算の式から明らかなように「被除数と除数の公約数は、剰余の約数でもある」ことです。つまりa と b の約数であるという性質が剰余に引き継がれ、それは割り算のステップを繰り返してもずっと続きます。しかも、剰余はステップが進むにつれて小さくなっていくので、最大公約数に近づく。そして割り切れたときの除数(一つ前のステップの剰余)は、約数であると同時に最大の約数である。おおまかにはそのような理解です。
a と b (a > b )の公約数を x とします。すると、x | a かつ x | b なので、(1) 式から x | r 1 になります。この x | r 1 と x | b から (2) 式を使って x | r 2 が得られます。
その次にはx | r 1 、x | r 2 、(3) 式から x | r 3 になる。以上を最後まで繰り返すと、次のようになります。
x | a , x | b , (1)式 → x | r 1
x | b , x | r 1 , (2)式 → x | r 2
x | r 1 , x | r 2 , (3)式 → x | r 3
⋮
x | r i - 4 , x | r i - 3 , (i−2)式 → x | r i - 2
x | r i - 3 , x | r i - 2 , (i−1)式 → x | r i - 1
x | r i - 2 , x | r i - 1 , (i)式 → x | r i
以上のように、最終的にはx | r i となり、
a と b の公約数は r i の約数である
ことが示せました。同時に、
a と b の公約数の最大値は r i である
ことも分かります。
次に、ユークリッドの互除法の最終プロセスに現れる剰余は、全てのステップの剰余の約数になっていることを示します。このことを最終ステップから順に遡って検証すると、
(i+1)式 → r i | r i - 1
r i | r i - 1 , (i)式 → r i | r i - 2
r i | r i - 2 , r i | r i - 1 , (i−1)式 → r i | r i - 3
r i | r i - 3 , r i | r i - 2 , (i−2)式 → r i | r i - 4
⋮
r i | r 2 , r i | r 3 , (3)式 → r i | r 1
r i | r 1 , r i | r 2 , (2)式 → r i | b
r i | b , r i | r 1 , (1)式 → r i | a
となり、r i | b かつ r i | a 、つまり、
r i は a と b の公約数である
ことが示せました。
従って、
の2つから、gcd ⁡ a b = r i が証明できました。
RSA暗号にとってのユークリッドの互除法の意味ですが、次の2つが重要です。まず第1に「2つの数の最大公約数は、素因数分解なしに計算できる」ことです。これはすなわち「2つの数が互いに素であることが素因数分解なしに示せる」ことも意味します。
我々が普通、学校で習う最大公約数の求め方は、2つの数を素因数分解して共通の素因数を探すというものでした。共通のものがなければ最大公約数は1 (=互いに素)です。しかし、数が巨大になると素因数分解が困難になります(それがRSA暗号が成り立つゆえんです)。ユークリッドの互除法を使うと「最大公約数」や「互いに素」が素因数分解なしに示せるのです。
第2は、ユークリッドの互除法が高速に計算できることです。ユークリッドの互除法では、一つのステップの剰余が次のステップの除数になります。次のステップの剰余は除数より小さいので、
0 < r i + 1 < r i
となりますが、r i + 1 が 0 に近いと計算は急速に収束します。また r i + 1 が r i に近い場合でも、その次のステップの商が大きくなり、r i + 2 が 0 に近くなるので、計算は収束することになります。従って、最も計算が長引くのは、r i + 1 が r i の半分程度で、それが連続する場合だと推測できます。
実は、ユークリッドの互除法のステップが最も長くなるケースが知られています。それは 割り算の商が常に1 になるケースで、a と b が(たまたま)フィボナッチ数列の隣り合う2項だとそうなります。フィボナッチ数列とは、
F 0 = 0 ,
F 1 = 1
F n + 2 = F n + 1 + F n
で定義される数列で、実際に書いてみると、
0 1 1 2 3 5 8 13 21 34 55 89 ⋯
です。いま、a = 144 、b = 89 としてユークリッドの互除法の計算をしてみると
144 = 1 · 89 + 55
89 = 1 · 55 + 34
55 = 1 · 34 + 21
34 = 1 · 21 + 13
21 = 1 · 13 + 8
13 = 1 · 8 + 5
8 = 1 · 5 + 3
5 = 1 · 3 + 2
3 = 1 · 2 + 1
2 = 2 · 1
となって、10ステップかかります。剰余が減る割合が常に 0.6 倍程度で、なかなか減りません。商が常に 1 なのでこうなります。しかし、なかなか減らないが毎回 0.6 倍程度にはなり、マクロ的には急速に小さくなる。証明は省略しますが、a と b が10進で N 桁の数字でフィボナッチ数列の隣り合う2項だった場合でも、ユークリッドの互除法は 5 ∗ N ステップ以下で終了します。
これはa とb が300桁程度の数字のとき、それが偶然にもフィボナッチ級数の隣り合う2項であるという最悪の最悪の場合でも 1500回の割り算で終了することを意味します。この程度の計算はもちろんコンピュータで可能です。
本題に戻ります。最初の「RSA暗号の例題」のところで公開鍵の作り方を書きました。まず2つの素数、p と q を選び、n = p · q とします。次に、p - 1 ⁢ q - 1 との最大公約数が 1 であるような数(=互いに素)を選び、それを e とします。その e n のペアを公開鍵とするのでした。
n と同程度の大きさの数、e をランダムに選んだとき、その e が p - 1 ⁢ q - 1 と互いに素であるかどうかは、ユークリッドの互除法で検証可能です。そしてこの検証は p と q が巨大な数であっても可能です。つまりユークリッドの互除法は公開鍵が現実に作成できるという数学的根拠になっています。
2.1 において、a と b の最大公約数は r i でしたが、この r i は (1)式における b と r 1 の最大公約数にもなります。なぜなら、b と r 1 の最大公約数を求めるためには (2)式から互除法の計算を始めればよく、その結果は r i になるからです。これは次を意味します。
つまり、ユークリッドの互除法は
ものといえます。この置き換えは次々と可能で、置き換えるたびに問題がより "小さく" なっていく。これがユークリッドの互除法の本質です。
そのユークリッドの互除法は "世界最古のアルゴリズム" と言われています。そして、アルゴリズムを記述するのに最適な言語はプログラミング言語です。2.1a の考え方に基づき、ユークリッドの互除法で最大公約数を計算するプログラムを掲げます。
①の "%" は Javascript の剰余演算子で、"a % b" は "a を b で割った余り" という意味です(a mod b と同じ)。なお、このプログラムはa < b でも動作します。
もちろん、Javascript でなくても、C++ でも Python でも記述できます。このようにプログラムで書くと簡潔になって、ユークリッドの互除法というアルゴリズムの本質がクリアにわかります。
ユークリッドの互除法の "副産物" として、次の定理が成り立ちます。
この定理の証明ですが、ユークリッドの互除法の計算過程を振り返ると、
a = q 1 · b 1 + r 1 ⋯ (1)
b = q 2 · r 1 + r 2 ⋯ (2)
r 1 = q 3 · r 2 + r 3 ⋯ (3)
r 2 = q 4 · r 3 + r 4 ⋯ (4)
⋮
r i - 3 = q i - 1 · r i - 2 + r i - 1 ⋯ (i−1)
r i - 2 = q i - 0 · r i - 1 + r i - 0 ⋯ (i)
r i - 1 = q i + 1 · r i ⋯ (i+1)
でした。ここで(1) を変形して、
r 1 = u 1 · a + v 1 · b
とします。u 1 = 1 , v 1 = - q 1 です。次に、今求めた r 1 と (2) を使うと、
r 2 = u 2 · a + v 2 · b
の形に表せることになります。u 2 = - q 2 , v 2 = 1 +q 1 ⁢ q 2 です。さらに、求まった r 1 と r 2 と (3) を使って、
r 3 = u 3 · a + v 3 · b
と表せることが分かります。このステップを順に続けていって(i) まで到達すると、
r i = u · a + v · b
u , v は q j 1 ≤ j ≤ i の式
となることがわかります。r i = gcd ⁡ a b だったので、2.2 が証明できました。u と v のうち、一つは正の整数、もう一つはゼロか負の整数です。一つがゼロであるのは、a = b のときです。なお、2.2 を満たす u 、v に、
u · a + v · b = 0
を満たすu 、v をそれぞれ足し込んでも 2.2 が成立することが明白です。つまり 2.2 を満たす u 、v は1組というわけではありません。
なお、2.2 は次のように言い換えることができます。
ユークリッドの互除法を拡張して、a と b が与えられたとき、gcd ⁡ a b と、
a ⁢ u + b ⁢ v = gcd ⁡ a b
を満たすu と v (=無数にある解のうちの一つのペア)を同時に計算してしまうアルゴリズムを考えてみます。
考え方は 2.1b のユークリッドの互除法と同じで、解くべき問題を「等価でより小さな問題」に置き換えます。そのためにa = q ⁢ b + r とおくと、2.1a より、
gcd ⁡ a b = gcd ⁡ b r
なので、問題は次のように書き換えられます。
q ⁢ b + r ⁢ u + b ⁢ v = gcd ⁡ b r
ここで、未知数のu と v を次のように変換します。
u = V
v = U - q ⁢ V
これを代入して式を整理すると
b ⁢ U + r ⁢ V = gcd ⁡ b r
となり、"小さな問題" に変換することができました。この考え方でアルゴリズムを記述すると次のとおりです。
以下は、このアルゴリズムの補足説明です。
この拡張ユークリッドの互除法のアルゴリズムは、2.1b のユークリッドのアルゴリズムとほぼ同じです。ただし、u と v の計算のために変数を変換しているので、最大公約数を計算したあとに元の変数値を求める必要があります(=⑤)。そこが違います。
このことから、拡張ユークリッドの互除法の計算量は、ユークリッドの互除法のほぼ2倍だと推測できます。計算は少々複雑になりますが、たとえa や b が巨大な数であっても、コンピュータで高速に計算できる。このことは次の「整数の逆数」の項で述べるように、RSA暗号にとっての重要ポイントになります。
2.2 から導かれる次の定理は、RSA暗号にとって重要です。
2.2 においてa と互いに素な数 m を選び、b = m とおくと、gcd ⁡ a m = 1 なので、適当な u と v をとることにより、
u · a + v · m = 1
とすることができます。すなわち、
a · u ≡ 1 mod m
となり、2.3 が示されました。このときa · u は m と互いに素であり、また a と m は互いに素なので、b も m と互いに素になります。また、b 1 と b 2 の2つの解があるとすると、
a · b 1 ≡ 1 mod m
a · b 2 ≡ 1 mod m
a ⁢ b 1 - b 2 ≡ 0 mod m
m | a ⁢ b 1 - b 2
となり、a と m は互いに素なので 1.3a より、
m | b 1 - b 2
b 1 ≡ b 2 mod m
となります。従って、1 ≤ b < m の範囲に b があり、かつ、この範囲で b は一意に定まります。m を法として b と合同な数も解であることは明白ですが、それらの解は m を法として唯一です。
2.3 の "逆数" を計算するアルゴリズムは、拡張ユークリッドの互除法2.2 のアルゴリズム(2.2b)と基本的に同じです。
①で、extdEUCLID のアルゴリズム(2.2b)を使ってu を求め、それを m 未満の自然数に直して答えの b を求めています。( b + m )% m は b が負の場合の配慮です。このアルゴリズムは正確に言うと、a と m が与えられたとき、
a · b ≡ gcd ⁡ a m mod m
となるb を求めるアルゴリズムです。a と m が互いに素でなくても成立します。
この "逆数の存在定理" は RSA暗号において秘密鍵の算出に使われています。冒頭の「RSA暗号の例題」に書いたように、RSA暗号の公開鍵と秘密鍵は、まず秘密の2つの素数p と q を決め、
n = p · q
とします。そしてe を、
gcd ⁡ e p - 1 ⁢ q - 1 = 1
となるように決め、n と e を公開鍵とするのでした。そして秘密鍵 d を、
d · e ≡ 1 mod p - 1 ⁢ q - 1
を満たす数とします。この秘密鍵d の計算は、mod p - 1 ⁢ q - 1 の世界で e の逆数を求めていることに他なりません。逆数の存在が保証されるのは、e を p - 1 ⁢ q - 1 と互いに素という条件で決めたからです。さらに、この逆数の計算アルゴリズムは 2.2b の拡張ユークリッドの互除法と同じなので高速に計算できることが重要ポイントです。
普通、整数の "逆数"は(整数の範囲で)定義できません(1以外は)。しかし、"mod m の合同の世界" では、m と互いに素な数 a に対して逆数が定義できることになります。つまり整数の範囲で「割り算」が定義できる。
たとえばmod 10 の世界では 7 × 3 = 1 であり、7 の逆数は 3 です。割り算は逆数のかけ算なので、たとえば 8 ÷ 7 = 8 × 3 = 4 (mod 10 の世界)といった演算が定義できます。"検算" をすると 4 × 7 = 8 (mod 10 の世界)なので合っています。
mod 10 の場合は実用的な意味はありませんが、p を素数としたとき「mod p の世界」は大変重要です。というのも p 未満の自然数はすべて p と互いに素だからです。つまり p 未満の全ての自然数に対して "逆数" が定義できます。
2.3b はほとんど 2.3 と同じです。「異なるa に対する逆数 b は異なる」というところですが、もし 1 ≤ i < j < p である i と j に対して、
i · b ≡ 1 mod p
j · b ≡ 1 mod p
となったとすると、
j - i · b ≡ 0 mod p
ですが、j - i も b も p と素なので矛盾します。異なる a に対する逆数 b は異なります。
このように逆数が存在するということは、p 未満の2つの自然数の "除算" が定義できます。さらに、0 と p 未満の自然数を合わせると加減乗除が行えることになります。
加減乗除が定義された集合を「体(Field)」と呼びます。有理数、実数、複素数は「体」ですが、「0 と p 未満の自然数」も体になります。これを F p と表記します。この集合の要素の数は有限個なので「有限体」です。 F 13 の場合(mod 13 )で "逆数" の計算をしてみると、
1 · 1 ≡ 1 mod 13
2 · 7 ≡ 1 mod 13
3 · 9 ≡ 1 mod 13
4 · 10 ≡ 1 mod 13
5 · 8 ≡ 1 mod 13
6 · 11 ≡ 1 mod 13
7 · 2 ≡ 1 mod 13
8 · 5 ≡ 1 mod 13
9 · 3 ≡ 1 mod 13
10 · 4 ≡ 1 mod 13
11 · 6 ≡ 1 mod 13
12 · 12 ≡ 1 mod 13
となり、0 以外の F 13 の要素は、その逆数(=逆元)と1対1に対応していることがわかります。
F p においては "整数" の加減乗除を "自由かつ厳密に" 行うことができます。これは、全ての情報を2進数に帰着させて扱うデジタル・コンピュータとの相性がよい。このため、公開鍵暗号の中には F p の演算を利用したものがあります。
なお、p を素数としたとき「p 未満の自然数はすべて p と互いに素」ということは「p - 1 ! と p は互いに素」ということです(" ! " は階乗記号)。これは次の「フェルマの小定理」の証明に出てきます。
3. フェルマの小定理
フェルマの小定理は RSA暗号の根幹にかかわるものです。フェルマは17世紀フランスの大数学者(1607-1665)で、有名なフェルマの最終定理(大定理)と区別するために「小定理」の名があります。
これは少々意外な定理です。我々が学校で習う素数は、自身と1 以外の約数を持たない数という定義か、素因数分解の定理か、そういうものです。「素数がもつ性質」に言及した定理はあまり思い浮かばない。しかしフェルマの小定理は、素数であれば必ずこうなると言っているわけです。これは次のように証明できます。
1
2
3
…
p - 1
のそれぞれに a をかけて、
a
2 ⁢ a
3 ⁢ a
…
p - 1 ⁢ a
という数列を作ります。そして、それぞれの数をp で割った剰余を b i とします。つまり、
a
≡ b 1 mod p
2 ⁢ a
≡ b 2 mod p
3 ⁢ a
≡ b 3 mod p
⋮
p - 1 ⁢ a
≡ b p - 1 mod p
です。p は素数なので 1 から p - 1 までの数は p と素であり、また a は仮定により p と素です。従って b i が 0 になることはなく、1 ≤ b i ≤ p - 1 です。このとき、1 ≤ i , j ≤ p - 1 である i , j について、
i ≠ j であれば、必ず b i ≠ b j
になります。なぜなら、もしb i = b j とすると、1.1b(合同式の減算)より、
i - j ⁢ a ≡ 0 mod p
です。仮定よりa は p と互いに素なので、1.3 により(1.3 で b = 0 の場合)、
i - j ≡ 0 mod p
となりますが、1 ≤ i , j ≤ p - 1 なので、
i = j
となり仮定に反します。つまりi ≠ j であれば、必ず b i ≠ b j です。ということは、p - 1 個の数、b i 1 ≤ i ≤ p - 1 は全て違う数であり、つまり、
1
2
3
…
p - 1
を並び替えたものです。従って、b i を全部かけ算すると、
b 1 ⁢ b 2 ⁢ b 3 ⁢ … ⁢ b p - 1 = p - 1 !
となります。そこで、1.1c(合同式の乗算)を上のp - 1 個の合同式に適用して左辺と右辺を全てかけ合わせてしまうと、
p - 1 ! · a p - 1
≡ b 1 ⁢ b 2 ⁢ b 3 ⁢ … ⁢ b p - 1 mod p
≡ p - 1 ! mod p
となります。ここで、p は素数なので p と p - 1 ! は互いに素です。すると 1.3 により、
a p - 1 ≡ 1 mod p
となり、証明が完成しました。
今回はその継続・発展で、別の数学の問題を取り上げます。現代社会で広く使われている公開鍵暗号(その中の RSA暗号)です。これを取り上げる理由は、
2000年にわたる数学(数論 = 整数論)の基礎の上に作られた暗号である。 | |
インターネットの重要技術の一つであり、現代社会のインフラとなっている。 | |
高校生程度の前提知識があれば、論理的思考を積み重ねることで十分に理解できる(= タイトルの「高校数学で理解する」の意味)。 |
の3点です。以下の文章は元々別の目的のために作ったものですが、ここに掲載することにします。
公開鍵暗号
公開鍵暗号とは、
暗号化の手順と、そこで使用する暗号化のための "鍵" が公開されている(その鍵が "公開鍵")。 | |
暗号文を解読するための手順も公開されているが、それに使う "鍵" は秘匿されている(その鍵が "秘密鍵")。 |
というタイプの暗号です。公開鍵暗号のメリットは多々ありますが、一番のメリットは「鍵を配送するコストがかからない」ことです。全ての鍵を秘匿する暗号だと、その鍵をどうやって配送して暗号化をしたい人に届けるかが大きな問題となります。暗号化通信で配送するというのは解決になりません。その暗号化通信の暗号鍵をどうやって配送するかという問題が残るからです。
公開鍵暗号では暗号化のための鍵がオープンなので、配送のコストはゼロです。暗号文を受け取りたい人が公開鍵と秘密鍵を生成し、公開鍵をオープンにすると誰でもその人に暗号文を送ることができます。
公開鍵暗号の設計の最大のポイントは、あたりまえですが、公開鍵から秘密鍵を推定したり導出したりできないことです。まさにそこに数学が使われていて、暗号文を解読できないようになっています。この「暗号化の鍵を公開してしまう」という革新的なアイデアというか、まさに "究極の逆転の発想" を論文として発表したのは、当時スタンフォード大学の研究者だったディフィー(米)とヘルマン(米)で、1976年のことでした。
![]() |
ディフィーとヘルマンは公開鍵暗号の発明の功績で、コンピュータ・サイエンス分野のノーベル賞といわれるチューリング賞を 2015年に受賞した。 |
そのディフィーとヘルマンのアイデアに基づいた最初の暗号が RSA暗号で、現代でも盛んに使われています。これは 1978年に MIT のリベスト(米)、シャミア(イスラエル)、エーデルマン(米)の3人のよって発明され、3人の頭文字をとってRSAと呼ばれています。
実はこの RSA暗号は、実用として何に使ったらいいのか、発表当時は使い道が分からなかったといいます。それが現代ではインターネットによる通信の重要技術として広く使われている。これにはコンピュータの処理速度の飛躍的向上も貢献しています。革新的な技術は、その応用環境が整った時点で、後から実用化される。よくあることです。
![]() |
RSA暗号を発明した3人は、チューリング賞を 2002年に受賞している。 |
以下、このRSA暗号の数理を順に見ていきます。
RSA暗号の例題
まずRSA暗号はどういうものか、それを極めて簡単な例題で説明します。
平文(=暗号化する文)を
が例題の平文です。
公開鍵は2つの数字のペア
公開鍵 : e = 133 n = 143
秘密鍵 :d = 37
秘密鍵 :
とします。この公開鍵と秘密鍵の作り方は後で述べます。平文から暗号文への変換(=暗号化)と、暗号文から平文への変換(=復号化)を次の計算で行います。以降の記述では、
暗号化 : C = P e mod n
復号化 :P = C d mod n
復号化 :
例題の平文を暗号化の式に入れると、
となり、平文 "
となり、元の平文である "
この計算で暗号化と復号化が可能なのは、公開鍵と秘密鍵の作り方に工夫があるからです。まず
また
となるように決めてあります。
公開鍵暗号は「公開鍵から秘密鍵が導出できない」ことが必須です。RSA暗号では、
の式を解いて
以降でRSA暗号の暗号化と復号化の式が成り立つことの証明を行います。さらに、単に成り立つことだけでなく、RSA暗号に関わる各種の式が計算可能であることの説明をします。"式が正しい" ことと、その "式が実用的に計算可能である" ことは違うからです。素因数分解がまさにその例です。
まず、整数の性質についての用語の定義からです。用語は RSA暗号の式の証明に必要なものだけに絞ります。以降に現れる "数" やそれを表す記号は、ほとんど場合は整数のことですが、自然数(1以上の整数)を意味する場合もあります。どちらかは文脈から明らかなので、いちいち断りなく使います。
準備:用語の定義
割り切る・約数・因数・最大公約数
整数
と書きます。またこのときの
2つの数、
素数と素因数分解
2以上の整数
合成数は素因数の積で表現できます(=素因数分解)。なぜなら、定義によって合成数
「素数」と「大きな数の素因数分解の困難性」が RSA暗号の基礎になっているのは、例題で説明した通りです。
素因数分解の一意性
素因数分解は、かけ算の順序を無視して一意に決まります(=素因数分解の一意性)。これは自明のように思えますが、証明をすると次の通りです。
いま(かけ算の順序は無視して)異なった2種類の素数列の積で表現できる合成数がある(=素因数分解が一意ではない)と仮定します。すると、そのような最小の数、
と表現できます。ここで
となります。これは
互いに素
整数
以降の、RSA暗号の証明に至るプロセスでは「互いに素」に関連した数々の定理や証明が出てきます。RSA暗号は「素数」と「互いに素」の上に構築された暗号です。
用語の定義はここまでです。以降はRSA暗号の成立性の証明に入ります。まず、数の "合同" の概念からです。
1. 合同
合同の概念はRSA暗号の根幹の一つです。
あるいは同じことで、 | |
と書きます。少々ややこしいですが、はじめに書いたように
1.1 | |
1.1a 1.1b 1.1c |
これらの性質は、それぞれの数を、
というように書いて計算をすればすぐにわかります。たとえば 1.1c(合同式の乗算)を証明するには、
が得られますが、2つの数が共に
となります。
1.2 | 合同式の累乗(冪乗) |
|
これは 1.1c で、
1.3 | 互いに素(1) |
|
合同の定義により
となります。ここで一般的に次の 1.3a が成り立つことに注意します。
1.3a | |
|
となり、1.3 が証明されました。1.3 は以降の証明にたびたび出てくる重要な定理です。1.3 を一般化したのが次の 1.4 です。
1.4 | 互いに素(2) |
|
このようにおくと、
となります。一方、
となりますが、
が示されました。
1.5 | 互いに素(3) |
|
となります。
となり、従って
となって 1.5 が証明できました。
合同には数々の性質や定理がありますが、RSA暗号の証明に必要なものは以上です。次に、2つの数の最大公約数を求める「ユークリッドの互除法」です。これは最大公約数を求める計算方法というだけでなく、RSA暗号において公開鍵と秘密鍵を生成する際に必須のものです。
2. ユークリッドの互除法
ユークリッドの互除法は 2つの自然数(
この計算方法では、割り算(除算)を何ステップか繰り返します。割り算において被除数(=割られる数)と除数(=割る数)、商(=答)、剰余(=余り)の関係は、
被除数 = 商 × 除数 + 剰余
ですが、まず第1ステップとして、
= | |
= |
とおき、
被除数1 = 商1 × 除数1 + 剰余1
の計算をして、商1と剰余1を求めます。次に第2ステップとして、
= 除数1 | |
= 剰余1 |
とおいて割り算を行い、商2と剰余2を求めます。つまり、
被除数2 = 商2 × 除数2 + 剰余2
です。この「除数と剰余を新たな被除数と除数にして割り算をする」ステップを次々と繰り返して行くと、剰余は次第に小さくなっていき、ついには剰余がゼロ(= 被除数が除数で割り切れる)となります。この時点での除数(= 一つ前のステップの剰余)が
なぜそうなるのかが以下ですが、ポイントは割り算の式から明らかなように「被除数と除数の公約数は、剰余の約数でもある」ことです。つまり
2.1 | ユークリッドの互除法 |
となったとき、 である。 |
その次には
以上のように、最終的には
ことが示せました。同時に、
ことも分かります。
次に、ユークリッドの互除法の最終プロセスに現れる剰余は、全てのステップの剰余の約数になっていることを示します。このことを最終ステップから順に遡って検証すると、
となり、
ことが示せました。
従って、
の2つから、
計算量 |
RSA暗号にとってのユークリッドの互除法の意味ですが、次の2つが重要です。まず第1に「2つの数の最大公約数は、素因数分解なしに計算できる」ことです。これはすなわち「2つの数が互いに素であることが素因数分解なしに示せる」ことも意味します。
我々が普通、学校で習う最大公約数の求め方は、2つの数を素因数分解して共通の素因数を探すというものでした。共通のものがなければ最大公約数は
第2は、ユークリッドの互除法が高速に計算できることです。ユークリッドの互除法では、一つのステップの剰余が次のステップの除数になります。次のステップの剰余は除数より小さいので、
となりますが、
実は、ユークリッドの互除法のステップが最も長くなるケースが知られています。それは 割り算の商が常に
で定義される数列で、実際に書いてみると、
です。いま、
となって、10ステップかかります。剰余が減る割合が常に 0.6 倍程度で、なかなか減りません。商が常に 1 なのでこうなります。しかし、なかなか減らないが毎回 0.6 倍程度にはなり、マクロ的には急速に小さくなる。証明は省略しますが、
これは
本題に戻ります。最初の「RSA暗号の例題」のところで公開鍵の作り方を書きました。まず2つの素数、
アルゴリズム |
2.1 において、
2.1a | |
と書き表せるとき、 である。 |
つまり、ユークリッドの互除法は
ものといえます。この置き換えは次々と可能で、置き換えるたびに問題がより "小さく" なっていく。これがユークリッドの互除法の本質です。
そのユークリッドの互除法は "世界最古のアルゴリズム" と言われています。そして、アルゴリズムを記述するのに最適な言語はプログラミング言語です。2.1a の考え方に基づき、ユークリッドの互除法で最大公約数を計算するプログラムを掲げます。
2.1b | アルゴリズム |
ユークリッドの互除法で a と b の最大公約数を求める関数 EUCLID(Javascriptで記述) function EUCLID( a, b ) { if( a % b == 0 ) // ① return b; else return EUCLID( b, a % b ); } |
①の "%" は Javascript の剰余演算子で、"a % b" は "a を b で割った余り" という意味です(a mod b と同じ)。なお、このプログラムは
もちろん、Javascript でなくても、C++ でも Python でも記述できます。このようにプログラムで書くと簡潔になって、ユークリッドの互除法というアルゴリズムの本質がクリアにわかります。
拡張ユークリッドの互除法 |
ユークリッドの互除法の "副産物" として、次の定理が成り立ちます。
2.2 | |
と表せる。 |
この定理の証明ですが、ユークリッドの互除法の計算過程を振り返ると、
でした。ここで
とします。
の形に表せることになります。
と表せることが分かります。このステップを順に続けていって
となることがわかります。
を満たす
なお、2.2 は次のように言い換えることができます。
2.2a | 不定方程式の整数解 |
は整数解をもつ。 |
拡張ユークリッドの互除法のアルゴリズム |
ユークリッドの互除法を拡張して、
を満たす
考え方は 2.1b のユークリッドの互除法と同じで、解くべき問題を「等価でより小さな問題」に置き換えます。そのために
なので、問題は次のように書き換えられます。
ここで、未知数の
これを代入して式を整理すると
となり、"小さな問題" に変換することができました。この考え方でアルゴリズムを記述すると次のとおりです。
2.2b | 拡張ユークリッドの互除法 | ||||||||||||||||||||||||||||
a と b から拡張ユークリッドの互除法で(u, v, 最大公約数)の3つを同時に求める関数 extdEUCLID(Javascriptで記述)
|
以下は、このアルゴリズムの補足説明です。
var:変数の宣言。%:剰余演算子。 | |
a が b で割り切れるなら解が求まる。自然な解を関数値として返す。関数値は3つの変数(u, v, gcd)をひとまとめにしたオブジェクト。 | |
商を求め、小数点以下を切り捨て整数化する。Javascript には実数・整数の区別がないので整数化(組み込み関数の Math.floor)が必要。 | |
小さな問題として計算する。 | |
変数を元に戻して、関数値(u, v, gcd)を返す。 |
この拡張ユークリッドの互除法のアルゴリズムは、2.1b のユークリッドのアルゴリズムとほぼ同じです。ただし、
このことから、拡張ユークリッドの互除法の計算量は、ユークリッドの互除法のほぼ2倍だと推測できます。計算は少々複雑になりますが、たとえ
整数の逆数 |
2.2 から導かれる次の定理は、RSA暗号にとって重要です。
2.3 | 逆数の存在 |
となる |
2.2 において
とすることができます。すなわち、
となり、2.3 が示されました。このとき
となり、
となります。従って、
2.3 の "逆数" を計算するアルゴリズムは、拡張ユークリッドの互除法2.2 のアルゴリズム(2.2b)と基本的に同じです。
2.3a | 逆数の計算アルゴリズム |
m を法とする a の逆数を求める関数 INVERSE(Javascriptで記述) function INVERSE( a, m ) { var b = extdEUCLID( a, m ).u % m; // ① return ( b + m ) % m; // function extdEUCLID( a, b ) { var r = a % b; if( r == 0 ) return { u : 0, v : 1, gcd : b }; else { var q = Math.floor( a / b ); var s = extdEUCLID( b, r ); return { u : s.v, v : (s.u - q * s.v), gcd : s.gcd }; } } // extdEUCLID 終わり // } // INVERSE 終わり |
①で、extdEUCLID のアルゴリズム(2.2b)を使って
となる
この "逆数の存在定理" は RSA暗号において秘密鍵の算出に使われています。冒頭の「RSA暗号の例題」に書いたように、RSA暗号の公開鍵と秘密鍵は、まず秘密の2つの素数
とします。そして
となるように決め、
を満たす数とします。この秘密鍵
普通、整数の "逆数"は(整数の範囲で)定義できません(1以外は)。しかし、"
たとえば
2.3b | 逆数の存在:法が素数 |
を満たす逆数 |
2.3b はほとんど 2.3 と同じです。「異なる
となったとすると、
ですが、
このように逆数が存在するということは、
加減乗除が定義された集合を「体(Field)」と呼びます。有理数、実数、複素数は「体」ですが、「
となり、
なお、
3. フェルマの小定理
フェルマの小定理は RSA暗号の根幹にかかわるものです。フェルマは17世紀フランスの大数学者(1607-1665)で、有名なフェルマの最終定理(大定理)と区別するために「小定理」の名があります。
3.1 | フェルマの小定理 |
が成り立つ。 |
これは少々意外な定理です。我々が学校で習う素数は、自身と
という数列を作ります。そして、それぞれの数を
です。
になります。なぜなら、もし
です。仮定より
となりますが、
となり仮定に反します。つまり
となります。そこで、1.1c(合同式の乗算)を上の
となります。ここで、
となり、証明が完成しました。
(次回に続く)
2021-05-01 11:00
nice!(0)