このブログ内を検索可能

2017年11月17日金曜日

雑記 宿題発生

さて、今日ついに実験数学の課題が発生した。
数学で実験?なにをするんやと思うだろう。
我々がやらねばならないことはそんな子供用の数字遊びではない。
しかし、基本は高校範囲までの数学である。なので一応一般向け…ではある。
さて、どういう問題が出されたか。
1,1000000から1010000までの各整数値に対し素因数分解を施す。その中で相異なる素数の個数を考え、この範囲の中から無作為にnを抽出したときの個数の期待値。
たとえば1260=2^2*3^2*5*7なので、2,3,5,7が素因数となるので、その個数は4。

普通にやるとそんなこと時間がかかりすぎてできないのは明らかだろう。

しかしこれをmathematicaという数学ソフト上でプログラムせよというのが課題。
一番最初からこの問題である。どう考えるか。

とりあえず、期待値を求めるには基本各nの値に対する個数が必要。それを実現するのはPrimeNu[n]という関数である。これはまさに相異なる素因数の個数を返す。
これを1000000から1010000までたし合わせて、試行回数10001回で割ればそれが期待値。
なぜなら期待値は平均値だからである。そこの理由記述はなかなか難しい…。
足し合わせるのは別に変数に加算(+=)をするだけ。

極めて簡単なプログラムである。

2,R^n値関数に対し連分数展開表示を与え有理数の値を返す写像と、その逆演算をプログラムして、互いにこれらが逆写像の関係にあることも併せて示せ。
(写像は関数の拡張版と思う)

これはどういうことかというと、このページの関係上連分数展開はつらい。
{1,2,3}∈R^3などを与えると、1+1/(2+1/3)を返す関数のことである。
ちなみにn=∞としてすべてのR^∞の各要素に対し1とするとそれは黄金比(1+√5)/2になる。
不思議や…。

これのプログラムは、もちろん繰り返される関数なので再帰的定義を思いつく。
つまり、ある値にたいし逆数を取って、リストの何個目かの値をたす、という操作を繰り返すことになる。

問題はその逆演算。たとえば1.123ならば、これを連分数表記する。
1+0.123(=1123/1000)であり、1+1/(x+y)のxをどう決めるかが問題。
連分数展開はxに確か自然数が入らなければならないので、8を入れる。このとき、y=16/123。
もし7以下を入れたならばyは1以上になり、これをまた同様の操作で逆数にしてx(次)を入れようとしたとき1ですら入れられない。なのでアウト。
9以上を入れれば次はyはマイナスになるので、これは逆数にしてもマイナス。アウト。
そういうわけで8が入る。
これをyが1/□の形になるまでやれば、完了。

一応有理数ならば連分数展開はn<∞で終わるという記述がある。なぜかは知らん。
無理数ならばこれは無限回続く。

プログラムにするなら、ユークリッドの互助法と類似していることを発見したので、その理由を記述してやっていくくらいか…。有理数を無理やり分母を10^□にして分数表記してやっていったほうが楽であるとみた。
無理数でも通用するプログラムのやり方はより煩雑なので、有理数だけでいいと書かれているのでその方法で十分。

逆写像であることは、2つの合成関数がidentityであることを示すだけか…?
identityとは恒等写像のこと。たとえばある集合の元xに対してxを返すもの。
もっと簡単に言うならばf(x)=xでいいか。

プログラム上では、普通に合成させて一致するのを見ればよい。たぶん簡単。

とこのように、確か4つの課題が出されて、これの提出締め切りが12月1日?、ということになっていたような。ふう…12月3日は駿台模試なんやな…。

だがや。それも重要だが、この週はモンパレの無差別BSの週である。
めでたく100位を取る予定の伝説の回になる予定…。