【素数p,q】5^p+1がqで割り切れ、5^q+1はpで割り切れる
整数問題bot②で見かけた良問
昨日(今日)の深夜に整数問題bot②で、ある問題がふと目についた。次のツイートである。
素数の組(p,q)であって, 5^p+1がqで割り切れ, かつ5^q+1がpで割り切れるようなものを全て求めよ.
— 整数問題bot② (@handmade_math) 2018年7月17日
(出典はヒ・ミ・ツ(^_-)❤)
「出典はヒ・ミ・ツ♡」とか書いてあるのがお茶目で、すごく気になったのだ。
この問題、最初はどこから手を付けるかやや悩んだ。(深夜で頭の回転が鈍っていたのかもしれないが……)
この問題を解き終わったとき、少し前に勉強した群論の知識がうまく使えて、本で勉強した知識を再確認でき、理解が一歩研ぎ澄まされた感じがした。つまり、群論を少し勉強した人にとって、この問題は良問だと思うので紹介してみたい。
ここでの解説は、群論の知識が無い高校生でも読めるように書いてみるので、整数問題が好きな高校生でも楽しめると思う。
まずは観察と実験から
まとまった解答は後で書くことにして、まずは問題を見て最初にやってみたことから紹介していこうと思う。このブログでは単に解答を紹介するだけじゃなくて、問題を解くときのライブ感も伝えてみたいからだ。この問題、初見ではどこから手をつけたらいいかすぐにはわからないだろう。そこで、具体的な小さな数で試してみる。解ける兆しが見えていないときでも、自分の手で一歩一歩問題に取り組むのが大切で、もし解けなくても「今の自分がどこまで行けるのか」を知ることが次の挑戦・成長にきっと繋がるからだ。
として一般性を失わないので、の場合をまずは試してみよう。
問題の式は、
……(1)
……(2)
と書ける。
まず、のとき、より、
よって、が解の一つであることがわかる。
次に、のとき、より、
よって、も解である。
のときは、より、
となるので題意を満たさない。
ここまでやってみて、見つかった解に規則性らしきものがなさそうに感じられるので、ひょっとしたら、の解は存在しないんじゃないかという気がしてくる。
実際、以外に解が無いことは後になってわかるが、前に進むために(1)、(2)式を少し変形してみる。
……(1')
……(2')
この式をしばらく見つめてみる。すると、右辺がだから取扱いにくいのかなと思えてくる。そこで、(1')、(2')式の両辺を二乗して右辺をにしてみることにした。
……(3)
……(4)
ここで、上の式がフェルマーの小定理(フェルマーの小定理 - Wikipedia)に似ていることに気づく。フェルマーの小定理を書き出してみると、のとき、
……(5)
……(6)
が成り立つ。
ここで、をから順にべき乗していったときに、はじめてになるのはいつだろうかと考えてみることにした。*2このようなアイデアに自然に行き着いたのは、群論を勉強していたおかげだと思う。ともかく、
……(7)
……(8)
を満たす最小の正の整数を考える。*3 このとき、(3)(4)(5)(6)式の指数は、それぞれ対応するの倍数であることがわかる。*4*5
もし、(7),(8)を満たすが具体的に求まれば、乗や乗といった考えにくい式は扱わなくてすむだろう。そんなわけで、この問題を解く方針が定まった。それでは、解答に移ろう。
解答
として一般性を失わない。題意より、
……(1)
……(2)
であるが、これを変形して、
……(3)
……(4)
を得る。の場合、(3)(4)式は明らかに成立しないので、以下として考える。すると、フェルマーの小定理より、
……(5)
……(6)
が成り立つ。次に、
……(7)
……(8)
を満たす最小の正の整数をとおくと、(4)(6)(7)式より、とは共にの倍数である。したがって、ある正の整数により、
……(9)
……(10)
この2つの式より、(9)式の両辺を倍して、
……(11)
ここで、は素数なので、またはを割り切る。ところが、仮定よりなので、はを割り切らず、がの倍数であることが言える。よって、ある正の整数が存在して、
……(12)
が得られる。これを(9)式に代入すると、
……(13)
となり、が正の整数であることから、
……(14)
であることがわかった。
①の場合、
(7)式より、
……(15)
これを満たす素数はのみである。
②の場合、
(7)式より、
……(16)
……(17)
ここで、(16)式を満たす素数は、と調べていくことで、のみであることがわかる。は(15)式を満たすので、(17)式を満たさない。よって、の場合、となる。
以上より、題意を満たす素数は、しか存在しないことが分かった。よって、求める解は、の条件を取り除くと、
だけであることがわかる。
最後に本の紹介
今回の問題が解けたのは、群論を雪江先生の本で勉強していたことが大きかったと思う。そこで、群論に興味がある人のために、以下の本をおススメしておく。
自分で読んだときは、数か所証明が分からないところもあったが、主要な部分は独学でも一通り理解できたので親切な良書だといえるだろう。ページ数も150ページ程度なので、頑張れば1~2週間くらいで読めるだろう。定理に対して例も豊富だが、ところどころ証明の要点があっさり書かれすぎている印象をいくらか受けた。数学科の優等生はこれで問題ないのだろうが、ここでつまづく人や独学の人は志賀先生の「群論への30講」を先に読んでみるのもいいと思う。ちなみに、こちらは少し頑張れば5~7日くらいで読めると思う。
(a+b^3)/(ab)が整数となる整数a,bを全て求める
2015年ヨーロッパ数学オリンピック日本代表一次選抜試験より
久々に更新してみる。
twitterをのぞいてみたら、整数問題botの問題が目に入った。試しに解いてみたところ、読後感ならぬ解後感(?)が結構よかったので紹介してみたい。
下の問題である。
[171](a+b³)/(ab)が整数となるような正の整数の組(a,b)をすべて求めよ(2015年ヨーロッパ女子数学オリンピック日本代表一次選抜試験1、3分問題)
— 整数問題bot (@seisu_bot) 2018年7月16日
3分問題ということで、カップラーメンが出来上がるのを待っている間に解けるらしい。お手軽そうなのでやってみた。時間は測らなかったが、だいたい5分くらいで解けたような気がする。ちょっとした頭のストレッチになるので、挑戦したい人は以下の解答を見る前に自分でやってみてほしい。
解答
がで割り切れることから、はある正の整数を用いて、
と書ける。*1これを問題の式に代入すると、
となる。ここで気づくのが、元の問題の分子に表れていたの指数がに下がっていることだ。さらに、問題の式の形はこの指数の部分を除いて、変わっていない。 そんなわけだから、この置き換えを繰り返し行えば、指数をどんどん減らしていけそうだ。
と置き換えると、*2
と置き換えると、*3
……(☆)
となり、分子のは指数がになってしまい、ついに消えてしまった。
問題の式が整数となるためには、分子の値は分母の値より、大きくないといけない。よって、
……(♪)
なので、この式が成り立つためには、またはでなければならない。
①のとき、
不等式(♪)より、なので、
との値がと求まる。このとき、
となり、確かに整数になる。
②のとき、
問題の式の値を、正の整数とおくと、(☆)式より、
この式を変形して、
この式を満たす正の整数の組は明らかに、のみである。
よって、
となり、である。このとき、問題の式の値はとなる。
以上をまとめて、求める正の整数の組は、
の2つだけである■
【IMO2017】国際数学オリンピックの問題2【解答・解説】
2017年国際数学オリンピック(IMO2017)の問題2
前回に引き続き、問題2に挑戦してみた。問題は、次の通り。(http://www.imojp.org/challenge/から引用。)
を実数全体からなる集合とする。関数であって、任意の実数に対して
が成り立つものをすべて求めよ。
今回はこの問題に半日くらい粘ってみたが、想像以上に手ごわく、残念ながら完答できなかった。完答できていないのに、なんでこの記事を書いてるんだとツッコミをもらいそうだが、これにはちょっとした事情がある。
日本語の解答・解説を求めて
なかなか解答の糸口をつかめず、「吸収モード」*1に入っていた私は、ヒントや解説をネットで探していた。ところが、解説が英語のものしか見当たらないのである。英語が得意じゃない私は、解答を理解するまでに必要以上の時間を使ってしまった。そこで今回は、解答・解説を日本語に書き直してまとめておくことにした。これで、英語が苦手なみんなも、気軽に数学オリンピックの問題を楽しめるようになるはずだ。*2
今回の解答・解説は、Youtubeに挙げられている次の2つの動画を参考にした。
これらの動画の解説を、私が理解できた範囲で組み合わせ、まとめ直して翻訳してみた。基本的な解答は1つ目の動画、解答の仕上げの部分は2つ目の動画の方法を使わせていただきました。*3もし私の英語力不足で間違い等があったら、やさしく指摘していただけると助かります。それでは、本題へ。
基本的な観察
まずは、「が定数関数であるような解」が存在するか考えてみよう。すべてのに対し、とおくと、問題の関数等式より、
となる。したがって、は問題の1つの解である。以降、これ以外の解を探すために、は恒等的にでないとする。
次に、を代入してみる。*4
……①
つまり、というの零点が存在する。*5
ここで、であると仮定すると、面白いことが起きる。問題の関数等式にを代入すると、
とが恒等的にになってしまうのだ。したがって、恒等的にでない解を探すため、以後とする。
零点の値を求めて
次に零点の値を調べる。つまり、となる実数の値を求める。関数等式から、
を得るが、はになってはいけないので、全てのについて
でなければいけない。そして、条件を満たすは実はに限る。理由は簡単で、もしならが上の式の等号を成立させてしまうからだ。
結局、
……②
であることがわかった。*6ここで、が零点であったことを思いだして(①式)、
を得る。
ところで、関数が問題の関数等式を満たすなら、も関数等式を満たす。実際、このことは
と確かめられる。そのため、となる解から、となる解を構成することができる。そこで、以降は、
……③
として話を進める。
の単射性
が単射であることを証明する。ここがこの問題の山場であり、本質をつかなければいけない部分に思える。ここで、紹介する証明は、AoPS forumとかいうところ(?)でdnkywinさんが発表した方法らしい。
ともかく、(③式)としたので、関数等式から
(①、②式より、なので)
……④
という漸化式のような等式を得る。
が単射であるというのは、ならばであることを指す。
そこで、とおく。ここで、④式から、の両辺にを繰り返し足す(または引く)ことで、であるようにできるので、以下記号を適当に置き直してとする。
ここで、(トリッキーだが)2次方程式
を考える!すると、より、判別式が正となるので、この2次方程式は2つの実数解を持つ。*7また、解と係数の関係から、
……⑤
である。これで下準備は終わった。満を持して、問題の関数等式でを代入する!
(⑤式より)
(④式を使った。)
(単射性を証明するときの仮定、より。)
再び、④式を使って、
ここで、②式より、
を得る。すなわち、
の少なくとも一方が
の少なくとも一方が (②式より)
が言える。ここで、解と係数の関係の式⑤に立ち返ると、
等から、を得る*8。よって、が言えたので、は単射であることが証明された。
最後の仕上げ
最後の仕上げは、冒頭で挙げた2つ目の動画から紹介させていただきます。*9
問題の関数等式で、とおくと、
(③式より)
(④式より)
ここで、関数の単射性より、
……⑥
を得る。
同様に、問題の関数等式でとおくと、
(①、②式より、なので)
再び、関数の単射性より、
(④式より)
ここで、⑥式を用いると、
を得る。よって、③式の上の方で書いたように、が解ならも解である。よって、問題の関数等式を満たす解は、
の3つである。
*1:問題を完全に見なかったことにして諦めるのではなく、さっさと解答を見て、そこから何かを吸収して成長するモードである。
*2:といっても、日本語に直してもなお、今回の問題は手ごわい。
*3:2つ目の動画は、の単射性の証明に飛躍があるように思えたので注意しておきます。
*4:この手の素朴な実験は、問題に取り掛かり始めるときの常套手段だ。
*5:同様に、を代入すると、も零点であることがわかる。ところが、こちらの零点は、今回の解答では出番がない。
*6:零点が存在することは、①式で証明されているので、逆にであることも当然言える。
*7:ここで、実数であることが重要だ。すぐ後で、関数の変数としてをとるからだ!
*8:としたが、としても同様にが示せる。
*9:ここでは、元の動画と異なり、ととってあるので注意してください。
【IMO2017】2017年国際数学オリンピックの問題1【解答・解説】
2017年国際数学オリンピック(IMO2017)の問題1
なんとなく数学オリンピックの今年の問題を解いてみたくなったので挑戦してみた。問題は、数学オリンピック財団のサイト(http://www.imojp.org/challenge/)を参照しました。今回は、問題1の解答と解説をしていく。もし間違えていたら、優しく指摘してれると助かります。それと、もっと良い解法を教えてくれたら喜びます。
では、問題を見てみましょう。
問題1. をみたすような各整数に対して、数列を以下のように定める:
このとき、あるが存在してをみたすが無数にあるようなをすべて求めよ。
まずは観察と場合わけから
問題の数列の作り方は、平方数になったときだけルートをとり、それ以外は3を足していくことで作られている。慣れるために、いくつかの例でためしてみよう。
のとき、
のとき、
のとき、
のとき、
のとき、
という具合になる。3ずつ増えていくという特徴を活かすために、まずはをを法として分類してみる。
あるでとなる場合
まずは、平方数を調べる。
より、となる平方数は存在しないことがわかる。そのため、一旦あるでとなると、それ以降この数列に平方数は現れない。したがって、より後はすべて単調増加となるので、明らかに題意を満たさない。この観察結果から、がを法としたときに、どのグループに属するかを考えていけばよさそうだと指針がたてられる。
の場合
次は、の場合を考える。この場合は、任意のに対してであることが示せる。
実際、が3の倍数なら、も3の倍数である。
また、が平方数の場合は、を自然数としてとおくと、素因数分解の一意性からある自然数を用いてと表せる。したがって、この場合もとなる。
の場合は、の場合とは異なり、数列には明らかな上限が存在する。*1
正の整数列に上限と下限が存在するので、鳩ノ巣原理より少なくとも1つの自然数が存在して、となるが無数に存在する。
以上より、が3の倍数の場合は題意を満たす。
の場合
最後に、の場合を考える。数列を順番に作っていき、あるでとなれば、上に書いた証明から題意を満たさない。
そこで、すべてのについて、となるが存在すると仮定する。(以下でこの仮定から矛盾を導き、背理法により、いつか必ずあるでとなることを証明する。)
今回は、平方数の最小性に着目した証明方法をとることにした。
まずの内、最小の平方数をとおく。より小さな平方数は存在しないので、数列の定義から、の次の数列であるがの最小値となる。ここで、の最小性から、との間に、であるような数は存在しないはずである。ところが、次に示すように、そのような数を構成することができてしまうのだ。
仮定より、はある自然数を用いてと表せる。*2ここで、以下に定義する平方数を考える。
この平方数は、明らかにより小さい。また、
より、であるから、平方数は
を満たすが、このことは、が最小の平方数であることに反する。
よって、背理法により、の場合、あるでとなるので、題意を満たさない。
解答
以上をまとめて、題意を満たすは『3の倍数』である。
【極限!?】2次方程式の解の公式と1次方程式の解
今日もどこかで『にーえーぶんの……』
今日も誰かがどこかで、
『にーえーぶんのまいなすびー、ぷらすまいなするーとびーじじょうまいなすよんえーしー』
と呪文のように口ずさむ。聞き覚えのある数学フレーズ、そんな2次方程式の解の公式にまつわる話を今回はしてみよう。
何はともあれ、2次方程式は、
という方程式のことで、の場合のものを指す。
このというのがさり気ない条件に聞こえるが、とっても大切だ。
冒頭で唱えた解の公式
も、うっかりとしてみると、『で割る』というタブーを冒してしまう。
ここで、1つの疑問が浮かんだ人もいるだろう。そう、
『の極限をとったとき、解の公式はどうなる?』
という疑問だ。
ヤフー知恵袋にて
この「解の公式の極限問題」は、やはりというかネットで質問している人がいた。
それが、ヤフー知恵袋における次の質問だ。
問題こそ解決ずみになっているが、そのベストアンサーが、私にはなんともスッキリしないものに感じられた。そこで、今回の記事では、この疑問に真正面から立ち向かう。
といっても、ちょっとした計算をするだけれど……
1次方程式へ向かって
の極限をとると、もともとの2次方程式は、
となる。ここで、場合を考えることにすると、これは1次方程式になる。
もちろんその解は、
だ。したがって、2次方程式の解の公式
での極限をとると、その内1つはになると期待できる。
ここで、本当に答えるべき質問は、
①2次方程式の解の公式の極限をどうやってとるか?
②2つあった解の内、もう1つはどうなるか?
の2つだろう。しかし、極限をとるにしても、解の公式の分母にが残ったままではやりづらそうだ。そこで、ちょっと意外なテクニックが使えることに気づいたので紹介したいと思う。それは、いわば、
『分子の有理化』
とでも言えるテクニックである。
「分子の有理化」と「解の公式の極限」
普通学校では、「分母を有理化せよ」と問題に出される。今回は、あえてその逆である「分子」を有理化していく。何が起こるかは、下の計算を少し追ってみてほしい。(以下、複号同順。)一行ずつ丁寧にやっていく。
ここで、なんと、分母と分子の両方が表れているので「約分」できてしまうのだ。「約分」すると、
となる。「分母にルートタイプ」の解の公式である。覚えるには、
『にーしーわる、まいなすびー、まいなすぷらするーとびーじじょうよんえーしー』
と唱えればいい。
とにかく、こうなってしまえば、後はの極限をとるだけだ。
の絶対値を外すと、かのいずれかなので、結局、解の公式に現れる2つの解の極限は、
つまり、
となる。*1
以上のようにして、2次方程式の「解の公式の極限問題」は、「分子の有理化」というちょっと予想外のテクニックによって解決したのであった。
え……?
『3次方程式の解の公式の極限がどうなるか』って?
気が向いたらやるかもしれませんし、面倒そうなのでやらないかもしれません。
それでは、また次の更新でお会いしましょう。
【割り算ネタ】2から11までの数で割れ切れるか、簡単に判定する方法
はじめに
『私は計算が苦手だ』
そんなあなたに、今回は割り算のちょっとした裏技を紹介しようと思う。
もちろん、計算が得意な人も、知ってるとさらに得すると思う。
今回紹介するのは、ある自然数がの数で割り切れるか楽に判定する方法だ。「楽に」というのは、なるべく計算する量を減らすという意味だ。例えば、やで割れるか調べたい場合には、とある足し算を繰り返すだけでいいし、の場合は、ある桁数より上の桁の数は無視して調べられるといった具合だ。
たいていの人は小学校で、で割り切れるか判定する方法を聞いたことがあるだろう。で割り切れるか調べる方法が一番知られているとして、知名度順に割る数を並べると、おそらく、
という順番になると思う。特に、で割り切れるかの判定方法は、本で見たことなかったので、今回の記事のために作ってみた。便利さはともかくとして、そこそこレアな方法だと思う。
今回の記事では、割る数がからのすべての場合の判定方法を紹介するので、なんとなく素因数分解したくなったときには、ぜひ試してほしい。
そして、この記事を読み終えるころには、整数問題のちょっとした問題とかも作れたりするようになるだろう。
2、4、5、8、10で割り切れるか判定する方法
ある自然数があったとき、のどれかで割れるか調べたいとする。
これらの数は共通して、割られる数の下桁~下桁までを調べればいい。
で割り切れる ⇔ の位が
で割り切れる ⇔ 下桁がで割り切れる
で割り切れる ⇔ の位がか
で割り切れる ⇔ 下桁がで割り切れる
で割り切れる ⇔ の位が
これらを証明してみよう。
まず、割られる自然数をの位とそれ以外に分けて
と表す。ここで、は以上の整数で、はからのいずれか。
より、第一項がの倍数なので、後は、の位の数であるがで割り切れれば(つまり、の位がならば)、自然数もで割り切れる。
同様に、で割り切れるかどうか調べたいときも、
より、がの倍数(つまり、の位がならば)、自然数はで割り切れる。
ここまでの証明のポイントになっているのは、と分解できることだ。そのため、かで割れ切れるか調べたいときは、の位より上の桁は計算に無視していい。
次に、で割れ切れるか調べる方法について説明する。この場合は、下桁を調べる必要がある。それは、やのときと事情が違って、はで割り切れないからだ。ここでは、の代わりにの分解を使うことになる。つまり、
と表せることに注目する。割られる数をの位との位とそれ以外に分けて、
と表す。ここで、は以上の整数で、はのいずれか。より、
と表せることより、第項はの倍数なので、がで割り切れればもで割り切れる。つまり、自然数の下桁がで割り切れれば、もで割り切れる。
で割り切れるかどうかを調べる場合は、で割り切れるかどうかを調べたときと同様にして、の分解()を使って証明できる。
最後に、ある自然数がで割り切れるかを調べるには、の位がの場合に限る。で割り切れるには、でもでも割り切れる必要があるので、これら両方の場合に許されるの位の数はに限られるからだ。
3、9で割り切れるか判定する方法
で割り切れるか判定する方法は次の通り。
で割りきれる ⇔ 各位の数の和がで割り切れる
で割り切れる ⇔ 各位の数の和がで割り切れる
試しに、がで割り切れるかやってみる。このとき、各位の和は
との倍数になるので、でもでも割り切れる。(実際、となる。)
もう少し大きな数の例で、の場合は、
より、で割り切れる。(実際、)
まず、で割り切れるかどうかの判定方法から証明してみよう。で割り切れるかどうかを調べた時のことを振り返ると、という「単位」がで割り切れるかどうかがポイントになっていた。
そこで、をで割ってみた場合を調べることから始める。すると、
となる。つまり、のべき乗はで割ると、余る数になっている。
そこで、ある桁の自然数を
と表す。ここで、整数はからのいずれか。ここで、等を使うと、
と表せる。ここで、第一項はの倍数なので、残りのがで割り切れれば自然数もで割り切れる。つまり、自然数の各位の数の和がの倍数ならば、自然数もの倍数になる。
同様に、で割れるかどうか判定する場合は、
を用いて、
より、第項がの倍数なので、残りのがで割り切れればもで割り切れる。つまり、自然数Nの各位の数の和がの倍数ならば、自然数もの倍数になる。
11で割り切れるか判定する方法
で割り切れるか判定する方法も、やの場合とそこそこ似ている。
で割り切れる ⇔ 「奇数桁の数の和」ー「偶数桁の数の和」がで割り切れる
試しに、の場合だと、
より、はで割り切れる。(実際、)
応用問題をつやってみよう。
【問題】下桁がの自然数で、で割り切れる最小の数は何か。
【回答】はの倍数でないので、桁の数を調べればいい。
千の位をとして、奇数桁の和ー偶数桁の和がの倍数となればいいので、
よって、が答え。(実際、。)
さて、この判定方法を証明してみよう。をの倍数を使って表してみる。
という風に、は、
となる。よって、桁の自然数は、
より、がで割り切れれば、もで割り切れる。つまり、自然数について、「奇数桁の数の和」ー「偶数桁の数の和」がで割り切れれば、自然数もで割り切れる。
7で割り切れるか判定する方法
さて、ここまででを除いて、からまでの数で割りきれるかの判定方法を紹介した。なぜを一番最後に持ってきたかというと、他の数ほど分かりやすい判定方法でないからだ。
で割り切れる ⇔ 下の位から順番にを繰り返しかけて足したものがで割り切れる
例えば、の場合、
より、で割り切れる。この例だとあまり計算が楽になった感じがしないかもしれないが、
やのように、3桁ごとに繰り返す6桁の数が7で割り切れることなんかは、この判定方法を使うとすぐに分かる。
ついでに、ちょっとした応用問題も作ってみる。
【問題】下から桁目以外がであるような桁の自然数で、で割り切れるもののうち、最小のものを求めよ。
【回答】
下から桁目の数をとすると、題位の自然数がで割り切れるには、上に書いた判定方法より、
が7で割り切れればいい。をできるだけ小さくとるには、
の場合を考えればよく、これを満たす自然数[tex:a_1,a_7,a_{14}]で題位の自然数を最小にするものは、。([tex:10000000000006]はで割り切れる。ここで、は個並んでいる。)
応用問題を作ったせいで、脇道にそれたが、判定方法の証明をやってみる。他の数で割れるか調べた時と同様に、をの倍数を使って表してみる。結果だけを書いておくと、
となり、以下、の倍数にと繰り返す。
よって、桁の自然数は、
より、がで割り切れるためには、がで割り切れればいい。つまり、下の位の数から順に、と繰り返しかけて足したものがで割り切れるとき、元の数もで割り切れる。
【マトリックス】変数aとbを入れ替えるのに、cは要るのか問題!?【増殖するb】
プログラミング関連の絶版本・品切れ本をコチラから購入できます!
変数との入れ替えとエージェントスミスについて
変数とに異なる値が入っていて、それを入れ替えるアルゴリズムを書きましょう……というのは、プログラミングの入門書にありがちな問題で、ついさっきあるプログラミング言語の本を見ていたら、また書いてあった。
では、この問題の模範的な"間違え方"から紹介しよう。それが、
①とに値を入力
②
③
④とを出力
という解答*1。この間違え方をすると、本の著者や解答を知っている人にニヤニヤされるかもしれないので要注意だ!
落とし穴は②でにの値を代入しているところで、代入した瞬間にもも全部の値になってしまい、の値が跡形もなくなっている。いわば、このがマトリックスのエージェントスミスなのだ。
このようなスミスの無限増殖を防ぐ方法として、たぶん一番よく書いてある解法は、余分な変数を用意して、
①とに値を入力
②
③
④
⑤とを出力
として、の値が上書きされる前にに避けておけばいい。要は、がネオである。
さて、このないしネオは常に必要なのだろうか?そんなことを何となく考えていたら、を使わない第2の解答が存在することに気づいた。ただし、,が整数や実数等の数値である場合に限るけど。この解答は、厚めの本とか開けるとたぶん書いてありそうだけど……あえて紹介してみる!
を使わない解法とネオの休日
を使わないでとを入れ替えるには、どうしたらいいか?
それには、を完全にに置き換えるのではなく、との両方の情報を持つようにしておけばいい。つまり、に半分だけスミス分を入れる。
ここまで来ればもう簡単なので、解答を書いてみる。わかりやすくするため、とに最初に入っている値をとして、各ステップでに入っている値もカッコで囲って書いておく。
①,
②,
③,
④,
⑤とを出力
という風に、変数(ネオ)が休んでいても、との値は無事に入れ替えられた(Mission complete!)
*1:プログラミングでは左辺の変数に右辺の変数の値を代入するという意味。