この実装は、ファインマンのスカラー重力理論で必要となるテンソル量の組み合わせから、独立なスカラー量を生成するためのアルゴリズムです。
参照: https://x.com/7shi/status/1959100031790981364
-
$h = {h^{\mu}}_{\mu}$ (トレース) -
$(\partial h) _ {\alpha} = \partial _ {\mu}{h^{\mu}} _ {\alpha}$ (発散)
-
$S_1 = 16$ (既知) $S_2 = 43$ $S_3 = 93$ $S_4 = 187$ $S_5 = 344$ $S_6 = 607$
このアルゴリズムは以下の手順で独立なスカラー量を生成します:
-
テンソル組み合わせ生成: 与えられた
$h$ と$\partial h$ の個数から、すべてのインデックスペアリングを生成 -
第1段階正規化:
normalize2
による標準化(インデックス付け替えとトレース処理) -
対称性フィルタリング:
filter_pairings
による同一テンソル間の対称性を考慮した重複除去
テンソル量を表現するクラス:
class Tensor:
def __init__(self, partial, index_abs, index_rel)
パラメータ:
-
partial
: Boolean - 微分テンソル($\partial h$ )かどうか -
index_abs
: int - 絶対的なテンソル番号 -
index_rel
: int - 相対的なテンソル番号
インデックス構造:
- 非微分テンソル(
$h$ ):[0, 0]
(2つの対称インデックス) - 微分テンソル(
$\partial h$ ):[0, 1, 1]
(1つの微分インデックス + 2つの対称インデックス)
個別のテンソルインデックスを表現:
class Index:
def __init__(self, tensor, index)
すべてのインデックス間のペアリング(縮約)を生成します。キャッシュ機能により、同一の部分構造の重複計算を避けます。
-
トレース分離: 同一インデックスのペア (
$h _ {\mu\mu}$ ) を分離 -
インデックスソート: 非トレースペアを
.index
でソート - 出現順マッピング: テンソル番号を出現順で付け直し
-
最終正規化:
normalize1
で標準形に変換
- H テンソル:
hmap.setdefault(i, len(hmap))
- P テンソル:
pmap.setdefault(i, len(pmap) + hnum)
- H-H対称性: 同種の非微分テンソル間の交換対称性
- P-P対称性: 同種の微分テンソル間の交換対称性
- トレースペア除外: トレースを持つテンソルは対称性操作から除外
filter_with
で第1段階正規化を適用- 各ペアリングについて:
- トレースペアを除外してテンソル番号リストを作成
- H同士、P同士の組み合わせ(
combinations(hs, 2)
等)を生成 - すべての組み合わせの順列を試行
- 重複チェックのため
all_set
に登録
- h=2,p=2: 78 → 48 → 43 (最終効果 1.8倍削減)
- h=3,p=2: 322 → 155 → 93 (最終効果 3.5倍削減)
- h=4,p=2: 1242 → 475 → 187 (最終効果 6.6倍削減)
- レベル別キャッシュによる重複計算回避
- Set-based重複検出による高速フィルタリング
-
h
: 非微分テンソル($h_{\mu\nu}$ )の個数 -
p
: 微分テンソル($\partial_{\lambda}h_{\mu\nu}$ )の個数
- 独立なスカラー量の個数
$S_n$ (n = h)
h | p | 初期ペアリング | filter_with | filter_pairings | 所要時間 |
---|---|---|---|---|---|
2 | 0 | 2 | 2 | 2 | 一瞬 |
0 | 2 | 6 | 5 | 5 | 一瞬 |
1 | 2 | 19 | 16 | 16 | 一瞬 |
2 | 2 | 78 | 48 | 43 | 一瞬 |
3 | 2 | 322 | 155 | 93 | 1秒未満 |
4 | 2 | 1,242 | 475 | 187 | 6秒 |
5 | 2 | 4,468 | 1,399 | 344 | 22秒 |
6 | 2 | 15,098 | 3,924 | 607 | 32分 |
最終的な結果(filter_pairings)は理論予測と完全に一致しています。
対称性を考慮しない総当たりのペアリングは (h+3)! となります。初期ペアリングでは、数え上げの際にある程度の重複を排除しています。