2020.03.22記
最近プログラムの講義をもっていないが、いつかやるときのためのネタとして覚え書き。中学入試の算数の問題はアルゴリズム的な問題が結構多いのだ。
それにしても、プログラムをさせておいて、その数学的背景を語る講義をやる機会って来るのかなぁ。
という訳で数学的背景は倍数判定法。
中学入試なので、問題文において整数といえば非負整数を指すことに注意しておく。
の1の位を消してできる新たな非負整数から、消した 1 の位の倍を引くという操作
y = ( x / 10 ) - k * ( x % 10 )
を繰り返して0になるかどうかを考える。0にならない場合は負になってしまうので、これを終了条件とすれば良い。
プログラムを作らせた後に、どんな入力なら0になるかを確認させるために、x を 0 から 1000 ぐらいまで for 文で回してやった後に解説。
すると、「10k+1の倍数のときに0となる」ことが予想できる。
のとき、 とすると、
が成立するので、倍数判定したい に対して なる を選ぶことができれば(10とが互いに素であれば選ぶことができる)、
ならば、が成立する。
そして、ならば、 であるから、
となり、この操作をくりかえすことによって、単調減少列が得られる(その列が負または0となったら終了する、または中学入試なので負になる1つ手前で終了する)。
例えば、の倍数かどうかを判定したいとき、であるから、
の1の位を消してできる新たな非負整数から、消した 1 の位の倍を引くという操作
y = ( x / 10 ) - 2 * ( x % 10 )
を繰り返しても 7 の倍数であるということは変わらない。但し、7で割り切れない場合はその余りは変化する。
このアリゴリズムで の次は、 となるので、7の倍数であることは保存されているが、最終的な結果は0にならないことに注意しておく。負または0になったときに、その絶対値が7の倍数であれば7の倍数であることは保証されている。
話を元に戻そう。
ここで、とおくと、操作によっての倍数ことは保存される上に次のことが言える。
(a) により
だから、がの倍数ならば、が負になることはない。
(b) だから、ならば操作を行なうことができ、 となる。
よって、(a),(b)により、この操作は 0 で終了する。
という訳で、で割り切れることとの仲間であることが同値であることがわかる。
算数の問題を解くにはむしろ数学的背景を使わずに単純計算をすれば良いが、一応数学的考察を用いた解説をしておく。
(1) 4567654 が 91 の倍数であることの確認
となる。ちなみに である。
(2) が の倍数となる の値を求める問題。
が の倍数で、(1)によりだから
つまり、[オ]=9
(3) 51の倍数で1の位に着目すると、255 または 765 となり、[カ]=2、[キ]=7
(4) 51の倍数は、3の倍数かつ17の倍数であり、34が17の倍数であることに着目すると
は51の倍数
よって、も51の倍数。51と10は互いに素であるから、も51の倍数となり、
つまり、[ク]=3
(5) 間にあるに着目して、なる51の倍数を探すと
となることから、とすれば良い。
は51の倍数なのでは17の倍数。
が3の倍数かつ17の倍数となる条件を考える。
3の倍数である条件からが3の倍数
が17の倍数であるから、
が17の倍数、よって
以上から、に限る。