プログラミング雑感  新JavaScript入門  JavaScript,Neo-Generation  掲示板  表紙
14. 多項式クラス(7)  16. 多項式クラス(9) 
プログラミング雑感
Written 11/12/02
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行を分けると、
    
 
左から (a1, a2, a3, a4) の整数解があるような (b1, b2, b3, b4) を求め、そのときに右から得られる (b5, b6, b7, b8, b9, b10) が条件を満たすかどうかを調べます。 こうして得られた1次の式で割ってみて割り切れるかどうかを調べます。
以上は、1変数多項式の因数分解とほぼ同じ考え方です。
若干の注意点
ほぼ同じと書きましたが、次の点に注意しなければなりません。
b1, ... , b4 は f1, ... , f4 の約数なので有限の組み合わせしか取りえないということでした。 fi が0のときはどうしましょう。
このときは f1, ... , f4 が全て0にならないように、 x0, x1, y0, y1, z0, z1 の値を変えましょう。
最初は、
    (x0, y0, z0) = (0, 0, 0)
    (x1, y1, z1) = (1, 1, 1)
 
としておき、f1 = 0ならば、
    (x0, y0, z0) = (1, 0, 0)
                 = (0, 1, 0)
                     ...
 
と変えて、f1 が0にならない組み合わせを見つけます。
同様に f2 が0にならないように x1 を変える、 などします。
このとき必ず、
    x0 ≠ x1, y0 ≠ y1, z0 ≠ z1
 
となるようにします。 これは、上の4×4の行列の行列式が0でないための必要十分条件だからです。
行列オブジェクト
今回この因数分解のプログラムを作るために、行列オブジェクトを作りました。 これで簡単に逆行列を求めることができます。 この行列の要素は有理数です。 そのために分数オブジェクトも作りました。
    有理数型行列オブジェクト
    分数オブジェクト
 
要素が分数のため桁落ちはないのですが、 あまり大きな数になると答えがおかしくなる可能性もあります。
3変数2次多項式の因数分解
以上の考え方をまとめて、3変数2次多項式の因数分解のプログラムを作りました。
+ x + y + z + x2 + xy + xz + y2 + yz + z2

テキストボックスに整数を入力してボタンを押すと、 因数分解の結果が表示されます。
係数が大きいと、b1, ... , b4 の組み合わせは有限とはいえ大きくなり、 計算に時間がかかる可能性があります。 組み合わせが1000より大きいときに警告を出し、 スクリプトを続けるかどうか判断してもらいます。
first, prev, next, exit