15. 多項式クラス(8)
前のページで、20個の方程式を解かなければなりませんでした。
Aa = b
これを逆行列を用いて系統的に解くことを考えましょう。
もうちょっとだけ簡単な例で見ていきましょう。
次の式を因数分解することを考えます。
f(x,y,z) = x2 + y2 + 2z2 + 2xy + 3xz + 3yz - x - y - 2
2次式なので因数分解できるとすれば1次×1次となります。
f(x,y,z) = g(x,y,z)h(x,y,z)
g(x,y,z) = a1 + a2x + a4y + a7z
このとき、
f(x0,y0,z0) = g(x0,y0,z0)h(x0,y0,z0)
f(x1,y0,z0) = g(x1,y0,z0)h(x1,y0,z0)
f(x0,y1,z0) = g(x0,y1,z0)h(x0,y1,z0)
f(x0,y0,z1) = g(x0,y0,z1)h(x0,y0,z1)
f(x2,y0,z0) = g(x2,y0,z0)h(x2,y0,z0)
f(x1,y1,z0) = g(x1,y1,z0)h(x1,y1,z0)
f(x1,y0,z1) = g(x1,y0,z1)h(x1,y0,z1)
f(x0,y2,z0) = g(x0,y2,z0)h(x0,y2,z0)
f(x0,y1,z1) = g(x0,y1,z1)h(x0,y1,z1)
f(x0,y0,z2) = g(x0,y0,z2)h(x0,y0,z2)
が成り立てば、因数分解できることになるので、
b1 | f(x0,y0,z0)
...
b10 | f(x0,y0,z2)
a | b は"aはbの約数"という意味
となる
b があって、
Aa = b
が成り立たなければならない。ここで A は、
都合により次数が低い順に並べ替えると、
上の4行と下の6行を分けると、
左から (a
1, a
2, a
3, a
4)
の整数解があるような
(b
1, b
2, b
3, b
4)
を求め、そのときに右から得られる
(b
5, b
6, b
7, b
8, b
9, b
10)
が条件を満たすかどうかを調べます。
こうして得られた1次の式で割ってみて割り切れるかどうかを調べます。
以上は、
1変数多項式の因数分解とほぼ同じ考え方です。
ほぼ同じと書きましたが、次の点に注意しなければなりません。
b
1, ... , b
4 は f
1, ... , f
4
の約数なので有限の組み合わせしか取りえないということでした。
f
i が0のときはどうしましょう。
このときは f
1, ... , f
4 が全て0にならないように、
x
0, x
1, y
0, y
1, z
0,
z
1 の値を変えましょう。
最初は、
(x0, y0, z0) = (0, 0, 0)
(x1, y1, z1) = (1, 1, 1)
としておき、f
1 = 0ならば、
(x0, y0, z0) = (1, 0, 0)
= (0, 1, 0)
...
と変えて、f
1 が0にならない組み合わせを見つけます。
同様に f
2 が0にならないように x
1 を変える、
などします。
このとき必ず、
x0 ≠ x1, y0 ≠ y1, z0 ≠ z1
となるようにします。
これは、上の4×4の行列の行列式が0でないための必要十分条件だからです。
今回この因数分解のプログラムを作るために、行列オブジェクトを作りました。
これで簡単に逆行列を求めることができます。
この行列の要素は有理数です。
そのために分数オブジェクトも作りました。
有理数型行列オブジェクト
分数オブジェクト
要素が分数のため桁落ちはないのですが、
あまり大きな数になると答えがおかしくなる可能性もあります。
以上の考え方をまとめて、3変数2次多項式の因数分解のプログラムを作りました。
テキストボックスに整数を入力してボタンを押すと、
因数分解の結果が表示されます。
係数が大きいと、b
1, ... , b
4
の組み合わせは有限とはいえ大きくなり、
計算に時間がかかる可能性があります。
組み合わせが1000より大きいときに警告を出し、
スクリプトを続けるかどうか判断してもらいます。