Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Sign up for free
Menu
Search
Features
All features
Private URLs
Password Protection
Custom URLS
Scheduled publishing
Remove Branding
Restrict embedding
Deck Collections
Notes
Features
All features
Private URLs
Password Protection
Custom URLS
Scheduled publishing
Remove Branding
Restrict embedding
Deck Collections
Notes
Explore
Featured decks
Featured speakers
Programming
Technology
Storyboards
Explore
Featured decks
Featured speakers
Programming
Technology
Storyboards
Pricing
Search
Sign in
Sign up for free
拡張ユークリッドの互除法の紹介
Search
matumoto
December 17, 2022
Technology
410
0
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
拡張ユークリッドの互除法の紹介
2022/12月に行われた部内LTでの発表資料です
イベントページはこちら
https://zli.connpass.com/event/268175/
matumoto
December 17, 2022
More Decks by matumoto
See All by matumoto
Go標準パッケージのI/O処理をながめる
matumoto
0
470
testingを眺める
matumoto
1
220
sync/v2 プロポーザルの 背景と sync.Pool について
matumoto
0
820
Goトランザクション処理
matumoto
1
93
いまいちどスライスの 挙動を見直してみる
matumoto
0
430
Go1.22のリリース予定の機能を見る
matumoto
0
93
GoのUnderlying typeについて
matumoto
0
250
Typed-nilについて
matumoto
0
390
GoのType Setsという概念
matumoto
0
62
Other Decks in Technology
See All in Technology
AIエージェントの一手は 誰も見ていない - Falco拡張OSS「Prempti」とeBPFで サーバーレス実行基盤を二層防御する
keitah
0
450
データ_AIの事業の勝敗をわけるもの
nek0128
1
470
AIエージェントの権限管理 3: Agentic RAG の Fine grained access control 編
ren8k
0
180
aws-iot-platform-architecture-use-cases.pdf
ma2shita
0
470
アプリログインとWeb認証基盤をつなぐ ASWebAuthenticationSession 作法
shimastripe
1
370
AIエージェントを最高のパートナーに育てる方法|評価と判断軸を育てる5つのステップ
koichiaoki
1
160
時うどん〜Socket.getifaddrsで学ぶネットワーク編 / Tokiudon: The Socket.getifaddrs Edition
coe401_
4
210
SREの視点で考えるSIEM活用術 〜AWS環境でのセキュリティ強化〜
cscengineer
PRO
0
140
SREは、MCPとAutopilotをこう使え!
kazumax55
3
940
Minecraft JavaのMODをSwiftで作る
1mash0
0
190
品質と信頼性を地続きにする
grimoh
2
900
俺の仕事は AIに奪われないし、たぶんその BIも要らない
hikaruri
0
530
Featured
See All Featured
Designing Experiences People Love
moore
143
24k
AI in Enterprises - Java and Open Source to the Rescue
ivargrimstad
0
1.5k
Un-Boring Meetings
codingconduct
0
420
Making the Leap to Tech Lead
cromwellryan
135
10k
Facilitating Awesome Meetings
lara
57
7.1k
Easily Structure & Communicate Ideas using Wireframe
afnizarnur
194
17k
What does AI have to do with Human Rights?
axbom
PRO
1
2.4k
Side Projects
sachag
456
43k
Statistics for Hackers
jakevdp
799
230k
The agentic SEO stack - context over prompts
schlessera
0
940
Performance Is Good for Brains [We Love Speed 2024]
tammyeverts
12
1.8k
Exploring anti-patterns in Rails
aemeredith
4
510
Transcript
拡張ユークリッドの互除法の 紹介 matumoto
• 学年:28期 • 所属:会津大学コンピュータ理工学部 • 今興味のある技術:vanilla-extract • 趣味: ◦ 競プロ,
Go, React,... ◦ ゲームしたり漫画読んだり ◦ Splatoon3にはまってます • Twitter:@matumoto_1234 matumoto 松本 響輝 自己紹介
拡張ユークリッドの互除法?
拡張ユークリッドの互除法って? • ユークリッドの互除法を拡張したやつ • なんかいろんなとこで出てくる ◦ extgcdとかって名前見たことない? ◦ mod 上での逆元を求めるとかもできる
• じゃあ、そもそもユークリッドの互除法って?
ユークリッドの互助法って? • ユークリッドの互除法(ユークリッドのごじょほう、 英: Euclidean Algorithm)は、2 つの自然数の最大公約数を求める手法の一つであ る。 (ユークリッドの互除法 -
Wikipedia より) • 2つの自然数a,bの最大公約数dを求める感じ • gcd(a, b) = d みたいな感じの関数はだいたいユークリッドの互除法が使われている ◦ gcd は greatest common devisor の略
ユークリッドの互助法って? • 実装はかなり簡単
ユークリッドの互助法って? • なにをしているのか? • 2 つの自然数 a, b (a ≧
b) について、a の b による剰余を r とすると、 a と b との最大公約数は b と r と の最大公約数に等しいという性質がある • それを利用して求めている • ※証明は省略
ユークリッドの互助法って? • 計算量は? • r = aをbで割ったあまり(a%b)とする 実は、r <= a/2
が成り立つ • よって、大雑把に見積もると およそ O(log max(a, b)) 回程度
改めて、拡張ユークリッドの互助法って? • じゃあ、改めて拡張ユークリッドの互助法はなにができるの? ax + by = gcd(a,b) なる(x,y)の組を求めることができる a,
b := 定数 gcd(a,b) := aとbの最大公約数 • 具体例 ◦ 111x+30y=3 なる(x,y)の組を求めよ ◦ 111x+30y=12 なる(x,y)の組を求めよ ▪ これも工夫すれば求められる
拡張ユークリッドの互助法の実装 • コードとしての結論から
拡張ユークリッドの互助法の実装 • なにをしているのか? • 基本的には、式変形をそのままコードにしてる • ここで注目なのが、extgcd(b, a%b, y, x)
(a, b) → (b, a%b) に変化している!!!! • (a,b)の遷移だったり計算量だったりは一緒
拡張ユークリッドの互助法の理論 • a = qb + r とおく。※ q =
floor(a/b), r = a%b ax + by = gcd(a,b) を式に代入すると、 (qb + r)x + by = gcd(a,b) qbx + rx + by = gcd(a,b) (qx + y)b +rx = gcd(a,b) となる。
拡張ユークリッドの互助法の理論 • 得られた式:(qx + y)b +rx = gcd(a,b) s=qx +
y t=x とおくと、 bs + rt = gcd(a,b) と表せる。 • ax + by = gcd(a,b) →bs + rt = gcd(a,b) になってる!(そうなるように変形した) ◦ (a, b) → (b, r) r = a % bなので、 (a, b) →(b, a%b)
拡張ユークリッドの互助法の理論 • あとは、(s, t) →(x, y) を求められればOK ◦ ax +
by = gcd(a,b)という問題が bs + rt = gcd(a,b) という小問題になったということは、解である (s, t)が求まったとき、(x, y) を求める必要がある ◦ 最初の状態→次の状態→さらに次の状態... ◦ (x,y)を求めたい→(s, t)を求めたい→(s’, t’)を求めたい... ◦ (x,y)を求めたい→(s, t)を求めたい→(s’, t’)が求まった! ◦ (x,y)を求めたい→(s, t)を求まった!→(s’, t’)が求まった! ◦ (x,y)を求まった!→(s, t)を求まった!→(s’, t’)が求まった!
拡張ユークリッドの互助法の理論 • x=t xは求まる。(t = xとおいたので) • s=qx+y とおいたのを利用すると、 s-qx=y
y=s-qx y=s-qt より、yも求まる。
理論をコードに • ax + by = gcd(a, b) →sb +
rt = gcd(s, t)となったとき、 s = qx + y, x = t を代入すると (qx + y)b +rx = gcd(a,b) となる。
理論をコードに • b == 0 のとき、なんで x = 1, y
= 0 なの? • ax + by = gcd(a, b) に b = 0 を代入すると、 ax = gcd(a, b) gcd(a, 0) = a なので、 ax = a よって、x = 1 y は数学的にはなんでも問題ない ※y = 0 とすると、|x| + |y| が最小になるらしい
理論をコードに
応用的な使いみち(本題)
あなたは突然 mod 上での逆元を 求めたくなりました
どう求めますか?
応用的な使いみち(本題) • フェルマーの小定理で求める方法 ◦ ◦ ちょっと制約が厳しい ◦ modの法が素数じゃないといけない • 実は、拡張ユークリッドの互除法を使って逆元を求められる
◦ フェルマーの小定理よりは制約が優しい
応用的な使いみち(本題) • 逆元ってそもそもなに? a * a^-1 ≡ 1 (mod m)
となる、a^-1 のこと • これを式変形する
応用的な使いみち(本題) • a * a^-1 ≡ 1 (mod m) a
* a^-1 - 1 ≡ 0 (mod m) a * a^-1 - 1 = m * n ←m の倍数 a * a^-1 + m * n = 1 x = a^-1, y = n とおくと,,,, a * x + m * y = 1 • つまり、ax + my = 1 = gcd(a, m) なる (x, y) を求めたとき、x がaの逆元
応用的な使いみち(本題) • 拡張ユークリッドの互除法で aの逆元(mod m)を求めるときの制約 ◦ ax + my =
1 = gcd(a, m) ◦ aとm が互いに素 ▪ 最大公約数が1なので • 応用的な使いみち おしまい
ありがとうございました