整数論と合同式:ステップごとの解答つき練習問題

図、ヒント、詳しい解答つきの無料の整数論と合同式練習問題。毎回新しい数値で、3 つのレベル:gcd と余り, 逆元と合同式, 冪剰余と RSA。

無料の練習問題やさしい
012345678910mod 11

0 ≤ r < 11 を満たす余り r、つまり 942 mod 11 を求めてください。

a = 942n = 11

正確な答え:整数で、四捨五入はしません。

次の問題 →
整数論と合同式を無料で練習今すぐ整数論と合同式を練習毎日 5 問まで無料。カード登録は不要です。

練習する内容

  1. やさしいgcd と余り
  2. ふつう逆元と合同式
  3. むずかしい冪剰余と RSA

整数論と合同式の問題の解き方

  1. まずすべての数を n で割った余りに直します。余りは 0 から n − 1 の間です。
  2. 最大公約数は、ユークリッドの互除法で割り算を繰り返して求めます。最後の 0 でない余りが最大公約数です。
  3. 逆元は拡張ユークリッドの互除法で求め、a の係数を取ります。負なら n を足します。
  4. a·x ≡ b は a⁻¹ を掛けて解きます。2 つの合同式は x = r₁ + m₁k とおいて組み合わせます。
  5. べき乗では、指数を 2 進数で書いて平方を繰り返します。RSA では d = e⁻¹ mod φ(n)、φ(n) = (p − 1)(q − 1) です。

よくある間違い

  • 負の数の余りを負で答えてしまう。
  • ユークリッドの互除法を最初の余りで止めてしまう。
  • 逆元を負のまま残し、n を足さない。
  • RSA の指数 d を φ(n) ではなく n で割った余りにしてしまう。
  • フェルマーの小定理で、指数を p − 1 ではなく p で割った余りにしてしまう。

重要な公式

余りのある割り算
a = q·n + r, 0 ≤ r < n
ユークリッド
gcd(a, b) = gcd(b, a mod b)
最小公倍数
lcm(a, b) = a·b/gcd(a, b)
逆行列
a·a⁻¹ ≡ 1 (mod n), gcd(a, n) = 1
一次合同式
a·x ≡ b → x ≡ a⁻¹·b (mod n)
オイラーのトーシェント関数
φ(n) = n·∏(1 − 1/p), φ(pᵏ) = pᵏ − pᵏ⁻¹
フェルマー
aᵖ⁻¹ ≡ 1 (mod p)
RSA
n = pq, φ = (p − 1)(q − 1), d = e⁻¹ mod φ, c = mᵉ mod n, m = cᵈ mod n

整数論と合同式をゼロから学ぶ

1余りと合同式

a を n で割ると、商 q と余り r が得られます:a = q·n + r、0 ≤ r < n。余りは a mod n と書きます。負の数では q も負になります:−3 = −1·7 + 4 なので、−3 mod 7 = 4 です。

2 つの数は、同じ余りをもつとき、つまり n が a − b を割り切るとき、n を法として合同であるといい、a ≡ b (mod n) と書きます。

0123456mod 7−3 ≡ 411 ≡ 4

余りはステップごとに簡約でき、数を小さく保てます:

(a + b) mod n = ((a mod n) + (b mod n)) mod n, a·b も同様

たとえば 47·58 mod 9 では、47 ≡ 2、58 ≡ 4 なので、47·58 ≡ 8 (mod 9) です。

セルフチェック −17 mod 5 はいくつですか?
  1. 2
  2. 3
  3. −2
  4. −3

答え: 3. −17 = −4·5 + 3 なので、余りは 3 です。答えの 2 は 17 mod 5 です。余りは決して負にはなりません。

2ユークリッドの互除法

最大公約数 gcd(a, b) は、両方を割り切る最大の数です。ユークリッドの互除法は gcd(a, b) = gcd(b, a mod b) を使います:

  1. 割ります:a = q·b + r。
  2. (a, b) を (b, r) に置き換えます。
  3. 余りが 0 になるまで繰り返します。最後の 0 でない余りが gcd です。
252 = 2·105 + 42, 105 = 2·42 + 21, 42 = 2·21 + 0 → gcd = 21

最小公倍数はそこから求まります:lcm(a, b) = a·b / gcd(a, b)。

セルフチェック gcd(84, 36) はいくつですか?
  1. 12
  2. 252
  3. 4
  4. 6

答え: 12. 84 = 2·36 + 12、36 = 3·12 + 0 なので、gcd は 12 です。252 は最小公倍数で、84·36/12 です。

3逆元と拡張ユークリッドの互除法

n を法とする a の逆元は、a·x ≡ 1 (mod n) を満たす数 x です。gcd(a, n) = 1 のときに限って存在します。

拡張ユークリッドの互除法は、(n, a) にユークリッドの互除法を適用し、各余りに係数 t を記録して、すべての余り r が r ≡ t·a (mod n) を満たすようにします。n に t = 0、a に t = 1 を割り当てて始め、新しい t は、2 行上の t から、商 q に 1 行上の t を掛けたものを引いて求めます。余り 1 が現れたら、その t が逆元です。

逆元があれば、合同式 a·x ≡ b (mod n) は x ≡ a⁻¹·b で解けます。d = gcd(a, n) が 1 より大きいとき、d が b を割り切るなら解は d 個あり、そうでなければ解はありません。

法が互いに素な 2 つの合同式 x ≡ r₁ (mod m₁) と x ≡ r₂ (mod m₂) には、m₁·m₂ を法としてちょうど 1 つの解があります(中国の剰余定理)。x = r₁ + m₁k とおいて k を求めます。

例題

40 を法とする 7 の逆元を求めてください。

1

(40, 7) にユークリッドの互除法を適用

40 = 5·7 + 5, 7 = 1·5 + 2, 5 = 2·2 + 1
2

係数 t を記録する

t(40) = 0、t(7) = 1。

t(5) = 0 − 5·1 = −5, t(2) = 1 − 1·(−5) = 6, t(1) = −5 − 2·6 = −17
3

正の数にする

1 ≡ −17·7 (mod 40) で、−17 + 40 = 23。

4

確認

7·23 = 161 = 4·40 + 1
答え

逆元は 7⁻¹ ≡ 23 (mod 40) です。

4冪剰余と RSA

反復二乗法を使うと aᵏ mod n を速く計算できます:k を 2 進数で書き、a, a², a⁴, a⁸, … mod n を二乗と簡約で求め、ビットが 1 のものの冪を掛けます。

フェルマーの小定理:素数 p が a を割り切らないとき、aᵖ⁻¹ ≡ 1 (mod p) です。したがって指数は p − 1 を法として簡約できます。

RSA は、2 つの素数 p と q から鍵をつくります:

  1. n = p·q、φ(n) = (p − 1)(q − 1)。
  2. gcd(e, φ(n)) = 1 となる e を選びます。(n, e) が公開鍵です。
  3. d = e⁻¹ mod φ(n) を計算します:これが秘密鍵です。
  4. 暗号化は c = mᵉ mod n、復号は m = cᵈ mod n です。

オイラーの φ(n) は、1 から n までの数のうち n と互いに素なものの個数です:素数なら φ(p) = p − 1、φ(pᵏ) = pᵏ − pᵏ⁻¹ で、互いに素な因数については φ は乗法的です。

セルフチェック ある RSA 鍵で p = 5、q = 11、e = 3 です。d はいくつですか?
  1. 13
  2. 27
  3. 37
  4. 3

答え: 27. φ(n) = 4·10 = 40 で、3·27 = 81 = 2·40 + 1 なので、d = 27 です。n = 55 を法とする 3 の逆元なら 37 ですが、d は φ(n) を法として求めます。

5よくある間違い

  • 負の数の余りを負で答えてしまう:−17 mod 5 は −2 ではなく 3 です。
  • ユークリッドの互除法を、最後の 0 でない余りではなく最初の余りで止めてしまう。
  • 拡張ユークリッドの互除法で出た負の係数に、n を足し忘れる。
  • RSA の指数 d を、φ(n) ではなく n を法として計算してしまう。
  • フェルマーの小定理で、指数を p − 1 ではなく p を法として簡約してしまう。

6試験問題の例

  • やさしい:gcd と余り。ユークリッドの互除法で gcd や lcm を求める、負の数の余りを求める、和と積を n を法として簡約する、といった問題です。
  • ふつう:逆元と合同式。拡張ユークリッドの互除法で 剰余の逆元を求める、一次合同式を解く、中国の剰余定理で 2 つの合同式を組み合わせる、オイラーの φ(n) を計算する、といった問題です。
  • むずかしい:冪剰余と RSA。反復二乗法とフェルマーの小定理を使う、解が複数ある合同式を解く、RSA の秘密指数・暗号文・復号したメッセージを求める、といった問題です。

アプリでステップごとに学ぶアプリでステップごとに学ぶ

解答例

例題 1やさしい

大きな数をそのまま掛け算せずに (914·953) mod 11 を求めましょう:まず簡約します。

n = 11

求めるもの: (914·953) mod 11

ヒントを表示
  1. (x·y) mod n = ((x mod n)·(y mod n)) mod n で、和についても同じことが成り立ちます。
  2. 914 mod 11 = 1, 953 mod 11 = 7.
  3. 余りの積を 11 を法として簡約しましょう。
答えとステップごとの解答を表示

約数と余り:a mod n は、0 ≤ r < n かつ a = q·n + r を満たす余り r で、a が負のときも同じです。ユークリッドの互除法は、a = q·b + r を繰り返して (a, b) を (b, r) に置き換え、gcd(a, b) を求めます。最後の 0 でない余りが gcd です。すると lcm(a, b) = a·b/gcd(a, b) です。余りは各ステップで簡約できます:(a + b) mod n と (a·b) mod n は、a mod n と b mod n だけで決まります。

各数を簡約する

914 ≡ 1, 953 ≡ 7 (mod 11)

組み合わせる

1·7 = 7 ≡ 7 (mod 11)

答え

(914·953) mod 11 = 7
例題 2ふつう

オイラーのトーシェント関数 φ(637)、つまり 1 から 637 までの整数のうち 637 と互いに素なものの個数を求めてください。

n = 637 = 72·13

求めるもの: φ(637)

ヒントを表示
  1. n を素因数分解しましょう:637 = 72·13。
  2. φ は互いに素な因数について乗法的で、φ(pᵏ) = pᵏ − pᵏ⁻¹ です。
  3. φ(n) = n·∏(1 − 1/p).
答えとステップごとの解答を表示

逆元と合同式:a が n を法として逆元をもつのは、gcd(a, n) = 1 のときに限ります。拡張ユークリッドの互除法で 1 = s·n + t·a と書くと、a⁻¹ ≡ t (mod n) です。gcd(a, n) = 1 のとき、合同式 a·x ≡ b (mod n) の解は x ≡ a⁻¹·b です。法が互いに素な 2 つの合同式 x ≡ r₁ (mod m₁) と x ≡ r₂ (mod m₂) には、m₁·m₂ を法として 1 つの解があります(中国の剰余定理)。オイラーの φ(n) は、1 から n までの数のうち n と互いに素なものの個数です:φ(n) = n·∏(1 − 1/p)。

素因数

637 = 72·13

トーシェント関数

φ(637) = φ(49)·φ(13) = 42·12 = 504

答え

φ(637) = 504
例題 3むずかしい
mc = me​ mod n225m = cd​ mod n?(n, e) = (481, 23)d

ある RSA 鍵は p = 13、q = 37、e = 23 を使います。暗号文 c = 225 を復号して、メッセージ m を求めてください。

p = 13q = 37e = 23c = 225

求めるもの: m

ヒントを表示
  1. n = 481、φ(n) = 432。
  2. d = e⁻¹ mod φ(n) = 263。
  3. m = cd mod n = 225263 mod 481: 反復二乗法を使う.
答えとステップごとの解答を表示

冪剰余と RSA:aᵏ mod n は反復二乗法で計算します:k を 2 進数で書き、二乗し、毎回簡約し、ビットが 1 の冪を掛けます。フェルマー:素数 p が a を割り切らないとき aᵖ⁻¹ ≡ 1 (mod p) なので、指数は p − 1 を法として簡約できます。RSA:素数 p と q を選び、n = p·q、φ(n) = (p − 1)(q − 1) とします。公開指数 e は φ(n) と互いに素で、秘密指数は d = e⁻¹ mod φ(n) です。暗号化は c = mᵉ mod n、復号は m = cᵈ mod n で行います。

秘密指数

n = 481, φ(n) = 432
d = 23−1 mod 432 = 263

反復二乗法で復号する

263 = 256 + 4 + 2 + 1
2251 ≡ 225 (mod 481)
2252 ≡ 120 (mod 481)
2254 ≡ 451 (mod 481)
2258 ≡ 419 (mod 481)
22516 ≡ 477 (mod 481)
22532 ≡ 16 (mod 481)
22564 ≡ 256 (mod 481)
225128 ≡ 120 (mod 481)
225256 ≡ 451 (mod 481)
225263 ≡ 225·120·451·451 ≡ 361 (mod 481)

メッセージ

m = 361
確認: 36123 mod 481 = 225

答え

m = 361

質問と回答

整数論と合同式とは?

a を n で割ると、商 q と余り r が得られます:a = q·n + r、0 ≤ r < n。余りは a mod n と書きます。負の数では q も負になります:−3 = −1·7 + 4 なので、−3 mod 7 = 4 です。

2 つの数は、同じ余りをもつとき、つまり n が a − b を割り切るとき、n を法として合同であるといい、a ≡ b (mod n) と書きます。

整数論と合同式の問題の解き方は?(手順)
  1. まずすべての数を n で割った余りに直します。余りは 0 から n − 1 の間です。
  2. 最大公約数は、ユークリッドの互除法で割り算を繰り返して求めます。最後の 0 でない余りが最大公約数です。
  3. 逆元は拡張ユークリッドの互除法で求め、a の係数を取ります。負なら n を足します。
  4. a·x ≡ b は a⁻¹ を掛けて解きます。2 つの合同式は x = r₁ + m₁k とおいて組み合わせます。
  5. べき乗では、指数を 2 進数で書いて平方を繰り返します。RSA では d = e⁻¹ mod φ(n)、φ(n) = (p − 1)(q − 1) です。
整数論と合同式でよくある間違いは?
  • 負の数の余りを負で答えてしまう。
  • ユークリッドの互除法を最初の余りで止めてしまう。
  • 逆元を負のまま残し、n を足さない。
  • RSA の指数 d を φ(n) ではなく n で割った余りにしてしまう。
  • フェルマーの小定理で、指数を p − 1 ではなく p で割った余りにしてしまう。
整数論と合同式の練習では何を学ぶ?
  • やさしい: gcd と余り
  • ふつう: 逆元と合同式
  • むずかしい: 冪剰余と RSA

問題ごとに数値が変わるので、答えではなく解き方が身につきます。 行き詰まったら、まず小さなヒントを開き、必要なときだけ詳しい解説を見ましょう。

練習のしかた

  • 問題ごとに数値が変わるので、答えではなく解き方が身につきます。
  • 行き詰まったら、まず小さなヒントを開き、必要なときだけ詳しい解説を見ましょう。
  • 進捗、間違えた問題、保存した問題は記録されるので、試験前に復習できます。

このトピックを含む科目

数学・統計学のほかのトピック

印刷用ワークシート

整数論と合同式を無料で練習今すぐ整数論と合同式を練習毎日 5 問まで無料。カード登録は不要です。