Triangularize コマンドの主要なサブルーチンは RegularGcd コマンドで、これによってレギュラーチェインを法とする多項式の gcd を計算します。このルーチンについては ChainTools サブモジュールのレギュラーチェインの基本コマンドと合わせて後述します。
>
|
![R := PolynomialRing([y, x])](/support/helpjp/helpview.aspx?si=2037/file01037/math651.png)
|
ここに空のレギュラーチェインとその内部表現があります。
>
|


|
![table( [( type ) = regular_chain, ( polynomials ) = [], ( property ) = isPrime ] )](/support/helpjp/helpview.aspx?si=2037/file01037/math666.png)
| (2.4.1) |
(適切な) 多項式
既存のレギュラーチェイン
に追加すると、新たにレギュラーチェインを構築できます。この操作により、レギュラーチェインのリストが返されることがあります。実際、
の頭文字を
(
の飽和イデアル) に対して定期的に検証すると
が分割される可能性があります。
次の例では、この状況は発生しません。レギュラーチェインの
は空です。
>
|

![rc := l[1]](/support/helpjp/helpview.aspx?si=2037/file01037/math695.png)
|

| (2.4.2) |
新しいレギュラーチェイン
の内部表現は下記のようになります。レギュラーチェイン内の各多項式では、データ構造体に自身の主変数、主次数、頭文字が含まれています。これらの数値や量は頻繁に必要になるため、そのたびに計算するのを避ける目的でキャッシュに格納します。
内部表現はレギュラーチェインに関する特性、isPrime も表示します。これは、レギュラーチェインの飽和イデアルが素数イデアルであることを意味します。このような特性を理解しておくと計算時間を短縮できます。
>
|

|
![table( [( type ) = regular_chain, ( polynomials ) = [[x, 2, 1, x^2+1, isPrimeIrreducible]], ( property ) = isPrime ] )](/support/helpjp/helpview.aspx?si=2037/file01037/math720.png)
| (2.4.3) |
次に、
を法とする 2 つの多項式
と
の最も一般的な約数を計算します。例では、
を gcd とします。
>
|
![p[1] := expand(((x+1)*y+x)*(y+1))](/support/helpjp/helpview.aspx?si=2037/file01037/math736.png)
![p[2] := expand(((x-1)*y+x)*(y+1))](/support/helpjp/helpview.aspx?si=2037/file01037/math737.png)
|

| (2.4.4) |
一般に、レギュラーチェインを法として gcd を計算した出力は「事例」のリストになります。
上記の例では、
が体を定義するため分割される事例はありません。ただし、下記の出力のように、予想したとおりにならない場合もあります。
>
|
![rg := RegularGcd(p[1], p[2], y, rc, R)](/support/helpjp/helpview.aspx?si=2037/file01037/math757.png)
![factor(rg[1][1])](/support/helpjp/helpview.aspx?si=2037/file01037/math758.png)
|

| (2.4.5) |
しかし、外部因数
は
を法とする群です。このため、予想と計算後の gcd は実際には関連するため、結果は正しくなります。
gcd の計算中に分割が必要となる例について考えます。このように例を作成するには、入力の方程式が因数分解しないことを確実にする必要があります。なぜなら、そうでないと Construct コマンドによって系が分割されるためです。下記の例では 3 つの変数があります。そのうちの 2 つ
と
を使用して多項式
と
を持つレギュラーチェインを作成します。
>
|
![R := PolynomialRing([z, y, x])](/support/helpjp/helpview.aspx?si=2037/file01037/math794.png)
|
最初の多項式は < に対して既約です。
>
|

|
したがって、ここからレギュラーチェインを作成した場合、出力は 1 つだけになります。後に備えてコピーを作成しておきます。
>
|
![rc := Construct(mx, Empty(R), R)[1]](/support/helpjp/helpview.aspx?si=2037/file01037/math810.png)

|
Construct コマンドにより
(の飽和イデアル) が素数イデアルであることが検出されます。
>
|

|
![table( [( type ) = regular_chain, ( polynomials ) = [[x, 2, 1, x^2-2, isPrimeIrreducible]], ( property ) = isPrime ] )](/support/helpjp/helpview.aspx?si=2037/file01037/math829.png)
| (2.4.6) |
2 番目の多項式は
に関して既約ではありません。Construct コマンドでこの事実は容易に検知され、
を伴うレギュラーチェインを作成するときにこれを分割します。
>
|

|

| (2.4.7) |
を法とする
を約分することにより、約分された多項式は、
に関して既約となります。
>
|

|

| (2.4.8) |
を
だけ拡張します。
>
|

![rc := l[1]](/support/helpjp/helpview.aspx?si=2037/file01037/math875.png)
|
Construct コマンドはこの安価な基準を使用して関連の飽和イデアルが素数かどうかを検知します。ここでは、これらの基準は失敗します。そのため、作成されたレギュラーチェインの
には特定の特性を持ちません。
>
|


|
![[y^2-y+x-2, x^2-2]](/support/helpjp/helpview.aspx?si=2037/file01037/math895.png)
| (2.4.9) |
下記に定義した、
を法とする
および
の gcd を計算します。
>
|
![p[1] := (y-x)*z+(y+x-1)*(z+1)](/support/helpjp/helpview.aspx?si=2037/file01037/math909.png)
![p[2] := y-x+(y+x-1)*(z+1)](/support/helpjp/helpview.aspx?si=2037/file01037/math910.png)
|

| (2.4.10) |
例では分割が必要な構成になっています。第 1 因子の
を法とし、つまり、
とすると、gcd は
です。一方、第 2 因子
を法とするとこれが構築されます。これに付随して、次のように 2 つの分岐が存在します。
>
|
![rg := RegularGcd(p[1], p[2], z, rc, R)](/support/helpjp/helpview.aspx?si=2037/file01037/math932.png)
|
![[[2*y+z*y+x*z-z-1, regular_chain], [3*y^2-2*x*y-2*y-x^2+2*x, regular_chain]]](/support/helpjp/helpview.aspx?si=2037/file01037/math935.png)
| (2.4.11) |
最初の事例を検証します。

| (2.4.12) |
は正規化されていないことに注意してください。SparsePseudoRemainder の計算でこれが「
を法とする」分岐に対応していることを示しています。
>
|
![u := SparsePseudoRemainder(g[1], rc[1], R)](/support/helpjp/helpview.aspx?si=2037/file01037/math968.png)

|

| (2.4.13) |
単位
を法とする乗法因子
までは、これが求められる結果となります。
2 番目の事例を検証します。ここでも、レギュラーチェイン
は正規化されていません。また、SparsePseudoRemainder 計算で、これが「
を法とする」分岐に対応していることを示しています。

| (2.4.14) |
が
を法とする単位であることを検証します。最初に、
を法としてこれを約分します。次に、結果が
を法として可逆であるかを見ます。解答は可逆的であることを示しています。

| (2.4.15) |