2013/10/16

FMM(高速多重極法)における
諸公式の導出及び実装

似鳥啓吾 (神戸)
1 概要/動機
• FMM を実装するのはなかなか困難
– 難しいのは多重極法の概念や八分木を用いたアルゴリズムの
方ではない

– むしろ「算数」の方、球面調和関数の展開中心をシフトする
部分

∗ ブラックボックスとして打ち込むだけで大層な労力、必ず
どこかで間違いそう

∗ (出版物の符号が間違えているなんてよくあるし)
∗ 導出から理解とか無理

「読めば実装できる」ぐらいのノートは必要
直感的な導出があった方がいろいろ安心
続き
• Solid Harmonics(体球調和関数)での表記はわりと単純
• 紹介するもの
– 実装に必要な数式一式(読みながら実装できる程度に)
– 符号の定義は対称性がよくなるように
– (多分)世界一簡単な導出

今回の話が簡単で当たり前すぎて何が有難いのか
さっぱりわからなかったという人向けの参考文献
• Grengard & Rokhlin(1988), “The rapid evaluation of potential
fields in three dimensions”
• Epton & Dembart(1995) “Multipole translation theory for the
three-dimensional laplace and helmholtz equations”
• van Gelderen(1998) “The shift operators and translations of
spherical harmonics”
2 Solid Harmonics
いきなり「定義はこう」で申し訳ないが、‘Regular’ と ‘Singular’ のものを
m

(|m|−m)/2

R (r, θ, φ) = (−1)
S

m

(r, θ, φ) = (−1)

r
|m|
imφ
P
(cos θ)e
,
( + |m|)!

+(|m|+m)/2

( − |m|)! |m|
imφ
P
(cos θ)e
,
+1
r

(1)
(2)

とする。P m は Legendre の陪多項式。ちなみに普通の球面調和関数は

Y

m

(r, θ, φ) = (−1)

(|m|−m)/2

s

2 + 1 ( − |m|)! |m|
imφ
P
(cos θ)e
. (3)
4π ( + |m|)!

m の符号反転に対しては単なる複素共役にならず、R−m = (−1)m [Rm ]∗ ,
S −m = (−1)m [S m ]∗ となっている。
後々のため、S m の定義には (−1) +m の因数を含ませた。
!
+m 2 +1
(−1)
r
m
Sm
R =
( + m)!( − m)!
3 多重極能率と局所展開
球座標での Laplace 方程式 ∇2 Φ(r, θ, φ) = 0 の一般解はさっきのを用いて、

Φ(r, θ, φ) =

∞
X X h

m

m

L R (r, θ, φ) + M

m

S

−m

i
(r, θ, φ) ,

(4)

=0 m=−

と書ける。係数の Lm を local expansions(局所展開) M m を multipole moments
、
(多重極能率)と呼ぶことにする。それぞれ展開中心を rL 、rM として、

P2M:

M

m

=

X

m

qi · R (rM − ri )

(5)

i

M2P:

Φ(r) =

p
λ
X X

µ

−µ

Mλ Sλ (r − rM )

(6)

λ=0 µ=−λ

L2P:

Φ(r) =

p
λ
X X
λ=0 µ=−λ

µ

µ

Lλ Rλ (r − rL )

(7)
4 全然「特殊」関数じゃないです
デカルト座標で低次のものを書き下してみた。

(l, m)
(0, 0)
(1, 0)
(1, 1)
(2, 0)
(2, 1)
(2, 2)

Rm
1
z
−(x + iy)/2
(3z 2 − r2 )/4
−z(x + iy)/2
(x + iy)2 /8

Sm
1/r
−z/r3
−(x + iy)/r3
(3z 2 − r2 )/r5
3z(x + iy)/r5
3(x + iy)2 /r5

特に Rm は 次の斉次多項式。因数に (x + iy)m 。
5 計算方法
˜
P m (r, z) = r · (r sin θ)−m · P m (cos θ) ∈ R としておくと
˜
P m (r, z) · (x + iy)m = r · P m (cos θ) · eimφ 。あとは漸化式
˜
P m (r, z) =

8
(−1)m (2m − 1)!!
<
m

˜
(2 − 1)z P −1 (r, z)
: 2 − 1 z P m (r, z) −
˜
−1
−m

+ m − 1 2 ˜m
r P −2 (r, z)
−m

( = m)
( = m + 1)
( ≥ m + 2)

(8)
•
•
•
•

!! は二重階乗、n!! = n · (n − 2)!!, 1!! = 0!! = 1
m
m ループを外側に、対角成分 Pm から を育てる
Rm は division/square-root free
1.0/(int), 1.0/factrl(i) はテーブルで覚えておく
6 八象限対称
Rm (−x, −y, −z) = (−1) Rm (x, y, z),
Rm (x, −y, z) = (−1)m R−m (x, y, z),
Rm (−x, y, z) = R−m (x, y, z),
Rm (−x, −y, z) = (−1)m Rm (x, y, z),
等々。コードの再利用にも有効。
S −m をよく使うが、これは ∝ (−1) +m R−m なので
引数に (−x, y, −z) を入れればいい。

(9)
7 昇降演算子 (Ladder Operators)
ここが一番重要!(ただし証明略)
デカルト座標の偏微分で添字を変化させる。

(

∂x + i∂y
∂z
−∂x + i∂y

(

)
(Rm (r)

S m (r))

=

Rm+1 (r)
−1
m
R −1 (r)
Rm−1 (r)
−1

S m+1 (r)
+1
m
S +1 (r)
S m−1 (r)
+1

)
.
(10)

±|m|

= (±∂x + i∂y )|m| (∂z ) −|m| を定義しておくことで、
µ
µ+m
µ
µ+m
Dm Rλ = Rλ− 、Dm Sλ = Sλ+ 。
0
0
R0 = 1、S0 = 1/r も思い出して D−m Rm = 1、S m = Dm (1/r)。
+1 −1
0
2
2
2
Laplace 方程式:D1 D1 [ ] = D2 [ ] ⇔ (∂x + ∂y + ∂z )[ ] = 0
演算子 D
8 局所展開
[D

−m

µ

Rλ (r)]r=0 = δ

λ δmµ ,

(11)

を考えれば、真空ポテンシャル場から Lm を抽出できる:

Φ(r) =

∞
λ
X X

µ

µ

m

Lλ Rλ (r − rL ) ⇒ L

= [D

−m

Φ(r)]r=rL .

(12)

λ=0 µ=−λ

つまり任意の場所で局所展開の係数が手に入る。よって Taylar 展開は、

Φ(r + ∆r) =

∞
λ
X X

µ

−µ

Rλ (∆r)[Dλ Φ(r)].

(13)

λ=0 µ=−λ

これは任意の Laplace 方程式の解 Φ(r) に適用できる。 ∆r の半径内が真空なら有効)
(
9 加法定理
Rm (r) も S m (r) も Laplace 方程式の解であった。よって先程の展
開を適用すると以下の加法定理を得る:

Rm (r + ∆r) =

λ
∞
X X

µ
Rλ (∆r)Rm−µ (r),
−λ

(14)

−(m+µ)
µ
Rλ (∆r)S +λ
(r).

(15)

λ=0 µ=−λ

S

−m

(r + ∆r) =

∞
λ
X X
λ=0 µ=−λ

余白にもう一度、

Φ(r + ∆r) =

∞
λ
X X
λ=0 µ=−λ

µ
−µ
Rλ (∆r)[Dλ Φ(r)].
10 1/r ポテンシャルの展開
0
S0 (r) の加法定理として、

1
rS − rR

0

= S0 (rS − rR )
=

∞
X X

S

−m

m

(rS )R (−rR )

=0 m=−

3

2

∞
X rR
X ˆ m
˜∗ m
4π
4
=
Y (θS , φS ) Y (θR , φR )5
r +1 2 + 1 m=−
=0 S
∞
X rR
=
P (cos θSR ),
+1
r
=0 S

with

for

rS

cos θSR = (rS · rR )/( rS

後ろ2行とかは教科書にも載っているかも。

> rR ,
rR ).

(16)
11 M2P, M2L
1
r − ri

=

∞
X X

S

−m

m

(r − rM )R (rM − ri ),

=0 m=−

よりただちに M2P が確認できる:
M

m

=

X

m

qi · R (rM − ri ) ⇒ Φ(r) =

i

p
λ
X X

µ

−µ

Mλ Sλ (r − rM ).

λ=0 µ=−λ

Φ(r) に D−m をあてて局所展開を作ると、
M2L:

m

L

=

p
λ
X X
λ=0 µ=−λ

µ −(m+µ)
Mλ S +λ
(rL

− rM ).

(17)
12 M2M
展開中心を rM から rM にシフトすることを考える。

Rm の加法定理から、
Rm (rM − ri ) =

λ
∞
X X

µ
Rλ (rM − rM )Rm−µ (rM − ri ).
−λ

λ=0 µ=−λ

P

i

qi を適用することで、
M2M:

M

m

=

λ
X X

µ
M m−µ Rλ (rM − rM ).
−λ

λ=0 µ=−λ

オーバーフローを避けるために、µ のループ範囲は、

max(−λ, m − ( − λ)) ≤ µ ≤ min(λ, m + ( − λ)).

(18)
13 L2L
Φ(r) =

∞
λ
X X

µ
Lµ Rλ (r − rL ) ⇒ Lm = [D−m Φ(r)]r=r L ,
λ

λ=0 µ=−λ

を新しい展開中心 rL でもう一度展開するだけ:

L2L:

L

m

=

p
λ
X X

µ−m
Lµ Rλ− (rL − rL ).
λ

(19)

λ= µ=−λ

ついでに、ポテンシャルの勾配は

Φ(rL + dr) = L0 + (− L1 )dx + ( L1 )dy + L0 dz, (20)
0
1
1
1
で得られるので、L2P のかわりに p = 1 の L2L を使うと実装が楽。
14 配列への格納
0 ≤ ≤ p, |m| ≤ のとき Rm や M m は
1 + 3 + 5 + . . . + (2p + 1) = (p + 1)2 個の複素数からなる。
R−m = (−1)m [Rm ]∗ を考えると実効的に (p + 1)2 個の実数
でよい。1例として一次元配列 Xi (0 ≤ i < (p + 1)2 ) に、
{
|m|
R
(m ≥ 0)
X ( +1)+m =
,
(21)
|m|
R
(m < 0)
のように格納できる。
15 実行列化
複素数での線形変換
L

m

=

p
X

λ
X

G

m,µ µ
M
,λ
λ

λ=0 µ=−λ
2
3
p
λ
X
X
m,µ µ
m,−µ −µ 5
4Gm,0 M 0 +
=
(G
M +G
M
) ,
λ
,λ
,λ
λ
,λ
λ
µ=1
λ=0

(22)

を頑張って実数の変換で書くと、
L

m

=

p
X
λ=0
p
X

2

4Am,0 M 0 +
λ
,λ

λ
X n
µ=1

m,µ
m,µ
(A
+C
)
,λ
,λ

µ
m,µ
m,µ
M + (−B
+D
)
λ
,λ
,λ

2

λ
X n
m,µ
m,µ
m,0 0
m
4B
(B
+D
)
Mλ +
=
L
,λ
,λ
,λ
µ=1
λ=0

ここで、Am,µ + iBm,µ
,λ
,λ

= G

m,µ
,
,λ

C

M

µ
m,µ
m,µ
+ (A
−C
)
λ
,λ
,λ

m,µ
m,µ
m,−µ
+ iD
= (−1)µ G
.
,λ
,λ
,λ

M

M

o

3

µ 5
,
λ
o

3

µ 5
,
λ
16 まとめ
• 書いてみるとそれなりに式が沢山になった
• とはいえ「FMM の算数」の最短コースだったと思います
• §8, §9 あたりは画期的かもしれないです
(普通は §10 から始まる)

FMMの実装と導出

  • 1.
  • 2.
    1 概要/動機 • FMMを実装するのはなかなか困難 – 難しいのは多重極法の概念や八分木を用いたアルゴリズムの 方ではない – むしろ「算数」の方、球面調和関数の展開中心をシフトする 部分 ∗ ブラックボックスとして打ち込むだけで大層な労力、必ず どこかで間違いそう ∗ (出版物の符号が間違えているなんてよくあるし) ∗ 導出から理解とか無理 「読めば実装できる」ぐらいのノートは必要 直感的な導出があった方がいろいろ安心
  • 3.
    続き • Solid Harmonics(体球調和関数)での表記はわりと単純 •紹介するもの – 実装に必要な数式一式(読みながら実装できる程度に) – 符号の定義は対称性がよくなるように – (多分)世界一簡単な導出 今回の話が簡単で当たり前すぎて何が有難いのか さっぱりわからなかったという人向けの参考文献 • Grengard & Rokhlin(1988), “The rapid evaluation of potential fields in three dimensions” • Epton & Dembart(1995) “Multipole translation theory for the three-dimensional laplace and helmholtz equations” • van Gelderen(1998) “The shift operators and translations of spherical harmonics”
  • 4.
    2 Solid Harmonics いきなり「定義はこう」で申し訳ないが、‘Regular’と ‘Singular’ のものを m (|m|−m)/2 R (r, θ, φ) = (−1) S m (r, θ, φ) = (−1) r |m| imφ P (cos θ)e , ( + |m|)! +(|m|+m)/2 ( − |m|)! |m| imφ P (cos θ)e , +1 r (1) (2) とする。P m は Legendre の陪多項式。ちなみに普通の球面調和関数は Y m (r, θ, φ) = (−1) (|m|−m)/2 s 2 + 1 ( − |m|)! |m| imφ P (cos θ)e . (3) 4π ( + |m|)! m の符号反転に対しては単なる複素共役にならず、R−m = (−1)m [Rm ]∗ , S −m = (−1)m [S m ]∗ となっている。 後々のため、S m の定義には (−1) +m の因数を含ませた。 ! +m 2 +1 (−1) r m Sm R = ( + m)!( − m)!
  • 5.
    3 多重極能率と局所展開 球座標での Laplace方程式 ∇2 Φ(r, θ, φ) = 0 の一般解はさっきのを用いて、 Φ(r, θ, φ) = ∞ X X h m m L R (r, θ, φ) + M m S −m i (r, θ, φ) , (4) =0 m=− と書ける。係数の Lm を local expansions(局所展開) M m を multipole moments 、 (多重極能率)と呼ぶことにする。それぞれ展開中心を rL 、rM として、 P2M: M m = X m qi · R (rM − ri ) (5) i M2P: Φ(r) = p λ X X µ −µ Mλ Sλ (r − rM ) (6) λ=0 µ=−λ L2P: Φ(r) = p λ X X λ=0 µ=−λ µ µ Lλ Rλ (r − rL ) (7)
  • 6.
    4 全然「特殊」関数じゃないです デカルト座標で低次のものを書き下してみた。 (l, m) (0,0) (1, 0) (1, 1) (2, 0) (2, 1) (2, 2) Rm 1 z −(x + iy)/2 (3z 2 − r2 )/4 −z(x + iy)/2 (x + iy)2 /8 Sm 1/r −z/r3 −(x + iy)/r3 (3z 2 − r2 )/r5 3z(x + iy)/r5 3(x + iy)2 /r5 特に Rm は 次の斉次多項式。因数に (x + iy)m 。
  • 7.
    5 計算方法 ˜ P m(r, z) = r · (r sin θ)−m · P m (cos θ) ∈ R としておくと ˜ P m (r, z) · (x + iy)m = r · P m (cos θ) · eimφ 。あとは漸化式 ˜ P m (r, z) = 8 (−1)m (2m − 1)!! < m ˜ (2 − 1)z P −1 (r, z) : 2 − 1 z P m (r, z) − ˜ −1 −m + m − 1 2 ˜m r P −2 (r, z) −m ( = m) ( = m + 1) ( ≥ m + 2) (8) • • • • !! は二重階乗、n!! = n · (n − 2)!!, 1!! = 0!! = 1 m m ループを外側に、対角成分 Pm から を育てる Rm は division/square-root free 1.0/(int), 1.0/factrl(i) はテーブルで覚えておく
  • 8.
    6 八象限対称 Rm (−x,−y, −z) = (−1) Rm (x, y, z), Rm (x, −y, z) = (−1)m R−m (x, y, z), Rm (−x, y, z) = R−m (x, y, z), Rm (−x, −y, z) = (−1)m Rm (x, y, z), 等々。コードの再利用にも有効。 S −m をよく使うが、これは ∝ (−1) +m R−m なので 引数に (−x, y, −z) を入れればいい。 (9)
  • 9.
    7 昇降演算子 (LadderOperators) ここが一番重要!(ただし証明略) デカルト座標の偏微分で添字を変化させる。 ( ∂x + i∂y ∂z −∂x + i∂y ( ) (Rm (r) S m (r)) = Rm+1 (r) −1 m R −1 (r) Rm−1 (r) −1 S m+1 (r) +1 m S +1 (r) S m−1 (r) +1 ) . (10) ±|m| = (±∂x + i∂y )|m| (∂z ) −|m| を定義しておくことで、 µ µ+m µ µ+m Dm Rλ = Rλ− 、Dm Sλ = Sλ+ 。 0 0 R0 = 1、S0 = 1/r も思い出して D−m Rm = 1、S m = Dm (1/r)。 +1 −1 0 2 2 2 Laplace 方程式:D1 D1 [ ] = D2 [ ] ⇔ (∂x + ∂y + ∂z )[ ] = 0 演算子 D
  • 10.
    8 局所展開 [D −m µ Rλ (r)]r=0= δ λ δmµ , (11) を考えれば、真空ポテンシャル場から Lm を抽出できる: Φ(r) = ∞ λ X X µ µ m Lλ Rλ (r − rL ) ⇒ L = [D −m Φ(r)]r=rL . (12) λ=0 µ=−λ つまり任意の場所で局所展開の係数が手に入る。よって Taylar 展開は、 Φ(r + ∆r) = ∞ λ X X µ −µ Rλ (∆r)[Dλ Φ(r)]. (13) λ=0 µ=−λ これは任意の Laplace 方程式の解 Φ(r) に適用できる。 ∆r の半径内が真空なら有効) (
  • 11.
    9 加法定理 Rm (r)も S m (r) も Laplace 方程式の解であった。よって先程の展 開を適用すると以下の加法定理を得る: Rm (r + ∆r) = λ ∞ X X µ Rλ (∆r)Rm−µ (r), −λ (14) −(m+µ) µ Rλ (∆r)S +λ (r). (15) λ=0 µ=−λ S −m (r + ∆r) = ∞ λ X X λ=0 µ=−λ 余白にもう一度、 Φ(r + ∆r) = ∞ λ X X λ=0 µ=−λ µ −µ Rλ (∆r)[Dλ Φ(r)].
  • 12.
    10 1/r ポテンシャルの展開 0 S0(r) の加法定理として、 1 rS − rR 0 = S0 (rS − rR ) = ∞ X X S −m m (rS )R (−rR ) =0 m=− 3 2 ∞ X rR X ˆ m ˜∗ m 4π 4 = Y (θS , φS ) Y (θR , φR )5 r +1 2 + 1 m=− =0 S ∞ X rR = P (cos θSR ), +1 r =0 S with for rS cos θSR = (rS · rR )/( rS 後ろ2行とかは教科書にも載っているかも。 > rR , rR ). (16)
  • 13.
    11 M2P, M2L 1 r− ri = ∞ X X S −m m (r − rM )R (rM − ri ), =0 m=− よりただちに M2P が確認できる: M m = X m qi · R (rM − ri ) ⇒ Φ(r) = i p λ X X µ −µ Mλ Sλ (r − rM ). λ=0 µ=−λ Φ(r) に D−m をあてて局所展開を作ると、 M2L: m L = p λ X X λ=0 µ=−λ µ −(m+µ) Mλ S +λ (rL − rM ). (17)
  • 14.
    12 M2M 展開中心を rMから rM にシフトすることを考える。 Rm の加法定理から、 Rm (rM − ri ) = λ ∞ X X µ Rλ (rM − rM )Rm−µ (rM − ri ). −λ λ=0 µ=−λ P i qi を適用することで、 M2M: M m = λ X X µ M m−µ Rλ (rM − rM ). −λ λ=0 µ=−λ オーバーフローを避けるために、µ のループ範囲は、 max(−λ, m − ( − λ)) ≤ µ ≤ min(λ, m + ( − λ)). (18)
  • 15.
    13 L2L Φ(r) = ∞ λ XX µ Lµ Rλ (r − rL ) ⇒ Lm = [D−m Φ(r)]r=r L , λ λ=0 µ=−λ を新しい展開中心 rL でもう一度展開するだけ: L2L: L m = p λ X X µ−m Lµ Rλ− (rL − rL ). λ (19) λ= µ=−λ ついでに、ポテンシャルの勾配は Φ(rL + dr) = L0 + (− L1 )dx + ( L1 )dy + L0 dz, (20) 0 1 1 1 で得られるので、L2P のかわりに p = 1 の L2L を使うと実装が楽。
  • 16.
    14 配列への格納 0 ≤≤ p, |m| ≤ のとき Rm や M m は 1 + 3 + 5 + . . . + (2p + 1) = (p + 1)2 個の複素数からなる。 R−m = (−1)m [Rm ]∗ を考えると実効的に (p + 1)2 個の実数 でよい。1例として一次元配列 Xi (0 ≤ i < (p + 1)2 ) に、 { |m| R (m ≥ 0) X ( +1)+m = , (21) |m| R (m < 0) のように格納できる。
  • 17.
    15 実行列化 複素数での線形変換 L m = p X λ X G m,µ µ M ,λ λ λ=0µ=−λ 2 3 p λ X X m,µ µ m,−µ −µ 5 4Gm,0 M 0 + = (G M +G M ) , λ ,λ ,λ λ ,λ λ µ=1 λ=0 (22) を頑張って実数の変換で書くと、 L m = p X λ=0 p X 2 4Am,0 M 0 + λ ,λ λ X n µ=1 m,µ m,µ (A +C ) ,λ ,λ µ m,µ m,µ M + (−B +D ) λ ,λ ,λ 2 λ X n m,µ m,µ m,0 0 m 4B (B +D ) Mλ + = L ,λ ,λ ,λ µ=1 λ=0 ここで、Am,µ + iBm,µ ,λ ,λ = G m,µ , ,λ C M µ m,µ m,µ + (A −C ) λ ,λ ,λ m,µ m,µ m,−µ + iD = (−1)µ G . ,λ ,λ ,λ M M o 3 µ 5 , λ o 3 µ 5 , λ
  • 18.
    16 まとめ • 書いてみるとそれなりに式が沢山になった •とはいえ「FMM の算数」の最短コースだったと思います • §8, §9 あたりは画期的かもしれないです (普通は §10 から始まる)