SlideShare a Scribd company logo
1 of 11
Download to read offline
行列プロが教える
競技プログラミングでの線型方程式系




    前原 貴憲 (@tmaehara)
線型方程式系

入力:n × n 行列 A,ベクトル b

出力:以下を満たすベクトル x

               Ax = b

標準的な解法:ピボット選択つき Gauss 消去法(LUP 分解)

競技プログラミングでは

→   Givens 消去法(QR 分解)がオススメ
                          かもしれない

                             1/ 10
説明




     2/ 10
普通の Gauss 消去法(LU 分解)
for i = 1, . . . , n: /* 前進消去 */
   for i′ = i + 1, . . . , n:
      α := A[i′ , i]/A[i, i]
      b[i′ ] ← b[i′ ] − αb[j]
      for j = i, . . . , n:
         A[i′ , j] ← A[i′ , j] − αA[i, j]
for i = n, . . . , 1: /* 交代代入 */
   for j = i + 1, . . . , n:
      bij] ← b[j] − A[i, j]b[j]
   b[i] ← b[i]/A[i, i]


                                            3/ 10
ピボット選択つき Gauss 消去法(LUP 分解)
計算中に A[i, i] が小さくなって精度悪化(or ゼロ割)
⇒ 普通は行ピボット選択で対応
 ※行ピボット選択つき Gauss は理論上不安定だが,
  破綻例を作るのは相当大変(良い例を作ると論文)


ここでは実装量的に Givens 消去法での対応をオススメ
 - Givens 消去法 = 2 × 2 回転で掃き出す Gauss 消去法
 - 計算時間:ピボット選択つき Gauss より少し遅い
 - 数値安定性:非常に高(回転は誤差を拡大しない)
ピボット選択が不要なので,実装が非常にシンプルになる
                   (see: 次ページ)
                                     4/ 10
Givens 消去法(QR 分解)
for i = 1, . . . , n: /* 前進消去 */
   for i′ = i + 1, . . . , n:
      MAKEROT(A[i, i], A[i′ , i], c, s);
      ROT(b[i], b[i′ ], c, s);
      for j = i + 1, . . . , n:
         ROT(A[i, j], A[i′ , j], c, s);
for i = n, . . . , 1: /* 交代代入 */
   for j = i + 1, . . . , n:
      b[i] ← b[i] − A[i, j]b[j]
   b[i] ← b[i]/A[i, i]

    ピボット選択なしの Gauss 消去法と同じ手続き
                                           5/ 10
MAKEROT / ROT
#define MAKEROT(x, y, c, s) 
       √
 { r = x2 + y 2 ; c = x/r; s = y/r; }
= 以下を満たす c, [ の計算 [ ]
             s    ]     [ ]
               c s x     r
                      =
             −s c y      0

#define ROT(x, y, c, s) 
 { u = cx + sy; v = −sx + cy; x = u; y = v; }
= 以下の計算の適用 ]
         [     [     ][ ]
          x       c s x
             ←
           y     −s c y

                                            6/ 10
QR 分解 補足
             A = QR   (Q : 直交, : 上三角)
                              R

☆ QR 法のよくある計算方法

• Gram-Schmidt の直交化
 数値不安定なので,基本的に使ってはいけない

• Householder 変換
 数値安定かつ早いので線型計算の教科書はこれを説明

• Givens 回転(今回紹介)
  数値安定だが Householder より遅いので説明されない
 しかし,実装が超シンプルになるので競プロ向き!

                                        7/ 10
参考




     8/ 10
参考:Gauss が破綻する例(Wilkinson 行列)
                          
              1   0  0    1
            −1   1  0    1
          A=
            −1
                            
                  −1 1    1
             −1   −1 −1   1


- Gauss 消去法をすると一番右の列が指数的に増加
- LU 分解の代わりに UL 分解するとうまくいく
   (LU・UL 両方が破綻する例の存在は open problem)

- 行・列両方をピボットする Gauss は,常にうまくいく


                                   9/ 10
参考:なにをやってもダメな例(Hilbert 行列)
                            
            1/1   1/2 1/3 1/4
          1/2    1/3 1/4 1/5
        A=
          1/3
                              
                  1/4 1/5 1/6
            1/4   1/5 1/6 1/7

- 線型方程式の条件数:cond(A) := ∥A−1 ∥∥A∥
      (条件数 ≃ 誤差の拡大率)

- 条件数が大きいと,何をやってもだいたい無理
⇒ 競プロでは,この手の入力は考えなくて良い



                                   10/ 10

More Related Content

What's hot

What's hot (20)

DDPC 2016 予選 解説
DDPC 2016 予選 解説DDPC 2016 予選 解説
DDPC 2016 予選 解説
 
様々な全域木問題
様々な全域木問題様々な全域木問題
様々な全域木問題
 
AtCoder Regular Contest 044 解説
AtCoder Regular Contest 044 解説AtCoder Regular Contest 044 解説
AtCoder Regular Contest 044 解説
 
双対性
双対性双対性
双対性
 
AtCoder Regular Contest 035 解説
AtCoder Regular Contest 035 解説AtCoder Regular Contest 035 解説
AtCoder Regular Contest 035 解説
 
Amortize analysis of Deque with 2 Stack
Amortize analysis of Deque with 2 StackAmortize analysis of Deque with 2 Stack
Amortize analysis of Deque with 2 Stack
 
abc032
abc032abc032
abc032
 
AtCoder Regular Contest 026 解説
AtCoder Regular Contest 026 解説AtCoder Regular Contest 026 解説
AtCoder Regular Contest 026 解説
 
LCA and RMQ ~簡潔もあるよ!~
LCA and RMQ ~簡潔もあるよ!~LCA and RMQ ~簡潔もあるよ!~
LCA and RMQ ~簡潔もあるよ!~
 
図と実装で理解する『木構造入門』
図と実装で理解する『木構造入門』図と実装で理解する『木構造入門』
図と実装で理解する『木構造入門』
 
abc027
abc027abc027
abc027
 
ウェーブレット木の世界
ウェーブレット木の世界ウェーブレット木の世界
ウェーブレット木の世界
 
Donutsプロコンチャレンジ 2015 解説
Donutsプロコンチャレンジ 2015 解説Donutsプロコンチャレンジ 2015 解説
Donutsプロコンチャレンジ 2015 解説
 
ユークリッド最小全域木
ユークリッド最小全域木ユークリッド最小全域木
ユークリッド最小全域木
 
AtCoder Regular Contest 030 解説
AtCoder Regular Contest 030 解説AtCoder Regular Contest 030 解説
AtCoder Regular Contest 030 解説
 
色々なダイクストラ高速化
色々なダイクストラ高速化色々なダイクストラ高速化
色々なダイクストラ高速化
 
Indeedなう B日程 解説
Indeedなう B日程 解説Indeedなう B日程 解説
Indeedなう B日程 解説
 
AtCoder Beginner Contest 013 解説
AtCoder Beginner Contest 013 解説AtCoder Beginner Contest 013 解説
AtCoder Beginner Contest 013 解説
 
AtCoder Beginner Contest 021 解説
AtCoder Beginner Contest 021 解説AtCoder Beginner Contest 021 解説
AtCoder Beginner Contest 021 解説
 
AtCoder Regular Contest 022 解説
AtCoder Regular Contest 022 解説AtCoder Regular Contest 022 解説
AtCoder Regular Contest 022 解説
 

Viewers also liked

simultaneous block diagonalization of matrices
simultaneous block diagonalization of matricessimultaneous block diagonalization of matrices
simultaneous block diagonalization of matrices
tmaehara
 
素数判定法
素数判定法素数判定法
素数判定法
DEGwer
 
文字列検索のいろいろ
文字列検索のいろいろ文字列検索のいろいろ
文字列検索のいろいろ
Kazuma Mikami
 
クリプタン帝国の暗号文を解読しよう(問1)
クリプタン帝国の暗号文を解読しよう(問1)クリプタン帝国の暗号文を解読しよう(問1)
クリプタン帝国の暗号文を解読しよう(問1)
tmaehara
 
2011年10月7日
2011年10月7日2011年10月7日
2011年10月7日
nukaemon
 
クリプタン帝国の暗号文を解読しよう(問1)
クリプタン帝国の暗号文を解読しよう(問1)クリプタン帝国の暗号文を解読しよう(問1)
クリプタン帝国の暗号文を解読しよう(問1)
tmaehara
 

Viewers also liked (20)

部内勉強会 数え上げの基礎
部内勉強会 数え上げの基礎部内勉強会 数え上げの基礎
部内勉強会 数え上げの基礎
 
simultaneous block diagonalization of matrices
simultaneous block diagonalization of matricessimultaneous block diagonalization of matrices
simultaneous block diagonalization of matrices
 
素数判定法
素数判定法素数判定法
素数判定法
 
ARC#003D
ARC#003DARC#003D
ARC#003D
 
競技プログラミングにおけるMajorization
競技プログラミングにおけるMajorization競技プログラミングにおけるMajorization
競技プログラミングにおけるMajorization
 
文字列検索のいろいろ
文字列検索のいろいろ文字列検索のいろいろ
文字列検索のいろいろ
 
やさしい整数論
やさしい整数論やさしい整数論
やさしい整数論
 
Pythonではじめる競技プログラミング
Pythonではじめる競技プログラミングPythonではじめる競技プログラミング
Pythonではじめる競技プログラミング
 
クリプタン帝国の暗号文を解読しよう(問1)
クリプタン帝国の暗号文を解読しよう(問1)クリプタン帝国の暗号文を解読しよう(問1)
クリプタン帝国の暗号文を解読しよう(問1)
 
2011年10月7日
2011年10月7日2011年10月7日
2011年10月7日
 
Indeedなう A日程 解説
Indeedなう A日程 解説Indeedなう A日程 解説
Indeedなう A日程 解説
 
Palindromic tree
Palindromic treePalindromic tree
Palindromic tree
 
アルゴリズムとデータ構造(初歩)
アルゴリズムとデータ構造(初歩)アルゴリズムとデータ構造(初歩)
アルゴリズムとデータ構造(初歩)
 
クリプタン帝国の暗号文を解読しよう(問1)
クリプタン帝国の暗号文を解読しよう(問1)クリプタン帝国の暗号文を解読しよう(問1)
クリプタン帝国の暗号文を解読しよう(問1)
 
Slide
SlideSlide
Slide
 
yukicoder : No.195 フィボナッチ数列の理解(2)
yukicoder : No.195 フィボナッチ数列の理解(2)yukicoder : No.195 フィボナッチ数列の理解(2)
yukicoder : No.195 フィボナッチ数列の理解(2)
 
動的計画法入門(An introduction to Dynamic Programming)
動的計画法入門(An introduction to Dynamic Programming)動的計画法入門(An introduction to Dynamic Programming)
動的計画法入門(An introduction to Dynamic Programming)
 
20160620 競技プログラミングのすゝめ
20160620 競技プログラミングのすゝめ20160620 競技プログラミングのすゝめ
20160620 競技プログラミングのすゝめ
 
yukicoder : No.269 見栄っ張りの募金活動
yukicoder : No.269 見栄っ張りの募金活動yukicoder : No.269 見栄っ張りの募金活動
yukicoder : No.269 見栄っ張りの募金活動
 
ICPC国内予選F解説
ICPC国内予選F解説ICPC国内予選F解説
ICPC国内予選F解説
 

Similar to 競技プログラミングでの線型方程式系

パターン認識 第12章 正則化とパス追跡アルゴリズム
パターン認識 第12章 正則化とパス追跡アルゴリズムパターン認識 第12章 正則化とパス追跡アルゴリズム
パターン認識 第12章 正則化とパス追跡アルゴリズム
Miyoshi Yuya
 
GPUによる多倍長整数乗算の高速化手法の提案とその評価
GPUによる多倍長整数乗算の高速化手法の提案とその評価GPUによる多倍長整数乗算の高速化手法の提案とその評価
GPUによる多倍長整数乗算の高速化手法の提案とその評価
Koji Kitano
 
UTPC2012 - K
UTPC2012 - KUTPC2012 - K
UTPC2012 - K
omeometo
 
2011年11月11日
2011年11月11日2011年11月11日
2011年11月11日
nukaemon
 
Introduction to Algorithms#24 Shortest-Paths Problem
Introduction to Algorithms#24 Shortest-Paths ProblemIntroduction to Algorithms#24 Shortest-Paths Problem
Introduction to Algorithms#24 Shortest-Paths Problem
Naoya Ito
 

Similar to 競技プログラミングでの線型方程式系 (20)

パターン認識 第12章 正則化とパス追跡アルゴリズム
パターン認識 第12章 正則化とパス追跡アルゴリズムパターン認識 第12章 正則化とパス追跡アルゴリズム
パターン認識 第12章 正則化とパス追跡アルゴリズム
 
第15回 配信講義 計算科学技術特論B(2022)
第15回 配信講義 計算科学技術特論B(2022)第15回 配信講義 計算科学技術特論B(2022)
第15回 配信講義 計算科学技術特論B(2022)
 
画像からの倍率色収差の自動推定補正
画像からの倍率色収差の自動推定補正画像からの倍率色収差の自動推定補正
画像からの倍率色収差の自動推定補正
 
optimal Ate pairing
optimal Ate pairingoptimal Ate pairing
optimal Ate pairing
 
GPUによる多倍長整数乗算の高速化手法の提案とその評価
GPUによる多倍長整数乗算の高速化手法の提案とその評価GPUによる多倍長整数乗算の高速化手法の提案とその評価
GPUによる多倍長整数乗算の高速化手法の提案とその評価
 
暗号技術の実装と数学
暗号技術の実装と数学暗号技術の実装と数学
暗号技術の実装と数学
 
UTPC2012 - K
UTPC2012 - KUTPC2012 - K
UTPC2012 - K
 
A Brief Survey of Schrödinger Bridge (Part I)
A Brief Survey of Schrödinger Bridge (Part I)A Brief Survey of Schrödinger Bridge (Part I)
A Brief Survey of Schrödinger Bridge (Part I)
 
Sized Linear Algebra Package のチュートリアル
Sized Linear Algebra Package のチュートリアルSized Linear Algebra Package のチュートリアル
Sized Linear Algebra Package のチュートリアル
 
多チャンネルバイラテラルフィルタの高速化
多チャンネルバイラテラルフィルタの高速化多チャンネルバイラテラルフィルタの高速化
多チャンネルバイラテラルフィルタの高速化
 
クラシックな機械学習の入門 6. 最適化と学習アルゴリズム
クラシックな機械学習の入門  6. 最適化と学習アルゴリズムクラシックな機械学習の入門  6. 最適化と学習アルゴリズム
クラシックな機械学習の入門 6. 最適化と学習アルゴリズム
 
PRML復々習レーン#9 6.3-6.3.1
PRML復々習レーン#9 6.3-6.3.1PRML復々習レーン#9 6.3-6.3.1
PRML復々習レーン#9 6.3-6.3.1
 
PRML第6章「カーネル法」
PRML第6章「カーネル法」PRML第6章「カーネル法」
PRML第6章「カーネル法」
 
El text.tokuron a(2019).yamamoto190620
El text.tokuron a(2019).yamamoto190620El text.tokuron a(2019).yamamoto190620
El text.tokuron a(2019).yamamoto190620
 
Deep learning basics described
Deep learning basics describedDeep learning basics described
Deep learning basics described
 
2011年11月11日
2011年11月11日2011年11月11日
2011年11月11日
 
Introduction to Algorithms#24 Shortest-Paths Problem
Introduction to Algorithms#24 Shortest-Paths ProblemIntroduction to Algorithms#24 Shortest-Paths Problem
Introduction to Algorithms#24 Shortest-Paths Problem
 
統計的学習の基礎 5章前半(~5.6)
統計的学習の基礎 5章前半(~5.6)統計的学習の基礎 5章前半(~5.6)
統計的学習の基礎 5章前半(~5.6)
 
140628理論談話会
140628理論談話会140628理論談話会
140628理論談話会
 
競技プログラミング練習会2015 Normal 第3回
競技プログラミング練習会2015 Normal 第3回競技プログラミング練習会2015 Normal 第3回
競技プログラミング練習会2015 Normal 第3回
 

競技プログラミングでの線型方程式系

  • 2. 線型方程式系 入力:n × n 行列 A,ベクトル b 出力:以下を満たすベクトル x Ax = b 標準的な解法:ピボット選択つき Gauss 消去法(LUP 分解) 競技プログラミングでは → Givens 消去法(QR 分解)がオススメ かもしれない 1/ 10
  • 3. 説明 2/ 10
  • 4. 普通の Gauss 消去法(LU 分解) for i = 1, . . . , n: /* 前進消去 */ for i′ = i + 1, . . . , n: α := A[i′ , i]/A[i, i] b[i′ ] ← b[i′ ] − αb[j] for j = i, . . . , n: A[i′ , j] ← A[i′ , j] − αA[i, j] for i = n, . . . , 1: /* 交代代入 */ for j = i + 1, . . . , n: bij] ← b[j] − A[i, j]b[j] b[i] ← b[i]/A[i, i] 3/ 10
  • 5. ピボット選択つき Gauss 消去法(LUP 分解) 計算中に A[i, i] が小さくなって精度悪化(or ゼロ割) ⇒ 普通は行ピボット選択で対応 ※行ピボット選択つき Gauss は理論上不安定だが,  破綻例を作るのは相当大変(良い例を作ると論文) ここでは実装量的に Givens 消去法での対応をオススメ - Givens 消去法 = 2 × 2 回転で掃き出す Gauss 消去法 - 計算時間:ピボット選択つき Gauss より少し遅い - 数値安定性:非常に高(回転は誤差を拡大しない) ピボット選択が不要なので,実装が非常にシンプルになる (see: 次ページ) 4/ 10
  • 6. Givens 消去法(QR 分解) for i = 1, . . . , n: /* 前進消去 */ for i′ = i + 1, . . . , n: MAKEROT(A[i, i], A[i′ , i], c, s); ROT(b[i], b[i′ ], c, s); for j = i + 1, . . . , n: ROT(A[i, j], A[i′ , j], c, s); for i = n, . . . , 1: /* 交代代入 */ for j = i + 1, . . . , n: b[i] ← b[i] − A[i, j]b[j] b[i] ← b[i]/A[i, i] ピボット選択なしの Gauss 消去法と同じ手続き 5/ 10
  • 7. MAKEROT / ROT #define MAKEROT(x, y, c, s) √ { r = x2 + y 2 ; c = x/r; s = y/r; } = 以下を満たす c, [ の計算 [ ] s ] [ ] c s x r = −s c y 0 #define ROT(x, y, c, s) { u = cx + sy; v = −sx + cy; x = u; y = v; } = 以下の計算の適用 ] [ [ ][ ] x c s x ← y −s c y 6/ 10
  • 8. QR 分解 補足 A = QR (Q : 直交, : 上三角) R ☆ QR 法のよくある計算方法 • Gram-Schmidt の直交化 数値不安定なので,基本的に使ってはいけない • Householder 変換 数値安定かつ早いので線型計算の教科書はこれを説明 • Givens 回転(今回紹介) 数値安定だが Householder より遅いので説明されない しかし,実装が超シンプルになるので競プロ向き! 7/ 10
  • 9. 参考 8/ 10
  • 10. 参考:Gauss が破綻する例(Wilkinson 行列)   1 0 0 1 −1 1 0 1 A= −1  −1 1 1 −1 −1 −1 1 - Gauss 消去法をすると一番右の列が指数的に増加 - LU 分解の代わりに UL 分解するとうまくいく (LU・UL 両方が破綻する例の存在は open problem) - 行・列両方をピボットする Gauss は,常にうまくいく 9/ 10
  • 11. 参考:なにをやってもダメな例(Hilbert 行列)   1/1 1/2 1/3 1/4 1/2 1/3 1/4 1/5 A= 1/3  1/4 1/5 1/6 1/4 1/5 1/6 1/7 - 線型方程式の条件数:cond(A) := ∥A−1 ∥∥A∥ (条件数 ≃ 誤差の拡大率) - 条件数が大きいと,何をやってもだいたい無理 ⇒ 競プロでは,この手の入力は考えなくて良い 10/ 10