Challenge the Project Euler with R

2,705 views
2,599 views

Published on

Tsukuba.R#2 @twittoru\'s Presentation

0 Comments
1 Like
Statistics
Notes
  • Be the first to comment

No Downloads
Views
Total views
2,705
On SlideShare
0
From Embeds
0
Number of Embeds
17
Actions
Shares
0
Downloads
9
Comments
0
Likes
1
Embeds 0
No embeds

No notes for slide
  • Challenge the Project Euler with R

    1. 1. プログラミングを⑨㍉しか知らない俺が R で Project Euler に挑戦してみた @twittoru
    2. 2. あじぇんだ <ul><li>自己紹介 </li></ul><ul><li>はじめに </li></ul><ul><li>Project Euler って何 </li></ul><ul><li>出題問題紹介 </li></ul><ul><li>多言語の DisDis タイム </li></ul><ul><li>R でこの先生きのこるには </li></ul><ul><li>プログラミングな話? </li></ul>
    3. 3. 自己紹介 <ul><li>@twittoru </li></ul><ul><li>id:tor_ozaki </li></ul><ul><li>です どうぞよろしく </li></ul>
    4. 4. じこしょうかい <ul><li>某頭狂高専電子工学科 </li></ul><ul><li>電子工学ですが情報系ではないです </li></ul><ul><li>有機系太陽電池とかそういうことやってます </li></ul><ul><li>そんな奴ですが何故か R やってます </li></ul>
    5. 5. あじぇんだ <ul><li>自己紹介 </li></ul><ul><li>はじめに </li></ul><ul><li>Project Euler って何 </li></ul><ul><li>出題問題紹介 </li></ul><ul><li>多言語の DisDis タイム </li></ul><ul><li>R でこの先生きのこるには </li></ul><ul><li>プログラミングな話? </li></ul>
    6. 6. こんなノリでいきます
    7. 7. こんなノリでいきます
    8. 8. あじぇんだ <ul><li>自己紹介 </li></ul><ul><li>はじめに </li></ul><ul><li>Project Euler って何 </li></ul><ul><li>出題問題紹介 </li></ul><ul><li>多言語の DisDis タイム </li></ul><ul><li>R でこの先生きのこるには </li></ul><ul><li>プログラミングな話? </li></ul>
    9. 9. ぷろいぇくとえうらー? <ul><li>はてなキーワード -> 「まだ説明がありません」 </li></ul><ul><li>Wikipedia 日本語版 -> 「記事がありません」 </li></ul><ul><li>ぐぐればわかります…よね? </li></ul><ul><li>オイラー先生と言えば… 「テトラちゃん?ユーリ?いいえ、 ミルカさん最高です」 </li></ul>
    10. 10. どう解く? .org <ul><li>命題を解けるであろうアルゴリズムを実装する </li></ul><ul><li>高ランク言語は Mathematica,C++ 等 </li></ul><ul><ul><li>数学向け言語や高速な汎用言語強し </li></ul></ul><ul><li>Pencil/Paper や SpreadSheet で解くひとも </li></ul><ul><li>解くと解説や正解者向けスレッドが解禁される </li></ul><ul><li>進行具合によってスコアや称号がある </li></ul>
    11. 11. あじぇんだ <ul><li>自己紹介 </li></ul><ul><li>はじめに </li></ul><ul><li>Project Euler って何 </li></ul><ul><li>出題問題紹介 </li></ul><ul><li>多言語の DisDis タイム </li></ul><ul><li>R でこの先生きのこるには </li></ul><ul><li>プログラミングな話? </li></ul>
    12. 12. といてみた:かんたんかんたん <ul><li>Problem 1 10 未満の自然数のうち、 3 もしくは 5 の倍数に なっているものは 3,5,6,9 の 4 つがあり、 これらの合計は 23 になる。 同じようにして、 1,000 未満の 3 か 5 の倍数に なっている数字の合計を求めよ。 </li></ul><ul><li>いわゆる FizzBuzz の応用ですよね、わかります。 </li></ul>
    13. 13. といてみた:かんたんかんたん <ul><li>コード例 (function(n){ x <- 1:(n-1) sum(x[(!x%%3)|(!x%%5)]) })(1000)‏ </li></ul><ul><li>答え [1] 233168 </li></ul>
    14. 14. といてみた:ぐぬぬ… <ul><li>Problem 2 フィボナッチ数列の項が 400 万を超えない範囲で、 偶数の項の総和を求めよ。 </li></ul><ul><li>400 万とか多過ぎませんか ? </li></ul>
    15. 15. といてみた:ぐぬぬ… <ul><li>コード例 (function(fib=c(1,0),sumfib=0){ if(fib[1]==4000000){ sumfib }else{ Recall(c(sum(fib),fib[1]), ifelse(fib[1]%%2, sumfib,sumfib+fib[1])) } })()‏ </li></ul><ul><li>答え [1] 4613732 </li></ul>
    16. 16. といて…ません… orz <ul><li>Problem 3 600851475143 の素因数のうち最大のものを求めよ。 </li></ul><ul><li>先生、 PC が燃えます… orz </li></ul>
    17. 17. と…け…な…い… <ul><li>Problem 12 501 個以上の約数をもつ最初の三角数はいくらか。 </li></ul><ul><li>Problem 14 100 万未満の数字の中で、どの数字からはじめれば一番長いコラッツ数列が得られるか。 </li></ul><ul><li>Problem 21 10000 未満の友愛数の合計を求めよ。 </li></ul><ul><li>( 「・ ω ・ ) 「 ぎゃおおおおお !!!! </li></ul>
    18. 18. ダ…ズ…ゲ…デ… <ul><li>Problem 16 2 1000   の各桁の合計を求めよ。 </li></ul><ul><li>Problem 20 100! の各桁の数字の合計を求めよ。 </li></ul><ul><li>Problem 23 2 つの過剰数の和で書き表せない正の整数の総和を求めよ。 </li></ul><ul><li>( 「・ ω ・ ) 「 ヒャッホォォォォォォォォォォゥ !!!!! </li></ul>
    19. 19. あれ、解ける <ul><li>Problem 15 2×2 のマス目の左上からスタートした場合、引き返しなしで右下にいくルートは 6 つある。 では、 20×20 のマス目ではいくつのルートがあるか。 </li></ul><ul><li>あれ?これは組み合わせですよね。 </li></ul>
    20. 20. あれ、解ける <ul><li>コード例 (function(row,col){ prod(factorical(col+row), 1/factorical(col),1/factorical(row)) })(20,20) # もしくは choose(20+20,20)‏ </li></ul><ul><li>答え [1] 137846528820 </li></ul>
    21. 21. あじぇんだ <ul><li>自己紹介 </li></ul><ul><li>はじめに </li></ul><ul><li>Project Euler って何 </li></ul><ul><li>出題問題紹介 </li></ul><ul><li>多言語の DisDis タイム </li></ul><ul><li>R でこの先生きのこるには </li></ul><ul><li>プログラミングな話? </li></ul>
    22. 22. クラス” vector” の有難味 <ul><li>列挙して積 / 和を求めよ -> apply,sapply,sum,prod... </li></ul><ul><li>hoge の中から条件 fuga に当てはまるものを求めよ -> all,any,min,max... </li></ul><ul><li>条件どおりに要素を加えベクトルを伸ばしていき、 最後で一気に処理をかけることができる。 (ex:Problem 2 フィボナッチ数列 fib を十分な長さ用意しておいて sum(fib[!fib%%2]) でも問題ない )‏ </li></ul>
    23. 23. 量の壁 <ul><li>as.integer(10^10) -> NA </li></ul><ul><li>50 桁とか 2^1000 とか精度を維持して計算できない </li></ul><ul><li>Java とか Ruby とか Haskell だとできる ! </li></ul>
    24. 24. 量の壁 <ul><li>Java の BigInteger と BigDecimal とか </li></ul>
    25. 25. 量の壁 <ul><li>Python とか </li></ul>
    26. 26. 量の壁 <ul><li>python >>> 2**1000 10715086071862673209484250490600018105614048117055336074437503883703510511249361224931983788156958581275946729175531468251871452856923140435984577574698574803934567774824230985421074605062371141877954182153046474983581941267398767559165543946077062914571196477686542167660429831652624386837205668069376L </li></ul>
    27. 27. 量の壁 <ul><li>Ruby とか </li></ul>
    28. 28. 量の壁 <ul><li>irb irb(main):001:0> 2**1000 => 10715086071862673209484250490600018105614048117055336074437503883703510511249361224931983788156958581275946729175531468251871452856923140435984577574698574803934567774824230985421074605062371141877954182153046474983581941267398767559165543946077062914571196477686542167660429831652624386837205668069376 </li></ul>
    29. 29. 量の壁 <ul><li>Haskell だと </li></ul>
    30. 30. 量の壁 <ul><li>ghci Prelude> 2^1000 10715086071862673209484250490600018105614048117055336074437503883703510511249361224931983788156958581275946729175531468251871452856923140435984577574698574803934567774824230985421074605062371141877954182153046474983581941267398767559165543946077062914571196477686542167660429831652624386837205668069376 </li></ul>
    31. 31. 量の壁 <ul><li>できちゃうんです。まったくけまらしい。 </li></ul>
    32. 32. <ul><li>最終鬼畜 R 以外全部爆発 ! 発表者が落ちつくまで しばらくお待ち下さい…… </li></ul>
    33. 33. クラス” bigz” に学ぶ <ul><li>R は標準では多倍長整数は扱えない </li></ul><ul><li>GNU MP の移植 gmp が CRAN からインストールできる -> Ubuntu8.04 , gcc4.2.3 , R 2.6.2 ではコンパイル通りませんでした>< タスケテ </li></ul><ul><li>gmp では、 </li></ul><ul><ul><li>追加クラス ( 型 ) の多倍長整数 (.bigz), 分数 (.bigq)‏ </li></ul></ul><ul><ul><li>追加されたクラス向けの総称関数 </li></ul></ul><ul><ul><li>最小公倍数、最大公約数などの新規関数 </li></ul></ul><ul><li>が追加されます。 </li></ul>
    34. 34. クラス” bigz” に学ぶ <ul><li>これで R も多倍長整数を扱えるんですが… </li></ul><ul><li>べ、べ、別にあんたに頼らなくったって 私だけでも問題と、解けるんだからね ! </li></ul><ul><li>というわけではないですが、馬鹿正直に全部計算する必要はなかったりします。 </li></ul>
    35. 35. あじぇんだ <ul><li>自己紹介 </li></ul><ul><li>はじめに </li></ul><ul><li>Project Euler って何 </li></ul><ul><li>出題問題紹介 </li></ul><ul><li>多言語の DisDis タイム </li></ul><ul><li>R でこの先生きのこるには </li></ul><ul><li>プログラミングな話? </li></ul>
    36. 36. R の向き不向き というか限界 <ul><li>扱えるデータの限界 Problem 10 200 万までの素数をどう手にするか </li></ul><ul><li>Common Lisp (defun hogehoge (n &optional (ls nil)) (if (= n 1) ls (hogehoge (1- n) (cons i ls)))) とかやって (hogehoge 2000000) を篩にかける </li></ul>
    37. 37. R の向き不向き というか限界 <ul><li>扱えるデータの限界 Problem 10 200 万までの素数をどう手にするか </li></ul><ul><li>Ruby (2..2000000).each{|i| ------ 篩処理 ------ } </li></ul><ul><li>表記は簡単だが鬼のように時間がかかる。 </li></ul>
    38. 38. R の向き不向き というか限界 <ul><li>扱えるデータの限界 </li></ul><ul><li>R CL 風にやると ( ベクトル操作 ) 大量な要素のベクトルへの処理が重すぎて暴走する 2:2000000 は環境によっては作れない </li></ul>
    39. 39. R の向き不向き というか限界 <ul><li>扱えるデータの限界 </li></ul><ul><li>R CL 風にやると ( ベクトル操作 ) 大量な要素のベクトルへの処理が重すぎて暴走する 2:2000000 は環境によっては作れない Ruby 風にやると ( ループ処理 ) “ ゴールド・ E ・レクイエム” が発動 </li></ul>
    40. 40. まとめると <ul><li>R 向いてる </li></ul><ul><ul><li>大量のデータに対して関数を適応すること </li></ul></ul><ul><ul><li>問題がベクトルの操作と等価であるもの </li></ul></ul><ul><ul><li>手間が泥 </li></ul></ul><ul><li>R 向いていない </li></ul><ul><ul><li>計算時間がかかるもの </li></ul></ul><ul><ul><li>手順が泥 </li></ul></ul><ul><ul><li>while ループしか書けない人 </li></ul></ul><ul><ul><li>(( 空 . 気 ) . ( 読 . ( め る . 人 )))‏ </li></ul></ul>
    41. 41. あじぇんだ <ul><li>自己紹介 </li></ul><ul><li>はじめに </li></ul><ul><li>Project Euler って何 </li></ul><ul><li>出題問題紹介 </li></ul><ul><li>多言語の DisDis タイム </li></ul><ul><li>R でこの先生きのこるには </li></ul><ul><li>プログラミングな話? </li></ul>
    42. 42. さぁみんなも挑戦しよう <ul><li>なるべくベクトルとにかくベクトル </li></ul><ul><ul><li>桁ごとに分解して筆算を実装するとかいいかも </li></ul></ul><ul><li>枝刈りちゃんとしましょう </li></ul><ul><ul><li>計算回数は最小限に </li></ul></ul><ul><ul><li>ごり押しのコードを考える前に問題の本質を理解する </li></ul></ul><ul><li>どうしても大量のループが必要なら諦める </li></ul><ul><ul><li>使用言語を制限するルールはありません </li></ul></ul>
    43. 43. 速度とコンパイル <ul><li>数行数秒とかいう GAIJING めwwww </li></ul><ul><ul><li>Calculated the answer in 2 seconds flat. </li></ul></ul><ul><ul><li>Runs under 1 second.  </li></ul></ul><ul><ul><li>It executes in only a few seconds. </li></ul></ul><ul><ul><li>It's easy in Matlab. </li></ul></ul><ul><ul><li>One line in Mathematica: ---code--- </li></ul></ul>
    44. 44. 速度とコンパイル <ul><li>現状でもループを使わなければ十分使える </li></ul><ul><ul><li>GNU Octave,MATLAB より行列計算速いとかなんとか </li></ul></ul><ul><li>LISPLISP したコードは遅いだけの現状 ! </li></ul><ul><li>とはいえコンパイルの構想はあるらしい </li></ul><ul><ul><li>将来に期待? </li></ul></ul>
    45. 45. おまけ: Lazy に生きたい <ul><li>遅延評価は使えるようにしておくと楽しいかも </li></ul><ul><li>無限ストリームがあると解き方が変ってくるかも </li></ul><ul><li>素数とかフィボナッチ数とかの問題は向いてると思いません? </li></ul>
    46. 46. かんそうとか <ul><li>あんま時間なかった </li></ul><ul><li>SICP 読めばよかった </li></ul><ul><li>幻想都市大学筑波 </li></ul>
    47. 47. かんそうとか <ul><li>あんま時間なかった </li></ul><ul><li>SICP 読めばよかった </li></ul><ul><li>幻想都市大学筑波 </li></ul><ul><li>一緒に問題をコネコネするミルカさん募集中 </li></ul>
    48. 48. おわり

    ×