こんにちは!
今回は、大きな数字の累乗を計算する方法です!

えっ!?暗号の解説じゃないのかって?

その通り、この解説は暗号化の解説なのですが、暗号化を解説するために「大きな数字の累乗」の計算が必要となったのです。

最終目的地は「公開鍵暗号」の解説ですので、忘れないでくださいね。




\(n\)で割り算した「余り」を計算するとき、次の関係を使うと掛け算の計算が楽になるよ。
  • 「\(A \times B\)を\(n\)で割った余り」\(=\)「\(A\)を\(n\)で割った余り」\(\times\)「\(B\)を\(n\)で割った余り」を\(n\)で割った余り
  • 「\(x^{100}\)を\(n\)で割った余り」\(=\)「\(x^{10}\)を\(n\)で割った余り」を\(10\)乗したものを\(n\)で割った余り
これらの関係を使うと、計算の回数は増えるけど、大きな数が出てこないので、1回の計算は簡単になる!

大きな数の累乗の余りを計算する方法・・の巻!

「大きな数の累乗」の計算方法の前に、「\(x \pmod n\)」について真剣に考えてみましょう

「\(x \pmod n\)」は「\(x\)を\(n\)で割り算した余り」という意味です。

もし、\(x\)を\(n\)で割ったときの「商」を\(K\)とし、「余り」を\(A\)とすれば、「\(x = Kn + A\)」となりますね。
(例えば、13を5で割ると、商は「2」、余りは「3」になります。だから、「\(13 = 5 \times 2 +3\)」と書くことができます)


さて、ここで突然ですが、\(x\)と\(y\)という2つの数字があったとしましょう。


それぞれ、\(n\)で割ったときの商は「\(K_x\)」と「\(K_y\)」と置きます。
さらに、\(n\)で割ったときの余りは「\(A_x\)」と「\(A_y\)」と置きます。

このとき、\(x \times y\)を\(n\)で割ったときの余りはどうなるでしょうか?

先ほどみたように、「\(x=K_xn+A_x\)」と書けますし、「\(y=K_yn+A_y\)」と書けます。
なので、\(x \times y=(K_xn+A_x)(K_yn+A_y)=K_xK_yn^2+K_xnA_y+K_ynA_x+A_xA_y\)となります。


つまり、\(x \times y\)を\(n\)で割るとどうなるかというと、\(K_xK_yn^2\)も、\(K_xnA_y\)も、\(K_ynA_x\)も、全部\(n\)で割り切れるので、余りが出ません。
唯一、余りがでるのは\(A_xA_y\)の部分です。

つまり、\(x \times y\)を\(n\)で割ったとの余りは、\(x\)を\(n\)で割ったとの余り(\(A_x\))と\(y\)を\(n\)で割ったとの余り(\(A_y\))を掛け算したものを\(n\)で割ったときの余りと同じになります。


このことを数式で書くと「\(x \times y = A_x \times A_y \pmod n\)」となりますね。

で・・・。このことが何の役にたつの?



大きな数の累乗に、「\(x \times y = A_x \times A_y \pmod n\)」を使う

もし、\(x\)や\(y\)がとっても大きな数字だと、その掛け算をするのも大変です。

でも、どうせ掛け算した結果を\(n\)で割り算した余りを求めるのであれば、はじめから\(x\)を\(n\)で割り算した結果と、\(y\)を\(n\)で割り算した結果を掛け算して、その結果をもう一度\(n\)で割り算すればいいですよね。

\(x\)や\(y\)が大きくても、それを\(n\)で割った数は必ず\(n\)以下になるので、小さい数字になって計算が楽になるはずです。


この応用編ですが、例えば「\(x^{100} \pmod n\)」を計算しなければいけないのであれば、「\(x^{100}=(x^{10})^{10}\)」という事実を使います。
(「\(x^{100}\)」というのは、\(x\)を100回掛け算したものでした。「\((x^{10})^{10}\)」は、\(x\)を10回掛け算したもの(\(x \times x \times x \times x \times x \times x \times x \times x \times x \times x\))を、さらに10回掛け算しなさいということなので、結局「\(x\)を100回掛け算する」ということと同じなんです。)


「\(x^{100}=(x^{10})^{10} = x^{10} \times x^{10} \times x^{10} \times x^{10} \times x^{10} \times x^{10} \times x^{10} \times x^{10} \times x^{10} \times x^{10}\)」なので、「\(x^{100} \pmod n\)」は「\(x^{10} \pmod n\)」を計算した後に、それを10回掛け算して、もう一度\(n\)で割り算した余りを求めればいいんです。


「\(x^{10}\)」ならば「\(x^{100}\)」の計算よりも簡単です。(「\(x^{10}\)」の計算すら難しければ、もっと小さくして「\(x^{5}\)」とかにすればいいだけです)

こうやって、累乗を分割することで、大きな数の累乗の計算もできるようになります。
もうこれで、大きな数も怖くないですね。





次回のお知らせ

今回は「大きな数を累乗」する方法を解説しましたが、もともとやりたかったことは、「\(7846^{13709}\)」の計算です。
次回は、今回解説した方法を活用して「\(7846^{13709}\)」の計算をしましょう!

果たして、元のメッセージ「16」が出てくるでしょうか?