else
F1 ←F1∪ {h}
} F ←F1
}
returnF
6.7 整数係数一変数多項式の因数分解
計算機代数システムにおいて用いられている因数分解アルゴリズムは,何らかの準同 型により多項式をより扱いやすい空間に写像し, その空間で, 多項式の像を因数分解 し,なんらかの方法によりその分解された像からもとの空間における因子を構成する, という方法によるものが多い. 特に, 二変数以上の多項式の因数分解は一変数多項式 に帰着されるなど, 一変数多項式の因数分解は, 因数分解アルゴリズムにおいて重要 な位置を占める. ここでは,もっとも普通に用いられている Zassenhausによるアルゴ リズムについて述べる.
無平方なf ∈Z[x]の因数分解アルゴリズムは, 有限体上の因数分解, Hensel構成, 試し割りの三つの部分からなる.
命題 6.31 (Hensel) f ∈Z[x], p∈N は素数で,
f ≡Yf1i modp, f1i ∈GF(p)[x], deg(f) = deg(Y
i
f1i)
f1i は GF(p) 上で互いに素とする. この時, 任意の k に対し, fki ∈ Z/(pk)[x] が存在 して,
f ≡Y
i
fki modpk, f1i ≡fkimodp, deg(f1i) = deg(fki).
[証明]k に関する帰納法で示す. k が 1 の時は正しい. k まで正しいとする.
f(k+1)i =fki+pkhi なる形を仮定すると,
Y
i
f(k+1)i ≡Y
i
fki+pkX
i
hiY
j6=i
fkj modpk+1
一方, f ≡Qifki modpk より, f =Y
i
fki+pkhmodpk+1 と書ける. よって,
h≡X
i
hi
Y
j6=i
fkj ≡X
i
hi
Y
j6=i
f1j modp
となるように,hi ∈GF(p)[x],deg(hi)≤deg(f1i)を決めることができることを示せば よい. これは,命題 5.11 により言える. 2
命題 6.32 f ∈Z[x], p∈N は素数,
f ≡g0h0 modp, g0, h0 ∈GF(p)[x], deg(f) = deg(g0h0), GCD(g0, h0) = 1 とする. この時, f ≡ gh ≡ g0h0 modpk かつ g ≡ g0 ≡ g0 modp, deg(g) = deg(g0) = deg(g0), deg(h) = deg(h0) = deg(h0), lc(g)≡lc(g0) modpk ならば,
g ≡g0 modpk, h≡h0 modpk.
[証明]k に関する帰納法で示す. k まで正しいとする. k+ 1 のとき, 帰納法の仮定に より,
g0−g =pkr, h0−h=pks
と書ける. 一方, gh ≡ g0h0 modpk+1 から rh0 +sg0 ≡ 0 mod p が成り立つ. もし s≡0 modp ならばrh0 ≡0 mod pより k+ 1 で正しい. もし s6≡0 ならばg0|r. ここ で, lc(g) ≡ lc(g0) modpk+1 より, deg(rmodp) <deg(g0). よって r ≡ 0 mod p とな り, この場合も k+ 1 で正しい. 2
定義 6.33 f =Pni=0aixi ∈C[x]に対し, f のノルム kf k1, kf k2 をそれぞれ, kf k1=
Xn
i=0
|ai|, kf k2=
vu utXn
i=0
|ai|2
(|a|は a の絶対値)で定義する.
命題 6.34 (Landau-Mignotte[27]) f =Pni=0aixi ∈Z[x], g =Pmi=0bixi ∈Z[x] とする.
この時g|f ならば, kg k1≤ |bm/an|2m kf k2
系 6.35 f, g ∈Z[x], g|f ならば, klc(f)/lc(g)·g k1≤2deg(g) kf k2
6.7. 整数係数一変数多項式の因数分解 57 命題 6.36 f ∈Z[x]が無平方ならば,有限個の素数pを除いてdeg(f modp) = deg(f) かつf modp は無平方.
証明は, f の無平方性が,f と f0 の終結式が 0でないことと同値であることから明ら か.
以上により Z[x]における因数分解は次のように行なわれる.
アルゴリズム 6.37 (Zassenhaus[49]) Input : f(x)∈Z[x]; f は無平方
Output : {f1, f2,· · ·} f =f1f2· · · は f の既約分解
p←deg(f) = deg(f modp) かつf modp が無平方となるようなp a←f の主係数
F1 ←f /amodp の GF(p) 上のモニックな既約因子全体 (有限体上の因数分解) if |F1|= 1 then return {f}
F1 ={f11,· · ·, f1m} とする.
k←pk >kf k2 ·2deg(f)+1 なる整数
f ≡Qif1i modp からf ≡Qifki modpk なる Fk ={fk1,· · ·, fkm} を Hensel 構成で求める
l←1 F ← ∅
while ( 2l ≤m ){
(a) S ←S ⊂Fk, |S|=l なる新しい部分集合 if S が存在しない then l←l+ 1
else {
g ←a· · ·Qs∈Ss
(b) g ←g の各係数に pk の整数倍を加えて絶対値が pk/2 以下としたもの if g|af {
g ←pp(g) (primitive part), f ←f /g, Fk←Fk\S }
}
if (f 6= 1) then F ←F ∪ {f}
returnF
命題 6.38 アルゴリズム 6.37 は f の既約因子分解を出力する.
[証明] (a) において, S が真の因子 G の法p での因子から Hensel 構成により構成さ れた法pk での因子とする. すると, 法 pk での一意性により, (b) において
a/lc(G)·G≡g modpk. ここで, 系 6.35 および k のとり方により,
ka/lc(G)·Gk1≤2deg(G)kf k2≤2deg(f) kf k2< pk/2.
また, kg k1≤pk/2 より
kg−a/lc(G)·Gk1≤kg k1 +ka/lc(G)·Gk1<2·pk/2 =pk.
以上により, a/lc(G)·G=g. アルゴリズム6.37 では, 法 p での因子の個数が小さい 順に試しているため, 割り切れた時点で既約性が成り立つ. 2
このアルゴリズムでは,
g が f の因子ならば, lc(f)/lc(g)·g は lc(f)f の因子
という簡単な事実が使われている. そして, 予め候補の主係数をlc(f) にしておけば, もし真の因子ならば, 上記の理由により必ずそれは lc(f)f を割り切るのである.
さて, 実際にこのアルゴリズムを計算機上で実現する場合, 効率向上のために注意 する点は数多くある. それらのいくつかを述べる.
1. p の選択
f modpが無平方でさえあれば,アルゴリズムは進行するが,有限体上での因数 分解の出力する modp での因子の個数は p により一般に異なる. 特に, ある p に対し f modpが既約ならば f 自身既約と判定できるが,他のf modpが既約 でない p を選ぶことによって無駄なHensel 構成をする場合もある. このため, 通常はいくつかの p を選んで有限体上での因数分解を複数回起動し, 最も因子 の個数が少ないp を選ぶ.
2. Hensel 構成
ここで述べた Hensel 構成は linear lifting と呼ばれるもので, p の冪が1 次の オーダでしか増えない. 特に pが小さい場合,目的の評価値に到達するのに多く の段数を必要とする. このため, p の冪を2 次のオーダで上げていく quadratic
lifting というアルゴリズムが考案されている. ただしこれは, Piai
Q
k6=ifk = 1
における ai も同時にHensel 構成しなければならないため, pk がマシン整数程
度のうちはquadratic liftingし,マシン整数を越えたあたりで linear liftingに切 替えるということが行なわれる.