見出し画像

高校数学をプログラミングで解く(数学A編)「3-8 合同式で表される方程式」

マガジンリスト > 数学A編 3.整数の性質 > 3-8 合同式で表される方程式


はじめに

今回は、数学Aで学ぶ「合同式で表される方程式」について、その方程式を解くプログラムを作成します。

合同式

合同式について、解説しておきます。

合同式
$${m}$$は正の整数、$${a,b}$$を整数とする。
$${a-b}$$が$${m}$$の倍数であるとき、$${a}$$と$${b}$$は$${m}$$を法として合同であるといい、$${a \equiv b  (\mathrm{mod}  m)}$$と表す。$${a \equiv b  (\mathrm{mod}  m)}$$は$${a}$$を$${m}$$で割った余りと、$${b}$$を$${m}$$で割った余りが等しいことを表す。

合同式で表される方程式

以下では、合同式$${ax \equiv b  (\mathrm{mod}  m)}$$ ($${b}$$は$${m}$$より小さい自然数)を満たす$${x}$$を、$${x \equiv c  (\mathrm{mod}  m)}$$ ($${c}$$は$${m}$$より小さい自然数)の形で求めるプログラムを作成します。

アルゴリズム設計(解法)

合同式$${ax \equiv b  (\mathrm{mod}  m)}$$は言い換えると「$${ax}$$を$${m}$$で割った余りが、$${b}$$と等しい」ということになります。このことから、$${x=0, 1, \cdots , m-1}$$について、それぞれ$${ax}$$を$${m}$$で割った余りを計算し、その余りが$${b}$$に等しければ、その$${x}$$の値で合同式$${ax \equiv b  (\mathrm{mod}  m)}$$を満たすことがわかります。その$${x}$$の値を$${c}$$とすれば、$${x \equiv c  (\mathrm{mod}  m)}$$の形で求めることができます。

以下では、合同式

$$
4x \equiv 3  (\mathrm{mod}  5)
$$

について、合同式を満たす$${x}$$を求めるプログラムを考えていきます。
この場合、$${x=0,1,2,3,4}$$について、それぞれ$${4x}$$を$${5}$$で割った余りを計算していくと表1のようになります。その中で、$${4x}$$を$${5}$$で割った余りが$${3}$$に等しくなるのは$${x=2}$$のときであることがわかりますので、$${x}$$について$${x \equiv 2  (\mathrm{mod}  5)}$$と求めることができます。

表1 合同式$${4x \equiv 3  (\mathrm{mod}  5)}$$の余り

$$
\begin{array}{|c|c|c|c|c|c|}
\hline
x  &     0     &     1     & 2 & 3 & 4 \\
\hline
4x  & 0 & 4 & 8 \equiv 3 & 12 \equiv 2 & 16 \equiv 1 \\
\hline
\end{array}
$$

プログラム

上記で解説した解法を利用して、合同式$${ax \equiv b  (\mathrm{mod}  m)}$$を満たす$${x}$$を、$${x \equiv c  (\mathrm{mod}  m)}$$(ただし、$${c}$$は$${m}$$より小さい自然数)の形で求めるプログラムを作成します。

// ax=b(mod m)をx=c(mod m)の形で表す
void setup(){

  int a = 4;
  int b = 3;
  int m = 5;
 
  // x=0,1,…, m-1で
  // a*xをmで割ったときの余りがbになるものを探す。
  for(int x=0; x<m; x++){
    if( (a*x)%m == b ){
      println("x=" + x + "(mod " + m + ")");
    }
  }
}

ソースコード1 合同式で表される方程式を解くプログラム

ソースコード1を、Processingの開発環境ウィンドウを開いて(スケッチ名を「equationofCongruence」としています)、テキストエディタ部分に書いて実行すると、図1のように、コンソールに合同式$${x \equiv c  (\mathrm{mod}  m)}$$の形で解を出力します。

図1 スケッチ「equationofCongruence」の実行結果

練習問題

次の合同式を満たす$${x}$$を$${x \equiv c  (\mathrm{mod}  m)}$$の形で表してみましょう。まず、手計算で解いてみて、そのあとソースコード1の$${a,b,m}$$の値を変更して実行した結果と一致しているか確認してください。

① $${3x \equiv 6  (\mathrm{mod}  9)}$$
② $${3x \equiv 4 (\mathrm{mod}  5)}$$
③ $${8x \equiv 4  (\mathrm{mod}  9)}$$   
④ $${5x \equiv 10  (\mathrm{mod}  15)}$$

まとめ

今回は、数学Aで学ぶ「合同式で表される方程式」について、その方程式を解くプログラムを作成してみました。
合同式で表される方程式$${ax \equiv b  (\mathrm{mod}  m)}$$から、「$${x=0, 1, \cdots , m-1}$$について、それぞれ$${ax}$$を$${m}$$で割った余りを計算し、その余りが$${b}$$に等しければ、その$${x}$$の値で合同式$${ax \equiv b  (\mathrm{mod}  m)}$$を満たす」ということを利用して$${x \equiv c  (\mathrm{mod}  m)}$$の形を求めました。
この方法は、問題に対して$${x=0, 1, \cdots , m-1}$$を一つ一つ当てはめて計算していき、表1のようなものを作成することで、手計算で解くことができます。ただ、$${m}$$の値が大きくなっていくと計算量が増えて、かなり大変になります。一方、このような処理はコンピュータが得意としており、$${x=0, 1, \cdots , m-1}$$を一つ一つ当てはめる計算を素早く行ってくれます。このような体験を通して、プログラミングすることの便利さを理解するとともに、プログラミングの設計力を高めていってください。

参考文献

改訂版 教科書傍用 スタンダード 数学A(数研出版、ISBN9784410209277)

この記事が気に入ったらサポートをしてみませんか?