Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
Project Eulerの話
Search
nozma
April 05, 2019
Programming
940
0
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
Project Eulerの話
Project Eulerについて紹介しました。
nozma
April 05, 2019
More Decks by nozma
See All by nozma
統計検定の思い出
nozma
0
1.2k
ヤバくない農薬の話
nozma
0
1.1k
Other Decks in Programming
See All in Programming
数百円から始めるRuby電子工作
tarosay
0
100
act2-costs.pdf
sumedhbala
0
120
AI時代の仕事技芸論〜ソフトウェア開発で「遊ぶように働く」職人的熟達のすすめ(スクフェス仙台 2026バージョン)
kuranuki
0
710
任せる範囲はこう広がった / How the Scope of AI Delegation Has Expanded
nrslib
1
270
PHP Application における Kubernetes 内 gRPC 通信
ganchiku
0
530
分散システム、なんですぐ死んでしまうん?耐障害性を高めたいあなたのためのレジリエンスパターン入門
mshibuya
7
6.7k
Welcome to the "Parametricity" 🏙️ − Generic だけど Specific な世界 −
guvalif
PRO
1
180
AI時代のPHPer生存戦略 ~「言語、もうなんでもよくない?」に本気で向き合う~
vivion
0
150
音楽のための関数型プログラミング言語mimiumにおける多段階計算の活用
tomoyanonymous
1
350
コーディングルールの鮮度を保ちたい for SRE NEXT 2026 / keep-fresh-go-internal-conventions-sre-next-2026
handlename
0
150
吝嗇家のためのAI活用 / AI development for miser - ChatGPT + Issue Driven Development
tooppoo
0
190
【やさしく解説 設計編・中級 #4】ルールの寿命と、システムの年輪
panda728
PRO
2
160
Featured
See All Featured
Avoiding the “Bad Training, Faster” Trap in the Age of AI
tmiket
0
200
Money Talks: Using Revenue to Get Sh*t Done
nikkihalliwell
0
410
How to Build an AI Search Optimization Roadmap - Criteria and Steps to Take #SEOIRL
aleyda
1
2.1k
Evolution of real-time – Irina Nazarova, EuRuKo, 2024
irinanazarova
9
1.4k
SEO Brein meetup: CTRL+C is not how to scale international SEO
lindahogenes
1
2.8k
The Limits of Empathy - UXLibs8
cassininazir
1
530
Agile Leadership in an Agile Organization
kimpetersen
PRO
0
190
30 Presentation Tips
portentint
PRO
1
350
Rails Girls Zürich Keynote
gr2m
96
14k
jQuery: Nuts, Bolts and Bling
dougneiner
66
8.5k
Raft: Consensus for Rubyists
vanstee
141
7.6k
Digital Projects Gone Horribly Wrong (And the UX Pros Who Still Save the Day) - Dean Schuster
uxyall
1
2.1k
Transcript
Project Euler の話 @nozma 2019-04-05
最近AtCoder はじめました まだクソザコナメクジ。 2 / 40
実は深刻な問題があります 3 / 40
R が使えない… 4 / 40
R が使えない…!! 5 / 40
R を!!!!!!!!!! 使わせろ!!!!!!! 6 / 40
プロコンあるある Rが使えない(重要) バージョンが古い 好きなライブラリを使えない Rが使えない(重要) 仕方ないのでC++で解いてます 7 / 40
Project Euler そんな私に 8 / 40
論文を沢山書いたおじさんです。 誰? 9 / 40
何? 数学の問題集です。 コンピュータを用いて計算することが想定されています。 10 / 40
Project Euler のここがすごい ルールが簡単 n桁の数字を解答欄に書き込むだけ(n=チョット) 時間に制限がない 1分以内に解けるように設計されている(one-minute rule) ググっても良い むしろ推奨されている
11 / 40
Project Euler のここがすごい (たまに)解説PDFがある (実際あんまりない) フォーラムがある 時間をかけて解く -> フォーラムで賢いやり方を学ぶというのが一般的 言語に制限がない
手元で実行なので当然 12 / 40
言語に制限がない!!! 13 / 40
どんな言語が使われているのか? AtCoderとProject Eulerでそれぞれ集計してみました。 14 / 40
AtCoder のランキング APIがあったのでそこからデータ取得 kenkoooo/AtCoderProblems: Problem manager for AtCoder users jsonをrlistパッケージで読み込んで加工
次の項目を計算してグラフを作成 ユーザー数 ... ACが1件以上あればユーザとカウント AC平均 ... Accepted合計 / ユーザー数 15 / 40
AtCoderの使用言語ランキング 16 / 40
AtCoderのつよい言語ランキング 17 / 40
Project Euler のランキング Statistics - Project Eulerに統計情報があるので取得 認証が必要なのでRSelenium パッケージでログイン rvestでスクレイピング
次の情報があるので可視化(件数が多いので上位50%のみ) ユーザー数...ユーザーがプロフィールで設定するもの 回答率...回答数/問題数が言語別に集計されたもの 18 / 40
Project Eulerの使用言語ランキング 19 / 40
つよい言語ランキング 20 / 40
やってみよう 21 / 40
Problem 1 -- Multiples of 3 and 5 3か5で割り切れる1000未満の自然数の合計は何か? PE版のfizzbuzzです。
22 / 40
PE001 回答例 23 / 40
素直に解く ans 0 for (i in seq_len(999)) { if (i
3 0 | i 5 0) { ans ans + i } } 良いと思います。 24 / 40
もっとFizzBuzz っぽく sum((x=1:999)[!(x 3&x 5)]) 書き方にこだわってみても良いでしょう。 25 / 40
もっと最近のR っぽく library(dplyr) data.frame(x = 1:999) %>% filter(x 3 0
| x 5 0) %>% summarise(answer = sum(x)) 好きなライブラリを使ったって良いんです。 26 / 40
Python が使いたいんじゃ print(sum(i for i in range(1000) if i %
3 0 or i % 5 0)) どうしてもPythonが良いというなら止めません。 27 / 40
あまり役に立たない知見が得られる問題が盛りだくさんです 28 / 40
Problem 92 Square digit chains 「各桁の値の2乗の合計を計算する」という操作を繰返します。 44 -> 32 ->
13 -> 10 -> 1 -> 1 85 -> 89 -> 145 -> 42 -> 20 -> 4 -> 16 -> 37 -> 58 -> 89 1つめの例では、1に到達し、2つめの例では89から始まるループに到達しています。実 は、操作を繰り返すとすべての自然数は1または89に到達します。 1千万以下の自然数のうち、89に到達する数はいくつあるでしょうか? 29 / 40
考え方 上限をN、ループ判定に必要な時間をMとして 程度の計算量が 必要です。 N = 1e7なので、Mの値次第では結構時間がかかります。 どうするか?(考えてみましょう) ヒント:ほぼ の解法があります
O(N × M ) O(N ) 30 / 40
回答例 「2乗の和」の計算結果は、最大でも です すべての値について1回だけ処理をすれば、すべて486以下の値になりま す。 したがって486以下の整数について最終的に89になるのか?を把握してお き、配列などにメモっておけば高速に計算できます。 9 2 ∗
6 = 486 31 / 40
Project Euler のここがすごい 日常生活で比較的使わない概念を知ることができます 32 / 40
Q. 何? 3 ⇈ 3 33 / 40
答: テトレーション cf. 大きな数が好きなら寿司 虚空編を読もう! 3 ⇈ 3 = 3
3 3 = 3 27 = 7, 625, 597, 484, 987 34 / 40
Problem 188 の下8桁を求めよ。 ヒント1: 桁だけでメモリが死ぬので直接計算してはいけません ヒント2: 冪乗演算子は右結合なので左から計算してはいけません # n 1777
for (i in 1:1855) n n^1777 mod 1e8 1777 ⇈ 1855 35 / 40
オイラーの定理 と を互いに素な正整数とします。このとき次の関係が成立します。 はオイラーの (トーシェント)関数というもので、 以下の自然数で と互いに素な自然数の個数を返します。 例) なら1と5が互いに素なので 。
とすると、 となってオイラーの定理が成り立つ。 a n a φ(n) mod n = 1 φ(n) φ n n n = 6 φ(6) = 2 a = 5 5 2 mod 6 = 1 36 / 40
で? 1777は素数なので、1e8と互いに素です。つまり次の関係が成り立ちます。 乗する度に下8桁が00000001に戻るということです。つま りこうです。 指数部分の剰余をとってから計算して良いということです。 1777 φ(10 8 ) mod
10 8 = 1 φ(10 8 ) = 4 × 10 7 1777 x mod 10 8 = 1777 x mod 4×10 7 mod 10 8 37 / 40
コードにするとこう solve function(a, b, m) { ans = 1 for
(i in seq_len(b)) { if (i b) m = 1e8 ans = modpow(a, ans, m) } return(ans) } solve(1777, 1855, 4e7) ※冪乗の剰余を計算する関数がRには無いので適当に定義する必要がありま す。メンドイ!! 38 / 40
実は… ループは10回で良い で剰余とっても良い Pythonだと楽 x = 1 for i in
range(10): x = pow(1777, x, 10 8) print(x) とかいろいろあって闇が奥が深いです。問題解いてからforum覗いてみるとよ いでしょう。 10 8 39 / 40
終 40 / 40