素数についての練習問題と答案です。問題は、OCaml公式ページのものを使いました。答案の作成時間は、約1分でした。
問題35.
以下の式を参考にオイラー関数phi_improvedを書け。
$${\phi_{improved}(m) = (p_1-1)\times p_1^{m_1-1}\times (p_2-1)\times p_2^{m_2-1}\times (p_3-1)\times p_3^{m_3-1}\times \cdots}$$
$${p_i:}$$素因数、$${m_i:}$$:指数
※ 例えば、phi_improved 5は、4になります。
答案
本問の解き方
前回の答案で作成した素因数と指数のタプルからなるリストを生成する関数factorsを使い回します。
後は、問題文の通りに実装すれば完成です。
コード
点線より下が今回の答案で新しく書いた箇所です。
関数powerはべき関数です。
感想
今回の問題は簡単でした。問題文にて再帰的に定義されている式をただ写すだけでした。
ところで、今回のオイラー関数は、問題32の関数からの「改良」となっていますが、全然良くなっていません。
むしろ計算時間が増えており、悪くなっています。
$ time ./phi 113333
real 0m0.055s
user 0m0.049s
sys 0m0.006s
$ time ./phi_improved 113333
real 0m1.231s
user 0m1.223s
sys 0m0.006s
何を根拠に改良などと言っているのか理解しかねます。
だからと言って、改悪の理由も…あっ…
もしかして「エラストテネスのふるい」が原因でしょうか?
そう言えば調子に乗って、
などとバカなことを書いていました。
今更プログラムを作り直すのも面倒なので、タイトルを「オイラー関数の改良」から「オイラー関数改」に変更しました。
水平思考と言うやつです。犬やチンパンジーには出来ませんが、豚には出来る思考方法です。もちろん人である私にも!
次回は、第36問です。
話の流れとしては狗肉か猿肉の料理を見出し写真に使いたかったのですが、さすがに見つかりませんでした。