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
950
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.3k
ヤバくない農薬の話
nozma
0
1.1k
Other Decks in Programming
See All in Programming
DynamoDBの基礎を振り返りながらベクトル検索機能を理解する
musan
3
270
Deep dive into the select statement (GopherCon UK)
jespino
0
170
Building an Out-of-Order CPU
latte72
0
700
Gmail/Google DriveをトリガーにAIエージェントを動かそう! / Run AI agents with Gmail/Google Drive as triggers!
har1101
3
470
Laravelのアプリケーションをどこにデプロイするか #ツナギメオフライン.9
akase244
0
120
自分的「カンファレンスの楽しみ方」
syumai
0
190
新卒PdEのリアル
ryu1013
1
420
Hono + Inertia + React で LP を構築した話
oukayuka
2
220
「AI時代、配布するPythonコードをどう守るか: 難読化の実験と判断軸」 #PyconJP2026
pkshadeck
PRO
2
170
【デモ】Kiroで体験する仕様駆動開発|設計からコーディングまでAIと進める開発フロー
cmkudo
0
590
in-process GraphQL のすすめ #ginzajs
izumin5210
4
1.5k
XP祭りでしか伝わらないフリップネタ #xpjug
murabayashi
0
110
Featured
See All Featured
How to optimise 3,500 product descriptions for ecommerce in one day using ChatGPT
katarinadahlin
PRO
2
3.8k
The Anti-SEO Checklist Checklist. Pubcon Cyber Week
ryanjones
0
230
Sam Torres - BigQuery for SEOs
techseoconnect
PRO
0
530
Color Theory Basics | Prateek | Gurzu
gurzu
0
460
Building a Scalable Design System with Sketch
lauravandoore
463
34k
Code Review Best Practice
trishagee
74
20k
Designing Experiences People Love
moore
143
24k
Principles of Awesome APIs and How to Build Them.
keavy
128
18k
ReactJS: Keep Simple. Everything can be a component!
pedronauck
666
130k
Measuring Dark Social's Impact On Conversion and Attribution
stephenakadiri
2
270
How to Grow Your eCommerce with AI & Automation
katarinadahlin
PRO
1
260
Beyond borders and beyond the search box: How to win the global "messy middle" with AI-driven SEO
davidcarrasco
3
230
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