collatz-m4m6 は、コラッツ型写像 T(n) = (xn+1)/2d の
m4/m6 ペア述語分解に基づく解析ツールである。
v0.2.0 では Vec<u64> パックドビット表現と
Kogge-Stone 並列プリフィックススキャンを導入し、
v0.1 初期の逐次走査から大幅な構造改善を達成した。
しかし、区間検証(sweep)における実測速度では、 u128 直接演算の約4.4億 nums/s に対し、 ペアscan経由の処理は数桁遅い結果となった。 本レポートではこの速度差の構造的原因を分析し、 ペア述語分解の計算論的意義と今後の展望を述べる。
Intel Core i7-12650H (Alder Lake, 10C/16T), 64GB DDR5 環境。 Phase1(u128 直接演算)の ON/OFF と GPK 統計収集の ON/OFF の4条件で計測。
| 条件 | 経過時間 | 速度 (nums/s) | GPK | Phase1 |
|---|---|---|---|---|
| u128 のみ | 0.113s | ~442,000,000 | OFF | ON |
| u128 + GPK統計 | 2.243s | ~22,300,000 | ON | ON |
| Packed のみ | 9.516s | ~5,250,000 | OFF | OFF |
| Packed + GPK統計 | 12.546s | ~3,990,000 | ON | OFF |
u128 のみ(0.113s)と Packed のみ(9.516s)の速度差は約84倍。 3n+1 ではほぼ全数が u128 Phase 1 で完結するため、この差がそのまま出る。 GPK 統計の ON/OFF による差は u128 で約20倍。
5n+1 は発散系列を含むため、停止時間に到達しない数が存在する。同じ4条件で計測。
| 条件 | 経過時間 | 速度 (nums/s) | GPK | Phase1 |
|---|---|---|---|---|
| u128 のみ | 1.667s | ~30,000 | OFF | ON |
| u128 + GPK統計 | 3.555s | ~14,100 | ON | ON |
| Packed のみ | 2.118s | ~23,600 | OFF | OFF |
| Packed + GPK統計 | 3.995s | ~12,500 | ON | OFF |
5n+1 では発散によりビット長が増大し u128 をオーバーフローするため、 Phase 1 の恩恵が限定的となる。 u128 のみ(1.667s)と Packed のみ(2.118s)の差は1.27倍に縮小。
1ステップあたりの命令数を128bit幅で正規化した比較を示す。
| 処理 | 命令数 / 128bit | メモリアクセス | 分岐 |
|---|---|---|---|
| u128 (MUL+ADD+TZCNT+SHR) | 4 | なし(レジスタ完結) | なし |
| BigUint (多倍長乗算) | ~6 | Vec<u64> ヒープ | ループ制御 |
| Packed scan (Kogge-Stone) | ~25 | Vec<u64> ×2 ヒープ | ワードループ |
u128 の演算は CPU の乗算器回路で直接実行される。 Intel Alder Lake の整数乗算パイプラインは 64bit×64bit を 3–4 クロックサイクルで完了し、 128bit 結果をレジスタペアに格納する。 この処理にはメモリアクセスが一切発生せず、パイプラインを止める分岐もない。
これは数十億ドル規模の半導体設計投資が生んだハードウェア最適化であり、 ソフトウェアで組んだビット演算が同じ土俵で競うことは原理的に不可能である。
コラッツ型写像は T(n) = (xn+1)/2d であり、 x は 3, 5, 9 等の小さな定数である。 これは「大きな整数 × 小さな定数」という乗算パターンに該当し、 多倍長乗算の中でも最も単純なケースとなる。 BigUint × 定数は各 limb に対して MUL + ADC の2命令で済み、O(n) で完了する。 ペアscan も O(n) であるため、漸近的計算量は同一だが、定数倍で BigUint が常に有利となる。
3n+1 の区間検証では、u64 範囲の入力の大多数が平均3–5ステップで初期値を下回り、 停止時間に到達する。この間、値は u128(128bit)を超えることがほとんどなく、 ペアscan(Phase 2)に遷移する数は極めて少ない。 つまり sweep を速くするということは u128 ループを速くするということであり、 packed scan の改善は sweep 速度にほぼ寄与しない。
v0.1 から v0.2 にかけて、ペアscan 自体は大幅に改善されている。 しかしそれは sweep 速度の改善ではなく、構造解析の効率化としての改善である。
| 版 | 内部表現 | キャリー解決 | 改善 |
|---|---|---|---|
| v0.1 初期 | Vec<u8> per bit | 1ビットずつ逐次 | ベースライン |
| v0.1 高速パス | u128 + BigUint | CPU乗算器 | sweep 実用化 |
| v0.2 現行 | Vec<u64> (64ペア/ワード) | Kogge-Stone (6段) | メモリ8倍改善 |
パックド化により、メモリ効率は8倍、ワード内キャリー解決は約10倍に改善された。 しかし sweep のホットパスは u128 Phase 1 であり、 これらの改善は Phase 2 到達時にのみ効果を発揮する。
GPK ON/OFF の切替機構を導入し、統計不要時は
Vec<u64> 確保・ストア・popcount・max_carry_chain ループを全スキップする設計とした。
これにより GPK OFF 時の 3n+1 sweep は u128 演算のみとなり、442M nums/s を達成した。
一方 GPK ON 時は accumulate_gpk_u128 のビット逐次ループがボトルネックとなり
22M nums/s に低下する。
この約20倍の差が示すのは、GPK 統計収集コスト自体が演算本体より圧倒的に重いという事実である。
ペア述語分解は乗算を使わないため、漸近的計算量において構造的優位性を持つ。 ビット幅が十分に大きくなると、直接乗算の超線形コストに対して ペアscan の線形コストが優位になるクロスオーバーが理論的に存在する。
| ビット幅 | 直接乗算 | ペアscan | 備考 |
|---|---|---|---|
| ~128 | ネイティブ MUL O(1) | ビット演算 ~30命令 | u128圧勝 |
| ~256 | 多倍長 MUL 4回+加算 | Kogge-Stone 1ワード | BigUint有利 |
| ~1,000 | Karatsuba O(n1.58) | O(n) | 漸近的にペア有利 |
| ~10,000+ | FFT O(n log n) | O(n), 定数小 | ペアscan優位 |
補足: コラッツ型写像は「大数 × 小定数」であり、BigUint × 定数も O(n) で完了する。 したがって、一般的な多倍長乗算のクロスオーバー表とは異なり、 定数 × n の乗算に限定すれば漸近的計算量は同一(ともに O(n))となる。 実測では 32,768bit でも BigUint が約100倍速く、 コラッツ写像の文脈での速度クロスオーバーは実用的に到達しない。
ペア述語分解は、コラッツ写像の1ステップを乗算ではなく 加算器のキャリー伝播として透明に分解する。 その副産物である GPK 分類(Generate/Propagate/Kill)は、 キャリーの生成・伝播・消滅を各ペア位置で定量化し、 数値の成長/縮小メカニズムを統計的に観測可能にする。
3n+1 写像について、3 から 9,999,999,999(≈ 233)の全奇数 49.9億個を検証した結果から得られた GPK 統計を示す。
G(キャリー生成)= 113,183,623,064 (38.16%)
P(キャリー伝播)= 81,071,432,343 (27.34%)
K(キャリー消滅)= 102,328,662,110 (34.50%)
総ペア数 = 296,583,717,517
総ステップ数 = 17,463,252,353
全数収束(最大停止時間 282, n = 2,788,008,987)
キャリーチェーン長の分布:
| チェーン長 | 出現回数 | チェーン長 | 出現回数 |
|---|---|---|---|
| 1 | 265,878,320 | 14 | 38,274,610 |
| 2 | 1,842,752,124 | 15 | 22,412,468 |
| 3 | 3,494,167,747 | 16 | 12,790,339 |
| 4 | 3,634,880,654 | 17 | 12,412,547 |
| 5 | 2,871,874,977 | 18 | 2,519,910 |
| 6 | 1,991,272,449 | 19 | 415,078 |
| 7 | 1,293,719,531 | 20 | 69,568 |
| 8 | 814,361,343 | 21 | 11,275 |
| 9 | 501,167,658 | 22 | 1,579 |
| 10 | 304,639,101 | 23 | 337 |
| 11 | 183,966,569 | 24 | 32 |
| 12 | 110,232,559 | 25 | 6 |
| 13 | 65,431,568 | 26 | 4 |
G% > K% であるにもかかわらず全数が収束するのは、 G が1ビット高々1の寄与であるのに対し、 d(2d での除算)が平均的に G の効果を上回るためである。 キャリーチェーン長の分布は 4–5 にピークを持ち、最大は 26 である。 これは、キャリー伝播が局所的に留まり、 長距離伝播が指数的に稀であることを示す。
この知見 — キャリーの局所性、G/K 比率の安定性、チェーン長の幾何分布 — は 乗算ベースのアプローチからは直接得られない構造情報であり、 ペア述語分解の固有の価値である。
Kogge-Stone アルゴリズムは元来ハードウェア加算器の設計手法であり、 ペア述語分解を FPGA/ASIC で実装すれば、 乗算器を経由せずにコラッツ写像の1ステップを加算器の深さ O(log n) で完了できる。 固定幅に制約されない点も利点であり、回路設計上の自然な拡張性を持つ。
ただし、本論文の主張は「最速のコラッツ計算の実現」ではない。 回路化は本手法が加算器構造に直接写像されるという理論的整合性の一例として示すものであり、 ペア述語分解の計算論的意義をパフォーマンス比較に帰結させるものではない。
ペア述語分解の実用上の明確な利点は、GPK 統計の取得コストにある。 実測ベンチマーク(セクション2)から、GPK 統計収集の有無による速度差を比較する。
| GPK OFF | GPK ON | GPK オーバーヘッド | |
|---|---|---|---|
| u128 演算 | 442M nums/s | 22M nums/s | 約20倍低下 |
| Packed scan | 5.25M nums/s | 3.99M nums/s | 約1.3倍低下 |
u128 直接演算では、GPK 統計を取得するために乗算とは別のパスで ビット分解を行う必要があり、これが約20倍の速度低下を引き起こす。 一方、ペアscan では GPK はスキャン過程の副産物として自然に得られるため、 追加コストは1.3倍に留まる。
GPK 統計が必要な場面(すなわち本論文の分類検証)での実質的な比較は:
u128 + GPK: 22M nums/s
Packed + GPK: 4M nums/s
速度差: 約5.5倍(GPK 不要時の84倍から大幅に縮小)
ペアscan は「遅いが構造が見える」のではなく、 「構造を見るならば計算速度をほぼ欠損しない」手法である。
論文が示すのは写像の構造的性質であり、ソフトウェアベンチマークの勝敗ではない。 ペア述語分解は、コラッツ写像を加算器のキャリー伝播として透明に分解し、 GPK 統計という定量的解析手段を演算の副産物として提供する。 これが本ツールの存在意義であり、分類論文の検証基盤としての価値である。
ペアscan の速度改善と、ペア述語分解の構造的価値を活用する方向の両面で展望を整理する。
| アプローチ | 概要 | 期待効果 | 適用領域 |
|---|---|---|---|
| SIMD (AVX2/512) | 256/512bit幅で複数ワード同時処理 | 理論4-8倍 | packed scan本体 |
| ワード間並列化 | Kogge-Stoneをワード間にも適用 | 大数で有効 | 1000bit以上 |
| 篩(ふるい) | GPK分類で収束確定の剰余類をスキップ | 数学的削減 | sweep全体 |
| SIMD複数数並列 | AVX2で4つのu64数を同時走査 | 理論4倍 | sweep (u64範囲) |
| FPGA/ASIC回路化 | ペア述語分解を加算器回路として実装 | 1クロック/ステップ | 理論的整合性の実証 |
GPK 分類に基づく剰余類解析により、 「この剰余類は必ず K 優勢 → 収束確定」という定理が導出できれば、 数学的にスキップ可能な数を事前に除外できる。 これはペア述語分解が速度にも直接貢献する唯一の経路であり、 ツールの存在意義を最も強く正当化する方向性である。
AVX2 (256bit) では4ワード、AVX-512 (512bit) では8ワードを同時処理でき、 Kogge-Stone のワード内演算を SIMD 化すれば理論的に4–8倍の改善が見込める。 ただし sweep のホットパスが u128 である限り、 packed scan の高速化は大きい数のトレース用途に限定される。
現在の実装ではワード間キャリーは逐次伝播
(carry_out = carry_after >> 63 → 次ワードへ)である。
ワード間にも Kogge-Stone を適用すれば、k ワードのキャリー解決が O(log k) に改善される。
1000bit 以上の大きい数で有効だが、sweep の u64 入力範囲には影響しない。
ペア述語分解を FPGA 上の加算器回路として実装し、 乗算器なしでの1クロック/ステップ動作を実証することが、 本手法の回路的整合性の検証となる。 Kogge-Stone プリフィックスツリーを並列に配置し、 参照パターンの配線を固定すれば、 任意幅のコラッツステップが加算器の段数(O(log n))で完了する回路を構成できる。
collatz-m4m6 v0.2.0 の実測速度は u128 直接演算に対して数桁劣る。 しかしこの差は「CPU 乗算器ハードウェア vs ソフトウェアビット演算」という 非対称な比較の結果であり、ペア述語分解のアルゴリズム的価値を否定するものではない。
ペア述語分解が提供するのは、コラッツ写像を加算器のキャリー伝播として透明に分解し、 GPK 統計という定量的解析手段を与えることである。 GPK 統計が必要な場面では、ペアscan のオーバーヘッドは1.3倍に留まり、 u128 演算の20倍のオーバーヘッドに対して実質的な優位性を持つ。
述語体系の話と速度は独立である。 本ツールの価値は、コラッツ写像の構造を可視化し、 分類論文の検証基盤を提供する点にある。 速度はその手段であって目的ではない。