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


最初の項(定数項)からのx7299072項まで求めたことになる。少しばかり関心がひかれるのは係数達の最大値、最小値が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
******************** ファイルの終り ********************


参考文献
  1. 小柴 洋一、円分多項式の係数の計算、大阪大学大型計算機センターニュース、Vol.21 no.2 1191-8,82 51-56p
  2. 小柴 洋一、円分多項式の係数の計算、九州大学大型計算機センター広報、Vol.30 no.2 1197,141-145p
  3. 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
  4. ファン・デル・ヴェルデン(銀林 浩訳),現代代数学1,東京図書,110ページ、問題3
  5. Hardy and Wright,The Theory of Numbers,Oxford,4th editin,1959,238page,定理272