この記事は日曜数学 Advent Calendar 2024
(
https://adventar.org/calendars/9972
) の9日目の記事です.
数式処理(計算機代数)とは,因数分解やグレブナー基底といった,数学における計算をコンピュータに厳密に(記号的に)行わせることを目的とした応用数学の一分野です.
応用数学とはいっても,工学等への応用のみでなく,純粋数学におけるややこしい計算もある程度は記号的に処理できるため,純粋数学畑の人にとっても有用なものです.
数式処理のトピックの一つとして,多項式のGCDは非常に応用範囲が広いため,研究されています.本記事では様々な応用を通じて,GCD,そして数式処理の魅力を解説したいと思います.
今回,係数体は
一変数多項式
上の例では因数分解した形を書いておきましたが,実際のGCD計算で因数分解を使うわけではありません.整数のGCD同様Euclidの互除法で計算ができますが,注意として,
GCDの計算ができると嬉しいことの一つとして,無平方分解の計算があります.まずは無平方の定義をしておきます.
無平方分解は以下のように定義されます.
ただし,
例えば因数分解アルゴリズムのように,アルゴリズムの入力に無平方であることを要求されることがよくあります.このような場合,無平方分解を行った後,無平方因子ごとにアルゴリズムを実行すればよいのです.
無平方分解の計算アルゴリズムはGCDを基に作ることができます.よく知られたアルゴリズムは,以下の性質を利用して設計されています.
アルゴリズムの詳細は書きませんが,どうやって計算するか最初の方だけお見せしましょう.命題2から,
残りも同様にひたすらGCDを計算することで,
Newton法への応用を考えてみます.Newton法の解説は山ほどあるので,ここでは説明しませんが,代数方程式
Newton法は強力なツールですが,求めたい根が重根の場合に精度が悪くなることが知られています.
これ,実は
今回はこの問題を前節の無平方分解を使って解決してみましょう.
実際,先ほどの初期値で
ちなみに,無平方分解から根の重複度も分かるわけですが(
無平方部分
さて,これまでGCDとその応用について解説してきました.この他にも山ほど応用があります.ただ,これまで見た例はあくまでも解きやすい,人工的なものです.
実践的には,厳密計算のGCDではどうにもならないことがあるのです.
これまで,係数体は
本来は
数式処理の多くのアルゴリズムは,厳密計算を前提とする故に,誤差が入ると全く無意味な答えを返すことがあります.GCDの計算もその一例です(例えば互除法で計算すると,剰余の0判定でうまくいかない).また,サブルーチンにGCDを使う無平方分解も同様です(Newton法の例では整数係数だったので,厳密に計算ができた).
しかし,実用上浮動小数演算を避けられない場面はどうしても出てきます.では,多項式に誤差が入るのはもう仕方ないとして,そこからGCDっぽいものを計算できないでしょうか?
GCDの定義において,誤差項を許容すると,例えば以下のようにGCDっぽいものを定義できます.
ただし,
近似GCDは一意的には定まりません.また,他にも色々な定義の近似GCDがあります(例えば,次数をこちらが指定するもの等).
試しに,先ほどの例の近似GCDを求めてみましょう.
代数的なものに近似なんて入れて大丈夫なの?それ意味あるの?と思われるかもしれませんが,近似GCDを使えば,さらにできることが増えます.いくつかの応用を見てみましょう.
Newton法の節で,重根に対して精度が悪くなるという話をしました.実は重根以外にも,近接根というものでも精度が悪くなります.
初期値
重根の時と同じように近接根も無平方分解で何とか対処できないか?と考えたい所ですが,今回の場合近接根は単根になっているので,無平方分解をしたところで近接根を分離することはできませんね.どうしたものやら
この場合,近似GCDと同様に近似無平方分解を考えることができ,近似無平方分解は近似GCDを用いて計算できます.近接根は近似重根として近似無平方分解に現れるので,それを利用してより精度の良い根を得ることができます(近似無平方分解の実装を持ってないので例は挙げていませんが,例えばapproGCDを見てください).
有理数を扱う時と同様に,有理関数を扱う際,分子分母のGCDをとって約分する操作はよく使われます.ここでも,誤差の影響で本来約分されるはずの因子が分子分母に残ってしまうことがあります.これによって無駄に次数の大きい有理関数を扱うことになる,約分で消えるはずの因子から本来現れない極が現れるなど,用途によっては都合の悪いことが起きます.近似GCDを考えれば,うまく約分をすることができます.
GCDについてのいくつかの応用と,近似GCDについて紹介しました.数式処理では厳密計算を主に扱うので,近似を考える数値計算とは対極にあり,一見相容れないものと思われるかもしれません.しかしここで紹介した近似GCDのような,ある種数式処理と数値計算の融合した領域(数値数式融合計算,近似代数)もあり,これによって厳密計算を考えるだけでは難しかった問題にも立ち向かうことが可能となります.
今回は応用メインで紹介しましたが,数式処理のアルゴリズムの構築自体も大変面白いものです.ああでもないこうでもないと頭を捻り,作り上げたアルゴリズムで今まで計算できなかったものが計算できるようになったとき,嬉しくてたまらないのです.まだまだ魅力を解説しきれていないようにも思いますが,数式処理の面白さが伝われば幸いです.