SX-4を使った円分多項式の計算について
鹿児島大学 理学部 小柴 洋一
1.この計算の目的
この計算は数学・整数論における円分多項式を求めるものです。より詳しいことは文献[1]、文献[2]をご覧下さい。
その計算のアルゴリズムの必然性から高速、広領域を必要とする整数の数値計算です。スーパーコンピュータの高速化の発展に応じてその時々においてそれまで不可能であったことが可能に転化しつつ計算可能な範囲が広がりつつあります。
計算公式は3つあるがそのひとつとしてA.GrytczukとB.Tropakは次の計算公式を述べている(文献[3])。
すなわちn-th円分多項式を

とするとき

ここでμはMobius関数,ΦはEuler関数、(k,d)はkとdの最大公約数をあらわすとする。
その証明は、代数方程式の根の累乗和を同じ根の基本対称式で表す漸化式(文献[4])、およびRamanujanの和についてのHolderの式から導き出せます(文献[5])。
この部分については以下のmailing listでの議論が参考になりました。rsnt@math.metro-u.ac.jpおよびtnt@math.metoro-u.ac.jp(98年10月ごろ)
これをプログラム化すると次のようになります。
******************** ファイルの始め ********************
!A.Gryczuk and B.Tropakの計算公式によるプログラム
parameter (isize=36495360)
integer*8 T(isize)
integer*8 a(0:isize)
integer*8 prime(20)
integer*8 euler,r,s,n,sun,myu,const
!
n=3*5*7*11*17*19
! n=3*5*7
call check(n,prime,s)
myu=(‐1)**s
!
euler=1
do 100 j=1,s
euler=euler*(prime(j)‐1)
100 continue
!
do 500 r=1,euler
T(r)=1
500 continue
!
do 300 j=1,s
do 300 r=1,euler/prime(j)
T(prime(j)*r)=T(prime(j)*r)*(1-prime(j))
300 continue
!
a(0)=1
const=euler/10
do 400 j=1,euler
! do 400 j=1,const
! do 400 j=1,10000000
sum=0
do 600 m=0,j-1
sum=sum+a(m)*T(j-m)
600 continue
a(j)=-myu*(sum/j)
400 continue
write(6,*)’max=’,MAXVAL(a),’min=’,MINVAL(a)
end
******************** ファイルの終り ********************
サブルーチンcheckは本質的でないのでここで掲載することは省略。
時間がかかるのは、端末ラベル400のdoループです。この計算テーマの問題部分です。
2.SX-4による計算結果
早速n=3×5×7×13×17×19として計算実行してみた。以下がそのときのジョブ記録である。
******************** ファイルの始め ********************
cyc_Grytczuk_Tropak_64.90:
f90: vec(1): cyc_Grytczuk_Tropak_64.90, line 13:
Vectorized loop
f90: vec(1): cyc_Grytczuk_Tropak_64.90, line 17:
Vectorized loop
f90: vec(1): cyc_Grytczuk_Tropak_64.90, line 21:
Vectorized loop
f90: vec(1): cyc_Grytczuk_Tropak_64.90, line 22:
Vectorized loop
f90: vec(1): cyc_Grytczuk_Tropak_64.90, line 29:
Vectorized loop
f90: vec(1): cyc_Grytczuk_Tropak_64.90, line 39:
Vectorized loop
f90: cyc_Grytczuk_Tropak_64.90, _MAIN: There are 6 diagnoses.
check_64.f90:
f90: vec(1): cyc_Grytczuk_Tropak_64.90, line 14: Vectorized loop
f90: check_64.f90,check: There is 1 diagnosis.
moebius_64.f90:
f90: vec(3): moebius_64.f90, line 8nvectorized loop.
f90: moebius_64.90,moebius: There is 1 diagnosis.
start time=Tue Nov 2 13:49:49 JST 1999
max= 669606 min= -654589
.....プログラム 情報.....
経過時間 (秒) : 1418.319181
ユーザ時間 (秒) : 1408.71182=約23分29秒
システム時間 (秒) : 2.074670
ベクトル命令実行時間 (秒) : 1408.114827
全命令実行時間 : 80715707813
ベクトル命令実行数 : 21509192966
ベクトル命令実行要素数 : 5505507358178
浮動小数点データ実行要素数 : 1659941
MOPS 値 : 3950.214337
MFLOPS 値 : 0.001178
平均ベクトル長 : 255.960666
ベクトル演算率 (%) : 98.936037
メモリ使用量 (MB) : 80.031250
MIPS 値 : 57.297528
命令キャッシュミス (秒) : 0.121177
オペランドキャッシュミス (秒) : 0.056812
バンクコンフリクト時間 (秒) : 0.136701
******************** ファイルの終り ********************
係数の最大値として669606、最小値として-654589がでていることがわかる。
そこで次の段階としてやるべきことはn=3×5×7×13×17×19×23の場合である。これは未だ正常実行して計算しきっていません。しかし、部分的にこれらの係数たちを求めることはできました。それが以下。
******************** ファイルの始め ********************
cyc_Grytczuk_Tropak_64.90:
f90: vec(1): cyc_Grytczuk_Tropak_64.90, line 14:
Vectorized loop
f90: vec(1): cyc_Grytczuk_Tropak_64.90, line 18:
Vectorized loop
f90: vec(1): cyc_Grytczuk_Tropak_64.90, line 22:
Partially vectorized loop
f90: vec(1): cyc_Grytczuk_Tropak_64.90, line 23:
Vectorized loop
f90: vec(1): cyc_Grytczuk_Tropak_64.90, line 32:
Vectorized loop
f90: vec(4): cyc_Grytczuk_Tropak_64.90, line 37:
Vectorized array expression.
f90: vec(4): cyc_Grytczuk_Tropak_64.90, line 37:
Vectorized array expression.
f90: cyc_Grytczuk_Tropak_64.90, _MAIN: There are 7 diagnoses.
check_64.f90:
f90: vec(1): check_64.f90, line 14: Vectorized loop
f90: check_64.f90,check: There is 1 diagnosis.
moebius_64.f90:
f90: vec(3): moebius_64.f90, line 8nvectorized loop.
f90: moebius_64.90,moebius: There is 1 diagnosis.
start time=Tue Nov 23 18:00:11JST 1999
max= 4071770387 min= -4248451085
.....プログラム 情報.....
経過時間 (秒) : 28949.717421
ユーザ時間 (秒) : 27018.020478=約7時間30分
システム時間 (秒) : 64.466699
ベクトル命令実行時間 (秒) : 27015.028925
全命令実行時間 : 1561253529530
ベクトル命令実行数 : 416268499499
ベクトル命令実行要素数 : 10656101327958
浮動小数点データ実行要素数 : 7300322
MOPS 値 : 3986.450393
MFLOPS 値 : 0.000270
平均ベクトル長 : 255.961057
ベクトル演算率 (%) : 98.936935
メモリ使用量 (MB) : 561.031250
MIPS 値 : 57.785637
命令キャッシュミス (秒) : 2.754349
オペランドキャッシュミス (秒) : 1.222460
バンクコンフリクト時間 (秒) : 0.692612
******************** ファイルの終り ********************
const=euler/5として中途まで計算させました。このときのeulerは36495360です。したがってconstは7299072です。数学書式で説明すると
Φ3×5×7×11×13×17×19×23(x)=a72999072(1115464359)x7299072+・・・
111546435=3×5×7×11×13×17×19×23
最初の項(定数項)からのx
7299072項まで求めたことになる。少しばかり関心がひかれるのは係数達の最大値、最小値が4バイト整数としてはオーバーフロウしていることです。このプログラムはオーバーフロウの検証を行っていません。この検証を伴ったプログラムにすると実行時間が絶望的に大きくなるでしょう。この意味では数学者たちを未だ満足させていません。
3.並列プログラムの簡単な例
上記のプログラムの並列化を考えたが、まだ満足すべき並列アルゴリズムを考え出すに至っていない。その過程で次のプログラムを作ったので載せておきます。何かの参考にしてください。
******************** ファイルの始め ********************
!並列処理機能の手引 20ページ 図3-5 同時制御の使用例に
加工したもの
program main
use mod_com
! integer t1
integer tid,tparam,d1
external sub
!
event
call peasgn(event)
!
tparam=100
call ptfork(tid,tparam,sub)
d1=54321
x=d1
call pepost(event)
call ptjoin(tid)
!
call pefree(event)
!
!cdir serial
write(6,*)’x=’,x
!cdir endserial
end program main
******************** ファイルの終り ********************
モジュールmod_comは同部分にあるのと同じ。
また別に以下の例もあります。これは排他制御(lock)の使用例です。
******************** ファイルの始め ********************
program main
use mod_com
integer t1,tid
external sub
!
lock=0
call plasgn(lock)
!
t1=200
tparam=12345
s=0
call ptfork(tid,tparam,sub)
call ptjoin(tid)
s=s+t1
call plunlock(lock)
call ptjoin(tid)
!
call plfree(lock)
!
!cdir serial
write(6,*)’s=’,s
!cdir endserial
end program main
******************** ファイルの終り ********************
参考文献
- 小柴 洋一、円分多項式の係数の計算、大阪大学大型計算機センターニュース、Vol.21 no.2 1191-8,82 51-56p
- 小柴 洋一、円分多項式の係数の計算、九州大学大型計算機センター広報、Vol.30
no.2 1197,141-145p
- A.Grytczuk and B.Tropak,A numerical method for the determination of
the cyclotomic polynomial coefficients Computional Number Theory,15-19page,Walter
de Gruyter,1991
- ファン・デル・ヴェルデン(銀林 浩訳),現代代数学1,東京図書,110ページ、問題3
- Hardy and Wright,The Theory of Numbers,Oxford,4th editin,1959,238page,定理272