SlideShare a Scribd company logo
1 of 47
Download to read offline
やさしい
整数論
by kyuridenamida(4年)
整数論ってなんだろう
• 数学の分野のひとつ
• 整数(…-2,-1,0,1,2,…)のみをあつかう分野
実数
整数
自然数
色のついた部分をあつかう!
中学校のときやったよね
• 最小公倍数
ex) 6と10の最小公倍数は30
• 最大公約数
ex) 6と10の最大公約数は2
• 整数論ではこういうのをあつかう
フェルマーの大定理
3 以上の自然数 n について、
xn + yn = zn となる
0でない自然数 (x, y, z) の組が存在しない
• 有名だよね?
• これとかも整数論であつかう
今回あつかう内容
• 約数とその性質
• 素数と素因数分解
• 最小公倍数・最大公約数
• それらに関するアルゴリズム
約数ってなんだろう
• 簡単にいうと、ある数を割りきれる数
ex) 10の約数は、1,2,5,10
• より厳密に、xがnの約数である条件とは、
n÷xの余りが0であること
(n%x==0だね)
約数の性質
• 約数は必ずペアを持つ
ex1) 10の約数 (1,10) (2,5)
ex2) 16の約数 (1,15) (2,8) (4,4)
• 基本的に約数の数はグウスウ個
• 平方数(1,4,9,16,…)とかだけは、
同じ数がペアになるからキスウ個
素数ってなんだろう
• 1でなく、1とその数自身で割り切れない正整数
ex) 2 3 5 7 11 13 17 19 23 29 …
• 約数の数がちょうど2個の正整数ともいえる
• 規則性がいまだに知られていない
• 多くの数学者の人生を棒にふったすごい数
素数にとりつかれた人々
素因数分解ってなんだろう
• 素因数分解とは、ある数を素因数(素数)の積
に分解すること
ex1) 30 = 2 * 3 * 5
ex2) 36 = 22 * 32
最大公約数ってなんだろう
• 最大公約数(GCD)というのは、2つの数の公約
数(共通の約数)のうち、最大のもの
ex) 30と12の公約数(1,2,3,4,6)
よって、最大公約数は6
• 出題例としては「30×12の長方形を、余りが出
ないようにできるだけ大きい同じ大きさの正方
形を取り出したとき、大きさはいくつか
→答え:6
最大公約数の求め方
• 人間がやる分には、2つの数を素因数分解し
たうえで、それぞれの素因数の小さい次数をと
りだしてとければよい
ex) 30 = 2 * 3 * 5
12 = 22 * 3
∴ GCD(30,12) = 21 * 31 * 50 = 6
最小公倍数ってなんだろう
• 最小公倍数(LCM)というのは、2つの数の倍数
のうち最小のもの
ex) 30と12の公倍数(60,120,180,…)
よって、最大公約数は60
• 出題例としては
「バスが30分おき,電車が12分おきにやってき
ます。今バスと電車が同時に発車しました。
次に同時に着くのは何分後ですか?」
→答え:60分後
最小公倍数の求め方
• 人間がやる分には、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)
素数判定アルゴリズム1(1)
• 素数判定をCプログラムで行うには?
→試し割りと呼ばれる手法(自明なやつ)がある
素数判定アルゴリズム1(2)
• 問題点がある。
• nが大きくなると、その大きさに比例した回数の
ループが必要である。(計算量O(n)である)
→おそい!
素数判定アルゴリズム2(1)
• 実は、√N以下の整数で割ってみたら素数か
分かる。(O(√N)で計算がだいぶ効率的に)
素数判定アルゴリズム2(2)
• なんで√N以下でいいんだろう
証明)
• 約数はかけたらNになるペアを持つ(自明)
ex)N=16 (1,16) , (2,8) , (4,4)
• 少なくともペアの片方は必ず√N以下
(両方√Nより大きかったらかけたらNこえちゃうからね)
• √N以下の約数をみれば、
対を逆算したらよく、全部の約数が判明
素数判定アルゴリズム2(3)
• 素数判定しろっていわれたら必ずO(√N)の試
し割りをするようにしましょう。
(絶対にO(N)はしないこと!)
• 効率的な確率的アルゴリズムが存在するが、
それは別の話。
• グチョクな方法では一番よい。
約数を列挙しよう(1)
• 素数判定を少しいじるだけだから、効率的な
ほうについて説明するよ。
約数を列挙しよう(2)
• ペアの片方をiとすれば、片方はn/iだよね。
ex) n=16 (i.n/i) = (1,16) (2,8) (4,4)
とつぜんだけど動的配列
• Cと同じ機能が使えて、さらに拡張されたもの
がC++です
• Cに慣れてきたみなさんはいますぐにC++に!
– 配列の長さを自由に決めれるvector
– 配列をソートしてくれるsort
– 文字列がめっちゃあつかいやすいstring
などなどすばらしい機能がもりだくさん!
素因数分解をしよう
• 2でできるだけ割って,3でできるだけ割って…
を小さいもん順にくり返せばよいだけ
最大公約数を求めよう
• 素因数分解してごにょごにょ。
これ実はプログラムで実装するのめんどい
• ユークリッドの互除法というすごいアルゴリズ
ムがある。(めちゃ速い)
• すごいけど古代からあるから学ぼう
ユークリッドの互除法(1)
• 手順を示す。
1. aをbで割った余りa%bを新しいaとする。
2. aとbを入れかえる
3. bが0になるまで1,2をくりかえす
4. そのときのaの値が最大公約数
互除法具体例(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が最大公約数(終わり)
互除法具体例図示(3)
• 次は、(a,b)=(26,12)のとき。これの処理を図示
すると、「できるだけ大きい正方形をとっていっ
たときの、最小の正方形がGCDとなる」
←――――――――――――――― 26 ―――――――――――――――→
←
―
―
―
―
1
2
―
―
―
―
→
互除法具体例図示(4)
• 12*12のでかい正方形をとって、取り除く
←
―
―
―
―
1
2
―
―
―
―
→
←―――――――――――――― 12*2 ―――――――――――――→←2→
互除法具体例図示(5)
• (a,b)=(2,12)になった。縦と横を回転して、同様
にして2*2の正方形を取り除く
←
―
―
―
―
1
2
―
―
―
―
→
←2→
12
2
互除法具体例図示(5)
• この結果、この1辺の長さ2が26と12の最大公
約数ということがわかった
互除法ソースコード(1)
• どうやって実装するのか?
互除法ソースコード(2)
• 入れかえる操作は再帰呼び出しと相性良い。
• 再帰を用いるとこうなる
ついでにa%bとbを入れかえている
互除法ソースコード(3)
• C言語には
(条件式) ? (真のときの値) : (偽のときの値)
という条件演算子と呼ばれる変な構文がある。
• それを用いるとこれだけ。
互除法の計算量(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)に対して、
フィボナッチ数列の逆関数くらい
互除法の計算量(2)
• 実はn番目の項Fnがこんなかんじの式で
• 指数で表されてる関数なので、大体
O( log min(a,b) ) たぶん…
• 素因数分解より圧倒的に速い
最小公倍数を求めよう
• 最大公約数を求める方法がわかった
• gcd(a,b)を実装したら
a*b/gcd(a,b)を計算するだけ!
• 本当はa/gcd(a,b)*bがコンピュータ
計算的にやさしいのでこちらを使うべき
おわり
ではない
小ネタ(切り上げの仕方)
• C言語なら、<math.h>ヘッダにceil(x)という実
数を切り上げる関数がある。
けど・・・
• a/bを切り上げた整数を計算したかったら、
{a+(b-1)}/bを整数で計算すればよい。
↑誤差の心配もなくおすすめ
小ネタ(二分探索) (1)
• 数学的には、単調関数(常に増えたり減った
り)の解を求めるときに使ったりする
ex) y=√x y=x3
小ネタ(二分探索) (2)
• 解が存在する区間が分かってて、それが単調
区間なら、半分ずつ調べて切り捨てたりして
精度を高めれる
例)
• √2を求めたい。(√2の具体的な値は不明)
• つまり、x=√2となるようなxを求める
x*x=2 (辺々二乗する)
がなりたつ。これを利用する
小ネタ(二分探索) (3)
• たとえば、解が0 <= x <= 2にいると仮定。
とりあえず中点であるx=1のときにx*xを計算す
ると、x*x < 2だから、少なくとも解は
1 <= x = 2
にあることが分かる。
次はx=1.5で同じことやるとx*x>2だから
1 <= x <= 1.5
小ネタ(二分探索) (4)
• 意味わからんと思うので図示しよう
• x2=2となるような正整数点xを求めるので、
解は少なくとも[0,2]にあることが分かりそう。
なので、初期段階で区間0<=x<=2のはんいを
調べればよい。
(まあ別に0 <= x <= 100とかでも
区間が単調ならいい)
小ネタ(二分探索) (5)
• 実装方法
• 収束条件はややこしいので定数回(100回くら
い)ループするのもおすすめ
小ネタ(二分探索) (6)
• 指数的に精度が上がっていくので高速
• 実はいろんなことに応用できるので実装しよう
• 単調性が成り立ってて、区間に解が存在して
れば、どんな複雑な式でも解を見つけれると
いうことが重要!
(ぶっちゃけxがあたえられて√xを求めるとか
<math.h>のsqrt()関数つかえばいい)
ほんとに
おわり

More Related Content

What's hot

AtCoder Regular Contest 042 解説
AtCoder Regular Contest 042 解説AtCoder Regular Contest 042 解説
AtCoder Regular Contest 042 解説AtCoder Inc.
 
AtCoder Regular Contest 021 解説
AtCoder Regular Contest 021 解説AtCoder Regular Contest 021 解説
AtCoder Regular Contest 021 解説AtCoder Inc.
 
指数時間アルゴリズム入門
指数時間アルゴリズム入門指数時間アルゴリズム入門
指数時間アルゴリズム入門Yoichi Iwata
 
AtCoder Regular Contest 039 解説
AtCoder Regular Contest 039 解説AtCoder Regular Contest 039 解説
AtCoder Regular Contest 039 解説AtCoder Inc.
 
AtCoder Beginner Contest 006 解説
AtCoder Beginner Contest 006 解説AtCoder Beginner Contest 006 解説
AtCoder Beginner Contest 006 解説AtCoder Inc.
 
Re永続データ構造が分からない人のためのスライド
Re永続データ構造が分からない人のためのスライドRe永続データ構造が分からない人のためのスライド
Re永続データ構造が分からない人のためのスライドMasaki Hara
 
AtCoder Regular Contest 022 解説
AtCoder Regular Contest 022 解説AtCoder Regular Contest 022 解説
AtCoder Regular Contest 022 解説AtCoder Inc.
 
AtCoder Beginner Contest 034 解説
AtCoder Beginner Contest 034 解説AtCoder Beginner Contest 034 解説
AtCoder Beginner Contest 034 解説AtCoder Inc.
 
AtCoder Beginner Contest 017 解説
AtCoder Beginner Contest 017 解説AtCoder Beginner Contest 017 解説
AtCoder Beginner Contest 017 解説AtCoder Inc.
 
AtCoder Regular Contest 048
AtCoder Regular Contest 048AtCoder Regular Contest 048
AtCoder Regular Contest 048AtCoder Inc.
 
最小カットを使って「燃やす埋める問題」を解く
最小カットを使って「燃やす埋める問題」を解く最小カットを使って「燃やす埋める問題」を解く
最小カットを使って「燃やす埋める問題」を解くshindannin
 
競技プログラミングにおけるコードの書き方とその利便性
競技プログラミングにおけるコードの書き方とその利便性競技プログラミングにおけるコードの書き方とその利便性
競技プログラミングにおけるコードの書き方とその利便性Hibiki Yamashiro
 

What's hot (20)

AtCoder Regular Contest 042 解説
AtCoder Regular Contest 042 解説AtCoder Regular Contest 042 解説
AtCoder Regular Contest 042 解説
 
abc032
abc032abc032
abc032
 
AtCoder Regular Contest 021 解説
AtCoder Regular Contest 021 解説AtCoder Regular Contest 021 解説
AtCoder Regular Contest 021 解説
 
指数時間アルゴリズム入門
指数時間アルゴリズム入門指数時間アルゴリズム入門
指数時間アルゴリズム入門
 
ARC#003D
ARC#003DARC#003D
ARC#003D
 
AtCoder Regular Contest 039 解説
AtCoder Regular Contest 039 解説AtCoder Regular Contest 039 解説
AtCoder Regular Contest 039 解説
 
動的計画法を極める!
動的計画法を極める!動的計画法を極める!
動的計画法を極める!
 
AtCoder Beginner Contest 006 解説
AtCoder Beginner Contest 006 解説AtCoder Beginner Contest 006 解説
AtCoder Beginner Contest 006 解説
 
Re永続データ構造が分からない人のためのスライド
Re永続データ構造が分からない人のためのスライドRe永続データ構造が分からない人のためのスライド
Re永続データ構造が分からない人のためのスライド
 
AtCoder Regular Contest 022 解説
AtCoder Regular Contest 022 解説AtCoder Regular Contest 022 解説
AtCoder Regular Contest 022 解説
 
Binary indexed tree
Binary indexed treeBinary indexed tree
Binary indexed tree
 
最大流 (max flow)
最大流 (max flow)最大流 (max flow)
最大流 (max flow)
 
arc047
arc047arc047
arc047
 
AtCoder Beginner Contest 034 解説
AtCoder Beginner Contest 034 解説AtCoder Beginner Contest 034 解説
AtCoder Beginner Contest 034 解説
 
AtCoder Beginner Contest 017 解説
AtCoder Beginner Contest 017 解説AtCoder Beginner Contest 017 解説
AtCoder Beginner Contest 017 解説
 
AtCoder Regular Contest 048
AtCoder Regular Contest 048AtCoder Regular Contest 048
AtCoder Regular Contest 048
 
最小カットを使って「燃やす埋める問題」を解く
最小カットを使って「燃やす埋める問題」を解く最小カットを使って「燃やす埋める問題」を解く
最小カットを使って「燃やす埋める問題」を解く
 
Abc009
Abc009Abc009
Abc009
 
全域木いろいろ
全域木いろいろ全域木いろいろ
全域木いろいろ
 
競技プログラミングにおけるコードの書き方とその利便性
競技プログラミングにおけるコードの書き方とその利便性競技プログラミングにおけるコードの書き方とその利便性
競技プログラミングにおけるコードの書き方とその利便性
 

More from Kazuma Mikami

パソコン甲子園 ケーキ屋
パソコン甲子園 ケーキ屋パソコン甲子園 ケーキ屋
パソコン甲子園 ケーキ屋Kazuma Mikami
 
マラソンマッチ 89 日記
マラソンマッチ 89 日記マラソンマッチ 89 日記
マラソンマッチ 89 日記Kazuma Mikami
 
文字列検索のいろいろ
文字列検索のいろいろ文字列検索のいろいろ
文字列検索のいろいろKazuma Mikami
 
セグツリーイメージ
セグツリーイメージセグツリーイメージ
セグツリーイメージKazuma Mikami
 
情報オリンピック夏合宿発表
情報オリンピック夏合宿発表情報オリンピック夏合宿発表
情報オリンピック夏合宿発表Kazuma Mikami
 
K2PC Div1 E 暗号化
K2PC Div1 E 暗号化K2PC Div1 E 暗号化
K2PC Div1 E 暗号化Kazuma Mikami
 

More from Kazuma Mikami (6)

パソコン甲子園 ケーキ屋
パソコン甲子園 ケーキ屋パソコン甲子園 ケーキ屋
パソコン甲子園 ケーキ屋
 
マラソンマッチ 89 日記
マラソンマッチ 89 日記マラソンマッチ 89 日記
マラソンマッチ 89 日記
 
文字列検索のいろいろ
文字列検索のいろいろ文字列検索のいろいろ
文字列検索のいろいろ
 
セグツリーイメージ
セグツリーイメージセグツリーイメージ
セグツリーイメージ
 
情報オリンピック夏合宿発表
情報オリンピック夏合宿発表情報オリンピック夏合宿発表
情報オリンピック夏合宿発表
 
K2PC Div1 E 暗号化
K2PC Div1 E 暗号化K2PC Div1 E 暗号化
K2PC Div1 E 暗号化
 

やさしい整数論