関数を作るのって、結構楽しいんですよね。作曲や絵を描くのと同じで創作意欲が満たされるというか。
何言ってるかわからないと思うので、実際に関数を作って遊んでるときの私の脳内をトレースしました。
関数を作る
あ〜〜〜ヒマだな。関数でも作って遊ぶか。
そうだな......。例えば「」を「」にするみたいな、「自然数をひっくり返す関数」とかどうかな。
なら。なら。うんうん。できなくはなさそう。ググってみたけど有名な関数でそういう機能を持つものはないみたいだな。いいぞ。作りがいがある。
関数だしとりあえずとでも名前つけとくか。こんな感じの問題になるかな。
自然数に対して、の各桁の値の並びを逆順にした数を与えるような関数を作れ。
うん。ワクワクしてきたぞ。なんでだろうな。絶妙に自分にも作れそうなレベルだからかな。
基本的な方針
a千b百c十d(エーせんビーひゃくシーじゅうディー)みたいな自然数って、数式で書くと
って表されるから、これを逆の
に変換してくれるような関数を作ればいいわけだよな。そうなると......。まずは「自然数nの○桁目の数を取り出す関数」を作って、それから並べ替える、という方針を取るとよさそうかな。
こいつらが使えそうだ。
武器1
:モッド。順番通りに「モッドエヌのじゅうのケーじょう」と読む。と書いても同じ意味。自然数の下桁を与えてくれる頼もしいやつ。がでがなら、の下桁ということなので。でなら。
※実際には、をで割ったあまりを計算している。
武器2
:フロア。「フロアエヌ」と読む。とも書く。の整数部分を与えてくれる心強いやつ。なら。だと。四捨五入ではなく、小数点以下をバッサリ切り捨てる。モッドとは血が繋がっている。
まずはどうするか
とりあえず適当なを選んでひっくり返すことを考えよう。とかでいいかな。いやマズいな。ひっくり返したときに「桁目である」「桁目である」とかになっちゃってややこしいからな。......あたりにしよう。
まずは1桁目を取り出すことを考えると、これはmodにかけるだけですむはず。「1桁目」なのでをカッコに突っ込んで、
でいい。計算するとたしかにだ。1桁目が取り出せている。
では2桁目は? からその2桁目たるを取り出すには?
これは「下2桁を取り出して」「して」「整数部分を取り出す」とすればできそうだ。
まず下2桁を取り出すためにmodにかけて。
それをして。
最後にその整数部分をfloorで取り出してだ。
できたできた。ちゃんと取り出せている。
じゃあ3桁目以降も全く同じ考え方でいけるはずだ。の3桁目たるを取り出すには、まず下3桁を取り出す。
がほしいので今度はする。
最後に整数部分を取り出す。つまり小数点以下をバッサリ切り捨てる。
よしよしできたできた。ギュッと押しだして、はみ出た部分をバッサリ切る。なんかトコロテン作ってるみたいな気分だな。トコロテン作ったことないけど。
下桁を取り出して、
ギュッと(小数点以下に)押し出して、
はみ出た部分をバッサリ切る。
今度作ってみようかな。トコロテン。
問題発覚
1桁目を取り出したいとき、2桁目を取り出したいとき、3桁目を取り出したいとき......。ここまでで、何桁目だろうとそれぞれの式がわかったのだから、これは桁目を取り出したいときの式に一般化できるよな。法則性から考えて、こうすればいいはず。
自然数の桁目を取り出す式(関数):
さっきまでの式と内容は同じはずなのに文字式になるとなんか急にわかりにくくなる感があるな。具体例って大事。
さて。そしたらあとはもうこれを並べ替えるだけだな。取り出した1桁目から順にとしたらこれをひっくり返すには、って風に足していけばいいわけだから......。
あれ! ダメじゃん! これだと4桁の数にしか使えないじゃん!!
この方法で例えばをひっくり返そうとすると、4桁の数だとみなされてになっちゃう。
あ、まあ別にダメではないのか。それはそれでそんな関数もアリだもんな。何か一つの答えがあるような問題を解いてるわけじゃないから、もうこのへんは好みの問題だな。個人的な好みとしてはやっぱりをひっくり返したらになってほしい。が2桁のときは2桁分だけひっくり返す、4桁のときは4桁分だけひっくり返す。そういう設定が必要だ。ということは......。
の桁数を求める関数も必要だなこれ。
桁数関数
「桁数 関数」でググっても、excelとかにおいて数字の文字列としての長さから桁数を求めるものばっかりヒットして、数学的な桁数関数ってものはなかなか出てこない。意外と有名なものはないんだな。じゃ作るしかない。
作るとなると、やっぱりあいつが必要になってくるだろうな。
武器3
:ログ。「ログじゅうのエヌ」と読む。「を何乗するとになるか?」という意味として捉えることができ、例えばだと「を何乗するとになるか?」ということになるのでこの値はとなる。
かつて多くの船乗りの命を救った英雄。
は「をにするには何乗か?」と読める。これはもちろんだ。だとだ。
でってことは、だとにはちょっとだけ満たないってことだから、とかそれぐらいの値になるはず。
が4桁であるのときはで、3桁であるのとき。つまり、この整数部分をとってを足せばの桁数が出てくれるということでよさそうだ。こうなる。
の桁数を取り出す式(関数):
ためしにを入れてみると、たしかにになる。だと。そうなるように作ったのだから当然だ。この桁数関数をとでも置いておこう。
まとめます
よしっじゃあ2つの関数をまとめるぞ!
最上位の桁の数から考えよう。をひっくり返したの最上位にある数は、もとのの下一桁、つまり関数で取り出される数だった。なら。それを最上桁まで押し上げるには、の冪をかければいい。元が4桁ならを、5桁ならを。桁ならを。は4桁の数なのででをかければいい。元の数の桁数はで求められたので、となる。つまりこうだ。
のとき、これがすなわちとなる。次はここにを足したい。下から2番目の数を上から2番目にしたいわけだ。
上から2番目の数は、下から2番目の数を取り出したものにこんどはをかければいい。
これが。さっきのと足して。
次はこうだ。
→と変化している部分をにしただけ。これが。一応にを入力して確かめてみるか。モッドは下桁を与える関数だったから......。
うむ。あってるな。
最後はこう。
これらをからまで全部足し合わせればいいわけだ。4桁の数ではからまでだったわけだから、一般に桁だとからまで足せばもう完成のはず! 総和記号を使って書くとこうなるかな。
できた! これが「任意の自然数をひっくり返す関数」だ!!!
完成
一応コンピューターさんにも正しいかどうか見てもらおう。
https://www.desmos.com/calculator/23dohpo6nd
(上のリンク内「」の部分に好きな数字を入れると真下の式のところに計算結果が表示されます)
関数! をひっくり返して!
関数! をひっくり返して!
よしよし。できてるできてる。えらいぞ! 関数!
これで完成だ。満足満足。おおむね満足だけど、欲を言えばもう少し簡潔な式になってほしかったかな。
「自然数をひっくり返す」というだけなのにここまで複雑な式になってしまうのは、それはそれで興味深いけどもうちょっと使い勝手のいい式になってくれるといいんだけどな。そしたら例えばととの関係性みたいな、ひっくり返す系の数学的事実に気軽に考察を与えることができるようになっていいと思うんだけど。まあいいや。今後の課題としよう。
さて
あ〜〜〜〜〜〜今日も今日とてヒマだな。ヒマなはずないんだけどな。やること大量にあるし。やることがいっぱいありすぎるとどれから手つけようウワアアってなっちゃって逆に何も手につかないんだよな。仕方ないし関数でも作って遊ぶか。
そうだな今度は例えば......。「任意の自然数を小数点以下で繰り返す関数」とかどうかな。
なら。なら。お、いい感じかも。ちょっと簡単すぎるかな? いや、簡単だろと思ってやってたら思いもよらぬことが判明したなんてのはよくあることだしな。とりあえずやってみるか。何から考えたらいいだろ。まずはそうだな......。