サクサク読めて、アプリ限定の機能も多数!
トップへ戻る
今年の「かわいい」
qiita.com/drken
スキャン回路は、問題を正しく認識して、小問題へと分解するのに必要な力ですね。さらに、クリエイト回路・リバース回路・ノック回路を使うことで、法則を発見し、それを抽象化して「一般的に成り立つだろうと予想される仮説」を立てることができます。最後に、ステップ回路を使うことで、問題の解法を組み立てることができます。これらの思考回路は、まさにプログラミング的思考を支えるものだといえます。 さらに、プログラミングに限らず、仮説を立てて検証するという、あらゆる場面で重要な役割を果たす仮説検証の営みを支えるものでもあります2。なお、これらの論理的思考回路についてさらに具体的なことを経験したい方は、ソニー・グローバルエデュケーションによる書籍『5分で論理的思考力ドリル』を読むのがオススメです! 1-2: 中学数学や高校数学の「小学生版」であること 中学受験の算数というと、特殊なトレーニングだという印象を持つ人
とても久しぶりです! 1 年ぶりの投稿となりました、大槻 (通称、けんちょん) です。 去年、『AtCoder 版!マスター・オブ・整数』と題して、プログラミングコンテストで出題される整数問題を解くときに有効な考え方を特集する記事を 2 本書きました! AtCoder 版!マスター・オブ・整数 (素因数分解編) AtCoder 版!マスター・オブ・整数 (最大公約数編) 今回はその続編として、素数を列挙するアルゴリズムであるエラトステネスの篩を特集していきます。なお今回の記事の内容は、競プロへの応用を意識していますが、純粋に数学的興味に沿って読み進めることもできるものになっています。下図は、これから紹介するエラトステネスの篩のイメージ図です。 0. はじめに エラトステネスの篩は、$1$ 以上 $N$ 以下の素数をすべて列挙する方法です。たとえば $20$ 以下の素数を列挙すると、$2,
NTT データ数理システムでリサーチャーをしている大槻 (通称、けんちょん) です。今回は計算量オーダーの求め方について書きます。 0. はじめに 世の中の様々なシステムやソフトウェアはアルゴリズムによって支えられています。Qiita Contribution ランキング作成のために用いるソートアルゴリズムのような単純なものから、カーナビに使われている Dijkstra 法、流行中のディープラーニングに用いられている確率的勾配降下法など、様々な場面でアルゴリズムが活躍しています。アルゴリズムとはどんなものかについて具体的に知りたい方には以下の記事が参考になると思います: アルゴリズムとは何か ~ 文系理系問わず楽しめる精選 6 問 ~ アルゴリズムを学ぶと $O(n^2)$ や $O(n\log{n})$ や $O(2^n)$ といった計算量オーダーの概念が登場します。こうした記法を見ると
qiita.com
最後に、17 章で PとNPに関する話題を解説し、世の中には「効率的に解くアルゴリズムを設計することができそうにない難問」が多数あることを見ます。18 章で、これらの難問に取り組むための方法論をまとめます。 競プロをやっている方向け 扱っている題材の難易度については、こんな感じのイメージです! チーター本 < 本書 = 螺旋本 < 蟻本 難易度が近い螺旋本は、スタンスが異なる部分もありますので、よい形で共存できたら、という想いです。 螺旋本と比べると、「動的計画法」「貪欲法」「二分探索法」などの設計技法に関する話題をより重視しています 螺旋本は「ライブラリを揃えていく」という思想なので、設計技法よりもライブラリになるものを重視する立場です 本書では、紙面の都合で「計算幾何学」と「整数論」には触れられませんでしたが、これらは螺旋本には載っています 2-2. 本書の対象読者 本書は、「アルゴリ
0. はじめに メジャーなグラフ探索手法には深さ優先探索 (depth-first search, DFS) と幅優先探索 (breadth-first search, BFS) とがあります1。このうち DFS については DFS (深さ優先探索) 超入門! 〜 グラフ理論の世界へ 〜 【前編】 DFS (深さ優先探索) 超入門! 〜 グラフ理論の世界へ 〜 【後編】 にて詳しく特集しました。これらの記事中で幅優先探索 (BFS) についても簡単に触れているのですが、今回改めて特集します。特に、後編で紹介した グラフの二点間の到達可能性 グラフの連結成分の個数 二部グラフ判定 トポロジカルソート サイクル検出 といった問題たちが BFS によっても解くことができることを示します。一つの問題を DFS・BFS と様々な探索手法で解くことで、グラフの様々な性質をより深く親しむことを狙います。
今回は最大公約数について特集します! 最大公約数は、初等整数論の醍醐味をたっぷりと味わえる題材です。競プロをやっている方だけでなく、大学受験を志す方にも有益なものが満載です。 (なお、最近の Qiita スマホ表示の不具合により、スマホでは数式がうまく表示されない可能性があります) 0. はじめに 今回は AtCoder の整数問題の中でも特に多い最大公約数に関する知見をまとめます。今回も前回と同様、登場するアルゴリズム自体はたった 1 個です。 Euclid の互除法 Euclid の互除法とは、二つの整数 $a, b$ の最大公約数を求めるアルゴリズムです。たったそれだけなのですが、最大公約数については考えることがものすごく沢山あります。前回の素因数分解と同様、最大公約数も 単にアルゴリズムを覚えるだけでなく、最大公約数という概念について深く理解すること がとても重要だと思います。最大
お久しぶりです! アルゴリズムと整数好きのけんちょんです! 今回は俗に「数学ゲー」と呼ばれるタイプの問題のうち、整数について語ります。 【他シリーズ】 AtCoder 版!マスター・オブ・整数 (最大公約数編) エラトステネスの篩の活用法を総特集! 〜 高速素因数分解・メビウスの反転公式 〜 フェルマーの小定理の証明と使い方 拡張ユークリッドの互除法 〜 一次不定方程式 ax + by = c の解き方 〜 (書籍画像は amazon ページ より) 追記:整数問題を練習できるオンライン教材 本記事に準拠した、整数アルゴリズムを学べるオンライン教材を作ってみました。素数判定から始めて、段階的に学べる教材としました。 整数問題などのオンライン練習問題集 1 問 1 問は下図のような構成になっています。各問題に対して、ユーザが実装したプログラムを提出すると、その場でサーバー上で実行し、正しく挙
今の場合は A さんが 31 歳の場合のストーリーでしたが、A さんが 20 歳~ 35 歳のうちのどの年齢であったとしても、似たようなストーリーで必ず 4 回の質問で当てることができます!(他の例も是非考えてみてください。) ちなみに、このような「真ん中で切ってどちらかに絞って行く」タイプのアルゴリズムには二分探索法という名前がついています。応用情報技術者試験でも頻出のテーマですので馴染みのある方も多いと思います。 1-2. つまり、アルゴリズムとは 上の年齢当てゲームという問題では、相手の年齢を当てる「方法・手順」を二分探索法に基づいて導きました。このようにアルゴリズムとは、 問題を解くための方法・手順 のことです。さて、アルゴリズムと聞くと「コンピュータ上で実装されたプログラム」のことを思い浮かべる方も多いと思いますが、必ずしもコンピュータと関係がある必要はなく、日常生活でも多々登場
0. はじめに 動的計画法の解法に対しては、「一次元 DP」や「二次元 DP」といった呼称でよびたくなりがちです。たとえば ${\rm dp}[i] := i$ 番目の地点まで到達するまでの最小コスト というような DP テーブルを用いるような DP1 は一次元 DP であり、 ${\rm dp}[i][w] := N$ 個の品物のうち最初の $i$ 個の品物の中から、重さが $w$ を超えない範囲でいくつか選んだときの、選んだ品物の価値の総和の最大値 というような DP テーブルを用いるような DP2 は二次元 DP である、といった具合です。後者はいわゆるナップサック問題に対する DP として有名ですね! 二次元 DP の配列を再利用して一次元へ しかし今回は、DP を一次元や二次元とよぶことにあまり意味がないかもしれない...という話をします。たとえばナップサック DP は、なんと実
0. はじめに お久しぶりです! 半年ぶりの投稿になりました、drken (通称、けんちょん) です。この記事は プログラマーのオススメのゲームの話をする Advent Calendar 2019 の 21 日目の記事として書きました。僕は「記事を書く」というゲームについての記事を書こうと思います!!! 記事を書くのはゲームなのかと問われると、なんか違う気もするのですが、世の中には「一つの作品を作り上げる」というタイプのゲームもたくさんあるので、それに近い感じかなと。そして、ぜひともお伝えしたいのは 記事を書き上げたときの、何物にも代えがたい達成感 です!!! きっと誰しもが、日々の仕事・勉強で得た気づきや、伝えたい問題意識など、「語りたいこと」がたくさんあるはずです。それを自分の手で体系立てて、題材を取捨選択し、ストーリーを築き上げて、記事という「作品」に仕上げる。今まで混沌としていた知
目次 DFS (深さ優先探索) 超入門! 〜 グラフ理論の世界へ 〜 【前編】 からの続きです!! 前編 0 章: はじめに 1 章: グラフとは 2 章: 計算機上でのグラフの表し方 3 章: 深さ優先探索 (DFS) と幅優先探索 (BFS) 後編 (いまここ) 4 章: グラフの様々な例題 5 章: 発展的話題 6 章: おわりに 7 章: 参考文献 4. グラフ上の様々な例題 いよいよ、深さ優先探索 (DFS) を用いて、グラフに関する様々な問題を解いてみましょう。グラフの連結性に関する問題の多くが、単純な探索によって解決できることがわかります。 そしてグラフ探索はとにかく「習うより慣れろ」の精神が重要なテーマでもあります。本記事では、グラフの連結性に関する諸概念に親しみながら、探索にも慣れるという一石二鳥を狙います。なお、ここで取り上げる問題のほとんどは DFS だけでなく BF
0. はじめに --- グラフ探索の動機 現代ではコンピュータはとても身近なものになりました。コンピュータの用途としては シミュレーションなどの大規模計算を行う 人工知能をつくる アプリを開発する などなど多様なものが考えられますが、「探索」もまた、コンピュータを用いるモチベーションとして、最も基本的かつ重要なものの一つだと思います。探索とは、与えられた対象の中から、目的に合うものを見つけ出したり、最良のものを見つけ出したり、条件を満たすものを列挙したりする営みです。 世の中における様々な問題は、探索によって、考えられる場合を調べ尽くすことによって原理的には解決できるものが多いです。例えば、現在地から目的地まで最速でたどり着く方法を求める問題は、原理的には、現在地から目的地へ到達する経路をすべて列挙することで解決できます1。将棋やオセロの必勝法を求める問題は、原理的には、考えられる局面と
0. はじめに 基本的なデータ構造として大学の授業や情報系の各種試験などによく登場するものの一つに、スタックとキューがあります。 スタックとキューについて学ぶ場面の多くでは、「スタックは LIFO (Last-In-First-Out)、キューは FIFO (First-In-First-Out)」と呪文のように覚えたり、 スタックは、例えば超忙しいときに新しい課題がぶっこまれたときとかにとりあえずそれを先に片付けるような感じ キューは、人気ラーメン屋に並ぶ人々の待ち行列のように先に並んだ人が先にお店に入る感じ という風に、日常の事物に対応づけて説明したりする文化が多く見受けられます。「タスクが次々と降ってくる状況をどう扱っていくか」というのは、日常生活を生きる人間にとっても、コンピュータ上の処理であっても自然に登場する普遍的な問題意識ですので、その最も基本的な思想であるところのスタックや
0. はじめに: 「数え上げ」という分野について 「条件を満たすものを数え上げる」タイプの問題にはパズルのような楽しさがあります。そのような問題のうち簡単なものは高校数学の「個数の処理・確率」で学ぶのですが、その先にも奥深い世界が待っています。 例: 数え上げテクニック集 (DEGwer さん) 例: 数え上げおねえさん (ERATO 湊離散構造処理系プロジェクト) 本記事では数え上げ問題を解くと度々登場する「写像12相」について整理します。写像12相の中でも特に高度なスターリング数と分割数をメインに取り上げます。これらのテーマが直接的に登場する問題はあまり多くはないですが、包除原理や動的計画法といった技法を学べる格好の題材です。簡単な部分についても重複組合せなどの教育的要素を多く含んでいます。 そんな事情もあって、chokudai さんも「競プロで使う基礎的な数学は写像12相がわかればと
0. はじめに 再帰関数は初めて学ぶときに壁になりがちで なんとなくわかった...けれど どんな場面で使えるのだろう...いい感じの例を探したい! という気持ちになりがちです。再帰関数は、なかなかその動きを直感的に想像することが難しいため、掴み所が無いと感じてしまいそうです。 そこで本記事では 再帰関数の動きを追いまくることで、再帰関数自体に慣れる 再帰的なアルゴリズムの実例に多数触れることで、世界を大きく広げる! ことを目標とします。特に「再帰関数がどういうものかはわかったけど、使いどころがわからない」という方のモヤモヤ感を少しでも晴らすことができたら嬉しいです。なお本記事では、ソースコード例に用いるプログラミング言語として C++ を用いておりますが、基本的にはプログラミング言語に依存しない部分についての解説を行っています。 追記 1. 再帰関数とは 再帰の意味はとても広いです。自分自
0. はじめに 最近では AtCoder がコーディング面接の文脈でも有効なものとしての認識が広まってきています。AtCoder の登竜門といわれる水色を目指すにあたって多くの方が「勉強した」と報告している代表的なアルゴリズム的手法の一つに累積和があります。 今回はそんな累積和をストレスなく機械的に書けるようになることを目標とします。累積和は、そのコンセプト自体は簡明で決して難しくないのですが、 添字の扱い方など、頭がゴッチャになりがちである 応用範囲が非常に広い ということから、整理する価値の高い手法です。僕自身、累積和を用いる問題に対して、毎回添字の扱いに神経を尖らせながら頑張っていたのですが、一度実装テンプレートを決め込んでしまえば何も考えなくても書けるようになりました。そうなってからは累積和を実装することにストレスが無くなりました。 そんな体験を共有できたらと思います。 1. 累積
Deleted articles cannot be recovered. Draft of this article would be also deleted. Are you sure you want to delete this article? はじめに、二部マッチングに関してこちらの記事を読んでいただければと思います。 実世界で超頻出!二部マッチング(輸送問題、ネットワークフロー問題)の解法を総整理! 早見表 二部グラフの最大マッチング、最小点被覆、最大安定集合、最小辺被覆についての結論を最初にまとめます。$|V|$ はグラフの頂点数、$|M|$ は最大マッチングのサイズです。 なお、本記事の内容のあらすじは簡単に以下のスライドにまとめました。 https://www.slideshare.net/drken1215/ss-86894312 1. はじめに グラフ上の最適化問
Deleted articles cannot be recovered. Draft of this article would be also deleted. Are you sure you want to delete this article? 特に名前のついていないテクニックが、名前がつくことで広く知れ渡って「典型」と化すことはよくあることと思います。競プロ界で俗に言う imos 法などはその代表例と言えます。桁 DP もその呼び名が固有名詞化したことで、smaller フラグを用いる考え方が普及したイメージです。 これに対して「部分文字列を走査する DP」のような名前のついていないテクニックは、なかなか典型と受け止められないイメージがあります。AUPC 2018 day3 北大セットの最終問題の解法も、この DP の考え方を知っていれば自然なものに思えます。本記事ではこの「
0. ゲームを解くとは 世の中には将棋や、囲碁や、オセロのような複雑で難しいゲームから、マルバツゲームや、割りばしゲームや、立体三目並べのような比較的単純なゲームまで、たくさんの種類のゲームがあります。 この種の二人プレイのボードゲームにはある共通の特徴があります。それは 双方が最善を尽くした場合において、「先手必勝」か「後手必勝」か「引き分け」かが予め決まっている。 そして無限の計算時間と計算機資源さえあれば、それを容易に解析できる。 という点です。このように 「先手必勝」か「後手必勝」か「引き分け」なのかを解析する その必勝手順を求める できれば + α として初期盤面だけでなく、すべての局面について「先手勝ち」か「後手勝ち」か「引き分け」かも特定して最善手も求める という営みが「ゲームを解く」ということであり1、それができたならばそのゲームを「完全に理解した」ということができます。本
0. はじめに 動的計画法超入門: Educational DP Contest の A ~ E 問題の解説と類題集 の続きです。DP ってなんだろうという方は先に上の記事を見ていただけたらと思います。それにしても、EDPC (Educational DP Cotest)、本当に素敵な DP 学習コンテンツが登場しましたね! 今回は F 〜 J 問題を扱います。DP は「最適化問題」に限らず 数え上げ問題 確率問題 期待値問題 などに対しても、適用できるということを学べるセットになっています。 F 問題 - LCS 【問題概要】 文字列 $s$ および $t$ が与えられます。 $s$ の部分列かつ $t$ の部分列であるような文字列のうち、最長のものをひとつ求めよ。 【制約】 $1 \le |s|, |t| \le 3000$ キーポイント index が二次元になった DP 復元 解法
Deleted articles cannot be recovered. Draft of this article would be also deleted. Are you sure you want to delete this article? 0. はじめに: 非常に素敵な DP の入門コンテンツ 待ちに待ったコンテストの到来です!!!!! DP (動的計画法) はアルゴリズムの登竜門というべき難所ですが、いくつか問題を解いて行くとパターンのようなものが見えて来ます。まさに「習うより慣れろ」の世界で、たくさん問題を解いて行くうちに、DP な問題の解法を一言で言えるようになって来ます。 典型を学ぶ方法論として、その最も典型的なシンプルな形をした問題をそのまま吸収してしまうのは 1 つの有効な方法だと思います。それにふさわしいシンプルな問題たちを集めた DP コンテストが先日開か
「他にこんなのがある」というのがあったら是非いっぱい教えてください! 歴史的に最も古くからある用途は「測量」でしょう。三角関数誕生のキッカケはまさに測量の必要性にありました。比較的日常生活でも見る機会がありそうな用途でしょうか。 ログハウス ケーキカット 震災時の家の傾き推定 現代では「波」としての用途が多いでしょうか。Twitter での様々な人のコメントを見ていても、 おっぱい関数 jpeg 画像 音声処理 といった具合に、波に関する話がかなり多いイメージです。これらの三角関数の使われ方を特集してみます。様々な分野に共通する三角関数の使い方のエッセンスを抽出したつもりですが、これでもかなり分量が多くなりました。摘み食いするような感覚で読んでいただけたら幸いです。 2. 三角関数の 3 つの顔 最初に三角関数には大きく 3 つの定義があったことを振り返っておきます。以下の記事にとてもよく
2. 共円定石 メジャーなものから超マイナーなものまで、九路盤定石をすべて公開します!!! 定石 0: 自明パターン 比較的自明な場合として 一直線上 (ルール) 長方形 等脚台形 が挙げられます。いずれも共円であることが自明なパターンですが、このうち等脚台形については、斜め 45 度の等脚台形に注意が必要です。しばしば見逃してしまいます。 余談ですが「斜め 45 度じゃない等脚台形」も一応あります。例えば下図は確かに等脚台形になっています!3 定石 1: 八角形 続いてこれも比較的わかりやすい八角形定石です。内角がすべて $135$ 度になっていて、対称性から共円になることが明快です。しかし右図のように 4 点だけを取り出すと、意外と指摘が難しいことがわかると思います。このような共円をほぼ確実に避けられるようになると脱初心者と言えるでしょう! 八角形定石のサイズにはバリエーションがあり、
株式会社NTTデータ数理システム (顧問)。アルゴリズムをはじめとしたコンピュータサイエンスの諸分野の啓蒙活動に従事。機械学習やアルゴリズムに関して面白いと思ったことを記事にしていきたいと思います。記事へのリンク等についてはお気軽にしていただいて大丈夫です。よろしくお願いします。 Follow
0. はじめに: クォータニオンについて思うこと はじめまして! NTTデータ数理システムで機械学習やアルゴリズムといった分野のリサーチャーをしている大槻 (通称、けんちょん) です。 本記事は、東京大学航空宇宙工学科/専攻 Advent Calendar 2018 の 3 日目の記事として書きました。僕は学部時代を工学部 航空宇宙工学科で過ごし、情報理工学系研究科 数理情報学専攻で修士取得後、現職に就いて数年になります。 航空宇宙時代は人工衛星の姿勢制御について関心を抱き、特に磁気センサや磁気トルカを用いた姿勢制御系について研究していました。数理工学へと分野を変えてからも、当時お世話になった先輩方と磁気トルカを用いた姿勢制御手法について共同研究して論文を書いたり、ディープラーニングなどを用いた画像認識技術を追求する過程ではリモートセンシングに関する話題ものぼったりなど、航空宇宙業界とは何
NTTデータ数理システムでアルゴリズムを探求している大槻 (通称、けんちょん) です。 好きなアルゴリズムは最小カットやマッチングですが、会社ではなぜか「動的計画法が好きな人」と呼ばれています。今回は動的計画法を用いて得られた最適解を復元するための汎用的な方法について紹介します。 0. はじめに 動的計画法を用いて効率的に解くことのできる最適化問題は数多くあります。パッと思いつくだけでも ナップサック問題 迷路などの最短路問題 区間スケジューリング問題 音声認識パターンマッチング問題 レーベンシュタイン距離 発電計画問題 分かち書き 隠れマルコフモデル ... などなど、多種多様な分野の問題を動的計画法によって効率よく解くことができます。このように、分野横断的な活用をできることが、動的計画法をはじめとした数理工学的手法の特長であり醍醐味であると常々感じています。今回は動的計画法によって得ら
これを見てわかることは、どの行を見ても「$1, 2, 3, 4, 5, 6$」の並び替えになっています。例えば $3$ の行を見ると ${\rm mod}. 7$ において $3 × 1 \equiv 3$ $3 × 2 \equiv 6$ $3 × 3 \equiv 2$ $3 × 4 \equiv 5$ $3 × 5 \equiv 1$ $3 × 6 \equiv 4$ となっています。実はこの性質は一般の素数 $p$ について、$1 × 1$ から $(p-1) × (p-1)$ までの掛け算表を書いても成立します。この性質は後で示すとして、まずはこの性質を用いて Fermat の小定理を導きます。 上記の性質から、$(3×1, 3×2, 3×3, 3×4, 3×5, 3×6)$ と $(1, 2, 3, 4, 5, 6)$ とは ${\rm mod}. 7$ では並び替えを除いて等
Deleted articles cannot be recovered. Draft of this article would be also deleted. Are you sure you want to delete this article? はじめに NTT データ数理システムでアルゴリズムの探求をしている大槻 (通称、けんちょん) です。最近のマイブームなアルゴリズムは NTT (Number-Theoretic Transform) です。 NTT は FFT (高速フーリエ変換) の亜種です。日本語では高速剰余変換と呼ばれることが多いです。FFT ではどうしても登場しがちな「計算途中での丸め誤差」を回避するテクニックとして有効です。NTT を実運用する際には以下のような楽しい初等整数論的トピックたちを使用することになってすごく面白いです。 ${\rm mod}. p$
1. なぜ 998244353 で割るのか? 最初はこのような設問を見るとぎょっとしてしまいますが、実はとても自然な問題設定です。 $998244353$ で割らないと、答えの桁数がとてつもなく大きくなってしまうことがあります。このとき以下のような問題が生じます: 多倍長整数がサポートされている言語とされていない言語とで有利不利が生じる 10000 桁にも及ぶような巨大な整数を扱うとなると計算時間が膨大にかかってしまう 1 番目の事情はプログラミングコンテストに特有のものと思えなくもないですが、2 番目の事情は切実です。整数の足し算や掛け算などを実施するとき、桁数があまりにも大きくなると桁数に応じた計算時間がかかってしまいます。実用的にもそのような巨大な整数を扱うときは、いくつかの素数で割ったあまりを計算しておいて、最後に中国剰余定理を適用して復元することも多いです。 なぜ 9982443
次のページ
このページを最初にブックマークしてみませんか?
『drken - Qiita』の新着エントリーを見る
j次のブックマーク
k前のブックマーク
lあとで読む
eコメント一覧を開く
oページを開く