7.円分多項式、円分数

円分多項式

円分多項式Φn(x) とは、以下の定義により帰納的に定義される多項式である。

円分多項式は、Z[X]上既約である。また、次数は、φ(n)(φはオイラー関数)となる。

Φn(x) については、以下のような直接的に表す式がある。

Φn(x)= Π
d|n
(xd−1)μ(n/d)

μ(n/d) はメビウス関数を表す。

この式から、円分多項式Φn(x) を求めてみる。

まず、nを割り切るような全てのdによる積については、今、nの値が小さいので、
1≦d≦nの範囲について、nを割り切るかどうかを直接調べていっても、それほど時間はかからない。

積については、メビウス関数の値に応じて、xd−1を掛ける場合と、xd−1で割る場合がある。
これについては、掛ける方を先に行う(途中の状態では割り切れるとは限らないので)。

プログラムは以下のとおり。

 10   'poly.ub
 20   L%=1000:dim A%(L%),B%(L%),W%(L%)
 30   input N%
 40   '
 50   ' main loop
 60   '
 70   Ka%=0:A%(0)=1
 80   for D%=1 to N%
 90     if or{N%@D%>0,moeb(N%\D%)<=0} then 110
100     gosub 210:gosub 250
110   next D%
120   for D%=1 to N%
130     if or{N%@D%>0,moeb(N%\D%)>=0} then 150
140     gosub 210:gosub 360
150   next D%
160   gosub 480:' print
170   print:goto 30
180   '
190   ' set (x^d - 1)
200   '
210   Kb%=D%:B%(Kb%)=1:B%(0)=-1:for I%=1 to Kb%-1:B%(I%)=0:next I%:return
220   '
230   ' w = a * b
240   '
250   Kw%=Ka%+Kb%:for I%=0 to Kw%:W%(I%)=0:next I%
260   for I%=0 to Ka%
270     for J%=0 to Kb%:K%=I%+J%
280       W%(K%)=W%(K%)+A%(I%)*B%(J%)
290     next J%
300   next I%
310   Ka%=Kw%:for I%=0 to Ka%:A%(I%)=W%(I%):next I%:return
320   return
330   '
340   ' w = a / b
350   '
360   Kw%=Ka%-Kb%
370   for I%=Kw% to 0 step -1
380     W%(I%)=A%(I%+Kb%)\B%(Kb%)
390     for J%=I% to I%+Kb%
400       A%(J%)=A%(J%)-W%(I%)*B%(J%-I%)
410     next J%
420   next I%
430   Ka%=Kw%:for I%=0 to Ka%:A%(I%)=W%(I%):next I%:return
440   return

プログラムについて簡単に説明すると、

これで、計算が終わったところで a%(i%) に円分多項式の係数がセットされるので、
そのまま印字してもよいが、少し出力に凝ってみる。

450   '
460   ' pretty print
470   '
480   for I%=Ka% to 0 step -1
490     if A%(I%)<>0 then cancel for:goto 510
500   next I%
510   if I%=0 then print A%(I%);:return
520   if A%(I%)<>1 then print A%(I%);
530   print "x";
540   if I%>1 then print "^";cutspc(str(I%));
550   for J%=I%-1 to 0 step -1
560   ' coefficient
570     if A%(J%)=0 then 660
580     if A%(J%)>1 then print "+";cutspc(str(A%(J%)));
590     if A%(J%)=1 then print "+";
600     if A%(J%)=-1 then print "-";
610     if A%(J%)<-1 then print "-";cutspc(str(abs(A%(J%))));
620     if J%=0 then print cutspc(str(abs(A%(0))));
630   ' term
640     if J%>0 then print "x";
650     if J%>1 then print "^";cutspc(str(J%));
660   next J%:return

n=1〜20についての円分多項式は以下のとおり。

 1 : x-1
 2 : x+1
 3 : x^2+x+1
 4 : x^2+1
 5 : x^4+x^3+x^2+x+1
 6 : x^2-x+1
 7 : x^6+x^5+x^4+x^3+x^2+x+1
 8 : x^4+1
 9 : x^6+x^3+1
10 : x^4-x^3+x^2-x+1
11 : x^10+x^9+x^8+x^7+x^6+x^5+x^4+x^3+x^2+x+1
12 : x^4-x^2+1
13 : x^12+x^11+x^10+x^9+x^8+x^7+x^6+x^5+x^4+x^3+x^2+x+1
14 : x^6-x^5+x^4-x^3+x^2-x+1
15 : x^8-x^7+x^5-x^4+x^3-x+1
16 : x^8+1
17 : x^16+x^15+x^14+x^13+x^12+x^11+x^10+x^9+x^8+x^7+x^6+x^5+x^4+x^3+x^2+x+1
18 : x^6-x^3+1
19 : x^18+x^17+x^16+x^15+x^14+x^13+x^12+x^11+x^10+x^9+x^8+x^7+x^6+x^5+x^4+x^3+x^2+x+1
20 : x^8-x^6+x^4-x^2+1

円分多項式の係数は、上の例を見ると、必ず、−1、0、1となるように見えるが、
n=105 のとき、2となる(105=3×5×7に注意)。
実は、円分多項式の係数は、任意の整数値を取りうる。


この章の目次

E-mail : kc2h-msm@asahi-net.or.jp
三島 久典