Submit Search
やさしい整数論
9 likes
•
8,411 views
Kazuma Mikami
間違いがいくつかあります。
Read more
1 of 47
Download now
Downloaded 18 times
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
Most read
16
17
18
19
20
21
22
23
24
25
26
Most read
27
28
29
30
31
32
33
34
35
36
37
38
Most read
39
40
41
42
43
44
45
46
47
More Related Content
What's hot
(20)
PDF
様々な全域木問題
tmaehara
PDF
AtCoder Beginner Contest 017 解説
AtCoder Inc.
PDF
二部グラフの最小点被覆と最大安定集合と最小辺被覆の求め方
Kensuke Otsuki
PDF
プログラミングコンテストでのデータ構造 2 ~動的木編~
Takuya Akiba
PDF
AtCoder Beginner Contest 025 解説
AtCoder Inc.
PDF
AtCoder Beginner Contest 006 解説
AtCoder Inc.
PDF
幾何コンテスト2013
Naoto Mizuno
PDF
AtCoder Beginner Contest 021 解説
AtCoder Inc.
PDF
Abc009
AtCoder Inc.
PDF
直交領域探索
okuraofvegetable
PDF
ユークリッド最小全域木
理玖 川崎
PPTX
AtCoder Beginner Contest 014 解説
AtCoder Inc.
PPTX
AtCoder Beginner Contest 002 解説
AtCoder Inc.
PPTX
AtCoder Beginner Contest 012 解説
AtCoder Inc.
PDF
平面グラフと交通ネットワークのアルゴリズム
Takuya Akiba
PDF
AtCoder Beginner Contest 022 解説
AtCoder Inc.
PDF
AtCoder Regular Contest 039 解説
AtCoder Inc.
PDF
勉強か?趣味か?人生か?―プログラミングコンテストとは
Takuya Akiba
PDF
文字列検索のいろいろ
Kazuma Mikami
PDF
計算量
Ken Ogura
様々な全域木問題
tmaehara
AtCoder Beginner Contest 017 解説
AtCoder Inc.
二部グラフの最小点被覆と最大安定集合と最小辺被覆の求め方
Kensuke Otsuki
プログラミングコンテストでのデータ構造 2 ~動的木編~
Takuya Akiba
AtCoder Beginner Contest 025 解説
AtCoder Inc.
AtCoder Beginner Contest 006 解説
AtCoder Inc.
幾何コンテスト2013
Naoto Mizuno
AtCoder Beginner Contest 021 解説
AtCoder Inc.
Abc009
AtCoder Inc.
直交領域探索
okuraofvegetable
ユークリッド最小全域木
理玖 川崎
AtCoder Beginner Contest 014 解説
AtCoder Inc.
AtCoder Beginner Contest 002 解説
AtCoder Inc.
AtCoder Beginner Contest 012 解説
AtCoder Inc.
平面グラフと交通ネットワークのアルゴリズム
Takuya Akiba
AtCoder Beginner Contest 022 解説
AtCoder Inc.
AtCoder Regular Contest 039 解説
AtCoder Inc.
勉強か?趣味か?人生か?―プログラミングコンテストとは
Takuya Akiba
文字列検索のいろいろ
Kazuma Mikami
計算量
Ken Ogura
やさしい整数論
1.
やさしい 整数論 by kyuridenamida(4年)
2.
整数論ってなんだろう • 数学の分野のひとつ • 整数(…-2,-1,0,1,2,…)のみをあつかう分野 実数 整数 自然数 色のついた部分をあつかう!
3.
中学校のときやったよね • 最小公倍数 ex) 6と10の最小公倍数は30 •
最大公約数 ex) 6と10の最大公約数は2 • 整数論ではこういうのをあつかう
4.
フェルマーの大定理 3 以上の自然数 n
について、 xn + yn = zn となる 0でない自然数 (x, y, z) の組が存在しない • 有名だよね? • これとかも整数論であつかう
5.
今回あつかう内容 • 約数とその性質 • 素数と素因数分解 •
最小公倍数・最大公約数 • それらに関するアルゴリズム
6.
約数ってなんだろう • 簡単にいうと、ある数を割りきれる数 ex) 10の約数は、1,2,5,10 •
より厳密に、xがnの約数である条件とは、 n÷xの余りが0であること (n%x==0だね)
7.
約数の性質 • 約数は必ずペアを持つ ex1) 10の約数
(1,10) (2,5) ex2) 16の約数 (1,15) (2,8) (4,4) • 基本的に約数の数はグウスウ個 • 平方数(1,4,9,16,…)とかだけは、 同じ数がペアになるからキスウ個
8.
素数ってなんだろう • 1でなく、1とその数自身で割り切れない正整数 ex) 2
3 5 7 11 13 17 19 23 29 … • 約数の数がちょうど2個の正整数ともいえる • 規則性がいまだに知られていない • 多くの数学者の人生を棒にふったすごい数
9.
素数にとりつかれた人々
10.
素因数分解ってなんだろう • 素因数分解とは、ある数を素因数(素数)の積 に分解すること ex1) 30
= 2 * 3 * 5 ex2) 36 = 22 * 32
11.
最大公約数ってなんだろう • 最大公約数(GCD)というのは、2つの数の公約 数(共通の約数)のうち、最大のもの ex) 30と12の公約数(1,2,3,4,6) よって、最大公約数は6 •
出題例としては「30×12の長方形を、余りが出 ないようにできるだけ大きい同じ大きさの正方 形を取り出したとき、大きさはいくつか →答え:6
12.
最大公約数の求め方 • 人間がやる分には、2つの数を素因数分解し たうえで、それぞれの素因数の小さい次数をと りだしてとければよい ex) 30
= 2 * 3 * 5 12 = 22 * 3 ∴ GCD(30,12) = 21 * 31 * 50 = 6
13.
最小公倍数ってなんだろう • 最小公倍数(LCM)というのは、2つの数の倍数 のうち最小のもの ex) 30と12の公倍数(60,120,180,…) よって、最大公約数は60 •
出題例としては 「バスが30分おき,電車が12分おきにやってき ます。今バスと電車が同時に発車しました。 次に同時に着くのは何分後ですか?」 →答え:60分後
14.
最小公倍数の求め方 • 人間がやる分には、2つの数を素因数分解し たうえで、それぞれの素因数の大きい次数をと りだしてとければよい ex) 30
= 2 * 3 * 5 12 = 22 * 3 ∴ GCD(30,12) = 22 * 31 * 5 = 60 • 2つの数a,bの最大公約数(GCD)が 分かっていたら LCM(a,b) = a * b / GCD(a,b)
15.
素数判定アルゴリズム1(1) • 素数判定をCプログラムで行うには? →試し割りと呼ばれる手法(自明なやつ)がある
16.
素数判定アルゴリズム1(2) • 問題点がある。 • nが大きくなると、その大きさに比例した回数の ループが必要である。(計算量O(n)である) →おそい!
17.
素数判定アルゴリズム2(1) • 実は、√N以下の整数で割ってみたら素数か 分かる。(O(√N)で計算がだいぶ効率的に)
18.
素数判定アルゴリズム2(2) • なんで√N以下でいいんだろう 証明) • 約数はかけたらNになるペアを持つ(自明) ex)N=16
(1,16) , (2,8) , (4,4) • 少なくともペアの片方は必ず√N以下 (両方√Nより大きかったらかけたらNこえちゃうからね) • √N以下の約数をみれば、 対を逆算したらよく、全部の約数が判明
19.
素数判定アルゴリズム2(3) • 素数判定しろっていわれたら必ずO(√N)の試 し割りをするようにしましょう。 (絶対にO(N)はしないこと!) • 効率的な確率的アルゴリズムが存在するが、 それは別の話。 •
グチョクな方法では一番よい。
20.
約数を列挙しよう(1) • 素数判定を少しいじるだけだから、効率的な ほうについて説明するよ。
21.
約数を列挙しよう(2) • ペアの片方をiとすれば、片方はn/iだよね。 ex) n=16
(i.n/i) = (1,16) (2,8) (4,4)
22.
とつぜんだけど動的配列 • Cと同じ機能が使えて、さらに拡張されたもの がC++です • Cに慣れてきたみなさんはいますぐにC++に! –
配列の長さを自由に決めれるvector – 配列をソートしてくれるsort – 文字列がめっちゃあつかいやすいstring などなどすばらしい機能がもりだくさん!
23.
素因数分解をしよう • 2でできるだけ割って,3でできるだけ割って… を小さいもん順にくり返せばよいだけ
24.
最大公約数を求めよう • 素因数分解してごにょごにょ。 これ実はプログラムで実装するのめんどい • ユークリッドの互除法というすごいアルゴリズ ムがある。(めちゃ速い) •
すごいけど古代からあるから学ぼう
25.
ユークリッドの互除法(1) • 手順を示す。 1. aをbで割った余りa%bを新しいaとする。 2.
aとbを入れかえる 3. bが0になるまで1,2をくりかえす 4. そのときのaの値が最大公約数
26.
互除法具体例(2) • 今、(a,b)=(30,18)である。 1. a%b=12なので(a,b)=(12,18)となる。 2.
aとbを入れかえ、(a,b)=(18,12) 3. a%b=6なので(a,b)=(6,18)となる。 4. aとbを入れかえ、(a,b)=(18,6) 5. a%b=0なので、(a,b)=(0,6) 6. aとbを入れかえ、(a,b)=(6,0) 7. b=0なので、a=6が最大公約数(終わり)
27.
互除法具体例図示(3) • 次は、(a,b)=(26,12)のとき。これの処理を図示 すると、「できるだけ大きい正方形をとっていっ たときの、最小の正方形がGCDとなる」 ←――――――――――――――― 26
―――――――――――――――→ ← ― ― ― ― 1 2 ― ― ― ― →
28.
互除法具体例図示(4) • 12*12のでかい正方形をとって、取り除く ← ― ― ― ― 1 2 ― ― ― ― → ←―――――――――――――― 12*2
―――――――――――――→←2→
29.
互除法具体例図示(5) • (a,b)=(2,12)になった。縦と横を回転して、同様 にして2*2の正方形を取り除く ← ― ― ― ― 1 2 ― ― ― ― → ←2→ 12 2
30.
互除法具体例図示(5) • この結果、この1辺の長さ2が26と12の最大公 約数ということがわかった
31.
互除法ソースコード(1) • どうやって実装するのか?
32.
互除法ソースコード(2) • 入れかえる操作は再帰呼び出しと相性良い。 • 再帰を用いるとこうなる ついでにa%bとbを入れかえている
33.
互除法ソースコード(3) • C言語には (条件式) ?
(真のときの値) : (偽のときの値) という条件演算子と呼ばれる変な構文がある。 • それを用いるとこれだけ。
34.
互除法の計算量(1) • フィボナッチ数列というものがある 最初の2項は1で、3項目から直前の2項の和 1 1
2 3 5 8 13 21 34 55 … • 互除法の最悪ケースは、フィボナッチ数列の となり合う項同士がa,bのとき ex) a=55,b=34 • 計算量はmin(a,b)に対して、 フィボナッチ数列の逆関数くらい
35.
互除法の計算量(2) • 実はn番目の項Fnがこんなかんじの式で • 指数で表されてる関数なので、大体 O(
log min(a,b) ) たぶん… • 素因数分解より圧倒的に速い
36.
最小公倍数を求めよう • 最大公約数を求める方法がわかった • gcd(a,b)を実装したら a*b/gcd(a,b)を計算するだけ! •
本当はa/gcd(a,b)*bがコンピュータ 計算的にやさしいのでこちらを使うべき
37.
おわり
38.
ではない
39.
小ネタ(切り上げの仕方) • C言語なら、<math.h>ヘッダにceil(x)という実 数を切り上げる関数がある。 けど・・・ • a/bを切り上げた整数を計算したかったら、 {a+(b-1)}/bを整数で計算すればよい。 ↑誤差の心配もなくおすすめ
40.
小ネタ(二分探索) (1) • 数学的には、単調関数(常に増えたり減った り)の解を求めるときに使ったりする ex)
y=√x y=x3
41.
小ネタ(二分探索) (2) • 解が存在する区間が分かってて、それが単調 区間なら、半分ずつ調べて切り捨てたりして 精度を高めれる 例) •
√2を求めたい。(√2の具体的な値は不明) • つまり、x=√2となるようなxを求める x*x=2 (辺々二乗する) がなりたつ。これを利用する
42.
小ネタ(二分探索) (3) • たとえば、解が0
<= x <= 2にいると仮定。 とりあえず中点であるx=1のときにx*xを計算す ると、x*x < 2だから、少なくとも解は 1 <= x = 2 にあることが分かる。 次はx=1.5で同じことやるとx*x>2だから 1 <= x <= 1.5
43.
小ネタ(二分探索) (4) • 意味わからんと思うので図示しよう •
x2=2となるような正整数点xを求めるので、 解は少なくとも[0,2]にあることが分かりそう。 なので、初期段階で区間0<=x<=2のはんいを 調べればよい。 (まあ別に0 <= x <= 100とかでも 区間が単調ならいい)
45.
小ネタ(二分探索) (5) • 実装方法 •
収束条件はややこしいので定数回(100回くら い)ループするのもおすすめ
46.
小ネタ(二分探索) (6) • 指数的に精度が上がっていくので高速 •
実はいろんなことに応用できるので実装しよう • 単調性が成り立ってて、区間に解が存在して れば、どんな複雑な式でも解を見つけれると いうことが重要! (ぶっちゃけxがあたえられて√xを求めるとか <math.h>のsqrt()関数つかえばいい)
47.
ほんとに おわり
Download