空間の観測と接続

主な成果候補は、有限実木の距離観測に対する「有限誤差の完全な曲線」と、独立な直線上の不確実位置に対する「固定/可変接続の最良係数」である。 両者の一般証明・達成例・再現検証を収録する。照合した一次資料では、これらの主結果それぞれと同一の定理を特定できていない。ただし、先行発表の不存在は証明しておらず、学術的新規性は未確定である。

追加の文献照合を踏まえ、距離座標・安定性の一般論・全配置連結性という問題設定を既存研究に帰属させる。葉への基準点移動や最良推定誤差への換算は、主成果を支える短い帰結として扱う。証明を記録したことと、初めて発見されたことは別の判定である。

S2 — Sharp robust adaptivity gap. For every n ≥ 2, the supremum, over families of n nonempty bounded closed intervals on the real line with independently chosen positions and positive adaptive cost, of the optimal fixed-tree bottleneck cost divided by the realization-adaptive bottleneck cost is ⌈n/2⌉.

この係数は区間族全体にわたる最悪比であり、各入力で必ず比が等しくなるという意味ではない。

主張別の新規性判定

「主候補」は、文献との差を独立した主張として説明しやすいという評価であり、新規性の確率を意味しない。「短い帰結」は数学的な依存関係の評価で、同一の式が既刊文献に掲載済みという断定ではない。

主張 既存研究との重なり 今回残る差分・評価
S1.1 距離座標・射影恒等式・単射条件 距離写像、木の識別構造は既知 導入・補題。新規性の中心に置かない
S1.2 最良の逆Lipschitz係数 定量的歪み・局所等長性は既知 枝長と付け根間隔による正確な係数は同一結果未確認。ただし恒等式から短い最適化で得る
S1.3 有限誤差の曖昧さ直径 一般的な安定性、等しい観測の緩和識別は既知 任意の有限基準点集合、非単射を含む閉形式・跳躍の位置と量が主候補
S1.4 最良推定誤差 = 半直径 最適回復・情報半径と実木の中心原理 既知原理の直接の系。木より広い復元先でも成立する
S1.5 全点対を同時に改善する葉配置 葉を用いた最小識別集合は既知 同一の数値優越文言は未特定だが、凸包幾何からの短い帰結。補助命題として収録
S2.1 固定/可変接続比 ≤ ceil(n/2) 可変側のWCU、固定側のrobust bottleneckは既知 二つの最適値を結ぶ、全nで最良の比較係数が主候補
S2.2・S2.3 短い区間による構造定理 区間交差グラフと道の中心を使う技法は初等的 短い区間だけの連結性・長い区間の端点条件という必要十分条件と、鋭い強化係数が主候補
S2.4 高速計算・凸包不変性 ソート、隙間、極端配置の利用は既知の基本技法 R_A の同一公式は未確認。R_F は既知のBorůvka法を特殊化して O(n log n) で計算。補助的な計算法・系として扱う
S2.5 独立性を外した相関反例 固定/可変という一般的な量化の差 仮定の必要性を示す境界例。独立した新規性を主張しない

S1では Ilmavirtaほかのtravel-time理論木のmetric dimension実木の中心原理 が主要な比較先となる。S2では ChambersほかのWCUKasperski–Zielińskiのrobust bottleneck還元 が直接の出発点になる。

外部の専門家へ優先して照合を求める単位は、S2の最良係数と構造定理、次にS1の全誤差曲線である。 S2は上界・各nの等号例・短区間数による強化まで一体の主張になっている。S1は既知の距離写像に対する明示的な特殊化として、その正確な式に価値がある。どちらも既存の一般原理そのものを新たに発明したとは位置づけない。

二つの結果を動かして見る

S1 の図解 — 小さな観測誤差が、大きな位置の曖昧さを生む

基準点 S₁・S₂ に対する距離を測る。幹の各辺は長さ 1、外枝は各 10。距離は木の道に沿って測る。

長い外枝が二本ある木 幹は S1、b、c、S2 の順で、三つの辺は全て長さ1。bからX、cからYへの外枝はそれぞれ長さ10。図は長さの縮尺を表さない。XとYの距離は21だが、二つの距離観測の差は各1。 XYS₁bcS₂1111010 模式図:線分の長さは縮尺を表さない
X の観測は (11, 12)、Y は (12, 11)。真の位置は 21 離れているが、観測の最大成分差は 1。
最良の最悪位置誤差 E と、各観測の許容誤差 ε 横軸は各観測の誤差 ε、0から1。縦軸は最良の推定器の最悪位置誤差 E。εが0.5未満ではEはε。εが0.5に達した時点で10.5となり、その後は10.5。0.5,0.5は空丸、0.5,10.5は塗丸。二点を結ぶ関数線はない。 0510.5 00.51 Eε E = 10.5 E = ε
空丸は値に含まれず、塗丸は含まれる。ε = 0.5 での飛びを、連続な線で補間していない。

E(ε) = ε (0 ≤ ε < 0.5)、E(ε) = 10.5 (ε ≥ 0.5)

0.49
最良の最悪位置誤差 E(ε)
0.49
曖昧さ直径 A(2ε)
0.98

この数値は全ての真の位置・許容誤差についての最悪値。推定器は木の任意の点を返せる。平均的な誤差や、今の受信値だけの誤差を表すものではない。

ε = 0.49 では、離れた二本の外枝の候補はまだ同じ受信値に重ならない。

S2 の図解 — 接続を先に固定するための、ちょうど必要な代償

n − 1 個の点を 1, …, n − 1 に固定し、残りの点だけが区間 [0, n] を動く。可変接続は位置を見た後で木を選び、固定接続は全ての位置に備えて同じ木を使う。

6
0.00
六つの点の接続。可変接続と固定接続の比較 初期例は n=6、動く点は x=0、固定された五点は1から5。上段の可変接続は位置の順に隣を結び、今の最大辺は1。下段の固定接続は固定された五点の鎖に、動く点と位置3の点の辺を加え、今の最大辺は3。全配置での最悪値は、最良の可変接続が1、最良の固定接続が3。 可変:位置の順で、隣同士を結ぶ 固定:固定点の鎖 + 点 j への1辺 12345123450606 長さ 3.00 青い輪:移動点 x = 0.00 固定する接続先:j = 3
上下の点の位置は同じ。青い輪が移動点、黒点が固定点。固定接続の弧は「どの点同士を結ぶか」を示し、辺長は横軸上の距離 |x − j|。点が重なるときもラベルは別の点で、間の辺長は 0。
可変接続:今の配置の最大辺
1.00
全配置での最悪値 RA = 1
固定接続:今の配置の最大辺
3.00
全配置での最悪値 RF = 3

この区間族では RA = 1、RF = ⌈6/2⌉ = 3。

移動点をいつも点 j = 3 に結べば、辺長はどの位置でも 3 以下。どの固定木にも移動点につながる辺が必要なので、これより小さい保証にはできない。

先行研究との詳しい比較

S1:同じ距離写像を扱う研究との境界

Ilmavirta・Kykkänen・Lassas・Saksala・Shedlock の Lipschitz Stability of Travel Time Data は、測定集合への距離関数を sup ノルムで比較する、まさに同じ観測写像を使う。定義1、注意11、命題17・23では、実木の全葉を観測する等長な場合や、局所等長性の条件が扱われる。したがって、距離座標や安定性という発想を新規とはしない。本稿の差分は、任意に固定した有限の測定集合について、枝長・付け根の間隔から最良係数と全誤差曲線を評価し切ることにある。原著本文

比較する既知結果 本稿と共通する部分 同一主張とはいえない理由
Khullerほか:木のmetric dimension 識別を妨げる無観測の枝、葉を用いた識別集合 主題は識別集合の最小個数。実数辺長・辺内部を含む固定集合の最良係数を直接与えない
Ilmavirtaほか:travel-time representation 同じsupノルムの距離観測、等長性・局所安定性 主結果は空間全体の安定な復元。有限誤差で生じる枝対の候補を列挙する本稿の閉形式とは別
Peterinほか:distance differences 距離差の「有無」だけでなく大きさを使う 座標ごとの絶対差を足す ℓ1 型の閾値。S1の ℓ∞ 誤差曲線とは目的が異なる
Mürmannほか:relaxed metric dimension 同じ観測を与える点同士の空間的な曖昧さ 完全に等しい署名を扱う。任意に小さい非零観測差と有界な数値誤差は別問題
Leほか:landmark distortion sup型距離下界と定量的な歪み ランダムグラフ等の確率的評価。本稿は固定された有限実木に対する厳密値

比較箇所:Khullerほか §2.1PeterinほかMürmannほか 定理3.1–3.2Leほか Algorithm 1・定理4.1。表は各論文の目的と量の比較であり、未読箇所まで同一結果の不存在を保証するものではない。

S1.2とS1.3の強さも分けて評価する。 射影恒等式から最良係数は二つの枝上の高さを動かす短い最適化で得られる。有限誤差曲線も初等的な計算ではあるが、観測上の距離が閾値に達したときだけ枝対が候補に入るため、全体を一つの最大値の式にすると、非単射の場合と跳躍量まで含む明示的な記述になる。式が簡潔であることは実用上の利点である一方、学術的新規性の強さや掲載価値を自動的に保証しない。

S1:新規性を弱める、より一般的な既知原理

最良推定誤差への換算は、既知原理の直接の系である。 実木内の有界集合は、直径の半分の半径の球で覆える。Aksoy–Oikhberg の定理6.2・注意6.4がこの幾何学的事実を与える。より一般に、hyperconvex な空間では、中心間距離が半径の和以下である球族の共通交点が存在するので、半直径の中心原理が成り立つ。原著 §2・§6

本稿による直接の導出は次の通りである。受信値に整合する集合を C とすると、その直径は A(2ε) 以下で、最良の最悪誤差は C の外接半径である。逆に観測差が 2ε 以下の任意の二点は、観測ベクトルの中点という同じ受信値を持ち得る。この上界・下界を合わせて E(ε)=A(2ε)/2 を得る。ここで新たに必要な計算は A 自体の評価であり、半分にするという原理ではない。

葉への移動も、既知の spanning・凸包構造から短く導ける。 Lang–Pavón–Züst は spanning を距離差の上限で定義し、補題2.4で木の凸包内の道を生成集合へ延長できることを述べている。原著 §2

そこから本稿で導く、数値優越を説明する式を示す。K=hull(S) を含むように葉集合 S′ を選ぶと、各 s∈S について

d(x,s)=maxtS{d(x,t)d(s,t)}(xT).

三角不等式が一方の不等式を与え、x から s を通る道を適切な t まで延長すると等号になる。この最大値演算は sup ノルムに関して 1-Lipschitz なので、元の観測 F_S は新しい観測 F_{S′} から誤差を増幅せずに復元できる。したがって全点対の観測差が改善する。同じ文言の既刊定理は未特定だが、独立した主要新定理として強調するより、配置最適化を有限探索に還元する補助命題として扱うのが妥当である。

距離関数の tight span の固定点性も、射影恒等式の背景にある。S 上の関数 f_p(s)=d(p,s)、p∈hull(S) は S の tight span に属するという木の凸包の既知性質と、Bryantほかの定理2.1(iii)が再掲する固定点性を合わせると、二つの距離関数の差は正側と負側で同じ最大幅を持つ。本稿の高さ h,k による定数シフトを加えると、観測差が d(p,q)+|h−k| になる。この接続は本稿の推論であり、当該論文が本稿の全誤差曲線を掲載しているという意味ではない。原著 §2.1

S2:量化順序を揃えて比較する

配置を x、ラベル上の全域木を T、配置における最大木辺を B_T(x) とする。似た題名の論文でも、以下の目的は異なる。

目的 数式 本稿との関係
有利な配置を選ぶbest-case接続 min_x min_T B_T(x) Cabello–Gajserなど。全配置の保証とは異なる
配置後に木を選べるworst-case接続 max_x min_T B_T(x) 本稿の R_A。ChambersほかのWCUと同じ目的
全配置を保証する固定木 min_T max_x B_T(x) 本稿の R_F。各辺を最大費用に置換する既知還元が使える
固定グラフの最悪総延長 min_T max_x Σ_e d_e(x) locational uncertaintyの主要な別目的。最大辺の比とは異なる

Chambersほかの §5 のWCUでは通信半径 α に対して距離 2α 以下を辺にするので、論文の最適半径と本稿の R_A には2倍の換算がある。同節の単位円盤に対する近似は、点区間と任意に長い区間を混在させる本稿の等号例を包含しない。WCUの定義・§5

Kasperski–Zieliński は、最悪シナリオ下のボトルネック問題が、各要素の費用を最大値に置き換えた確定問題へ帰着することを §3 冒頭で述べる。本稿では最大化同士の交換から

wij=maxxiIi,xjIj|xixj|=max(biaj,bjai)

を使った最小ボトルネック全域木になる。この還元を新規成果とはしない。比較の対象は R_A と R_F を結ぶ鋭い不等式である。原著 §3

位置が確定する前に辺集合を固定する発想も既存である。imprecise spanner は全実現で同じ辺集合に伸長比を保証する。ただし全対最短路の伸長と辺数が目的であり、固定/可変ボトルネック比の定理と同じではない。Poureidi–Farshi, 2024

S2:adaptivity gap の先行研究との比較

固定解と実現後に選ぶ解の差は、robust な adaptivity gap という既知の枠組みに属する。 本稿の R_F/R_A は、その最小化問題における比に当たる。Awasthi–Goyal–Lu (2019) と Bertsimas–Goyal–Lu (2015) は、連続の packing LP について、この差を不確実集合の構造から評価している。著者公開稿の定義と主要定理を照合したが、S2の木の選択・最大辺目的・独立位置区間を、そのまま同一の既刊定理とは特定できていない。Awasthiほか:著者公開稿 §1・§6、定理9Bertsimasほか:著者公開稿 §2・§4、定理3

比較軸 上記論文の主たるpackingモデル S2
実現後の決定 非負の連続ベクトル ラベル上の全域木
目的 線形報酬の最悪値を最大化 最大辺長の最悪値を最小化
不確実性 非負係数行列の集合と、その行・列の構造 独立な位置区間の直積。辺距離には相関が生じる
比の向き 可変解の報酬/静的解の報酬 固定木の必要距離/可変木の必要距離

位置が独立であることは、辺費用が独立な区間を取ることを意味しない。例えば I₁={1}, I₂={2}, I₃=[0,3] では R_A=1、R_F=2。可動点 x による距離は (d₁₂,d₁₃,d₂₃)=(1,|x−1|,|x−2|) で、最後の二成分は各々 [0,2] を取るが同時に2にはならない。各辺の範囲だけを独立に組み合わせると、位置配置からは生じない (1,2,2) を許し、可変値も2へ増える。これは既存論文への反例ではなく、モデルの取り違えによる帰着を排除する例である。

連続LPとの違いだけで、間接的な帰着の可能性まで否定してはいけない。既刊定理の直接の系とするには、両最適値と、不確実集合についての仮定を保存する帰着が必要である。この照合ではその帰着を得ていないため、係数と短い区間の構造を候補として残し、新規性未確定という判断を維持する。

S2:短い区間の構造は、既知の区間グラフだけで説明できるか

固定距離 r のrobust graphの辺条件は b_i−r≤a_j、b_j−r≤a_i である。これは signed interval/co-threshold-tolerance graph に現れる表現と対応し、幅が r 以下の区間だけに制限すると J_i=[b_i−r,a_i] の通常の区間交差グラフになる。原著の辺条件は厳密不等号だが、有限データでは端点を十分小さく摂動することで、同じ辺集合を持つ厳密不等号表現に直せる。この表現自体は新規ではない。Halldórsson–de Lima §2、定理3

一方、本稿の前提は「robust graph が連結」ではなく、各実現で、その実現に応じた辺を使えば連結という条件である。既知のグラフ構造だけではこの差を埋められないことは、小例でも分かる。

r=1、固定点区間 {0},{1} に加える区間 固定距離1のrobust graph 全配置連結性の値 R_A
[−1,2] 固定点同士の1辺と、孤立した長区間頂点 1
[−100,100] 固定点同士の1辺と、孤立した長区間頂点 100

両例は同じrobust graphと短長分類を持つが、全配置の接続保証が異なる。したがって、符号付き区間グラフという既知の表現だけから S2.3 の必要十分条件が直ちに出るわけではない。本稿では、長い区間の削除補題で全配置の量化を扱い、短い区間の連結性と長い区間の両端の確実な接続先を証明する。この構造を介して道の中央に接続先を選ぶと、最良係数 ceil((m+1)/2) が得られる。

高速公式と、2026年の隣接研究

全域木の最小ボトルネック値を「全cutの最小横断辺の最大」と書く一般原理は、Edmonds–Fulkerson の Bottleneck Extrema による blocker のmin–max定理の特殊例である。S2のcut表現そのものを新規とはしない。直線上で端点へ押し出し、cutをprefixに圧縮して R_A を O(n log n) で求める式は、その具体的な計算結果として収録する。原著 §2、pp.300–303

Löffler–Raichel の2026年の論文は、同じ不確実区間モデルで最大隙間を扱う。ただし目的は、前処理をした後に与えられた実現の隙間を高速に復元すること。定義19の量は最大隙間の下界で、全実現での最大値 R_A とは違う。§1.4・§5.2、定義18–19

Acharyyaほかの2026年の論文は、色が与えられた区間から代表点を選び、全色を含む最小区間を最大化する。2色の場合には異色点間の最小距離を最大化する目的になり、本稿の R_A はさらにcut、すなわち色分けにも最大を取る量である。論文の与えられた色に対するアルゴリズムを、そのまま本稿の最良比較係数と同一視できない。定義・§2–3

Consuegra–Narasimhan の Geometric Avatar Problems も候補位置から代表点を選ぶが、§2で扱うのは「最小隙間の最大化」と「最大隙間の最小化」である。本稿の「最大隙間の最大化」と固定木の比較とは異なる。§2、定理1–2

定理・仮定・完全な証明

以下は一般の入力に対する数学的論証である。有限検査の記録とは区別する。証明支援系による形式検証と、人間の専門家による査読は未実施。

S1:実木の観測差・最良係数・全誤差曲線・葉配置

1. S1:枝分かれ空間の距離観測

1.1 対象と誤差モデル

有限本の正の長さの辺からなる、閉路のない連結空間 T を考える。辺の途中も点として含める「有限実木」であり、距離 d は道に沿った長さである。平面に描いたときの直線距離ではない。まず diam(T)>0 とする。

有限非空の基準点集合 S を固定し、観測写像と観測差を

FS(x)=(d(x,s))sS,ρS(x,y)=FS(x)FS(y)

と定義する。三角不等式より常に ρ_S(x,y)≤d(x,y)。基準点が辺の途中にある場合も、その点で辺を分割すれば以下の議論は変わらない。

K=hull(S) を、全基準点を結ぶ最小部分木とする。π(x) は x から K への最近点で、一意である。K の外の部分木は、ただ一つの付け根を通って K とつながる。

1.2 S1.1:観測が残す情報の恒等式

p=π(x), q=π(y), h=d(x,p), k=d(y,q) とおく。このとき、単射性を仮定せず

ρS(x,y)=d(p,q)+|hk|.(T1)

証明。 全ての s∈S について、木の道の一意性から d(x,s)=h+d(p,s)。p=q なら直ちに成立する。p≠q のとき D=d(p,q) とおく。K が S の凸包であるため、p,q 自身を含めて道 [p,q] の両側に基準点が存在する。従って d(p,s)−d(q,s) の最大値と最小値は D と −D である。他の値はこの間にあるので、

ρS(x,y)=max{|hk+D|,|hkD|}=D+|hk|.

両極値を達成する基準点の存在を詳しく示す。q∈S なら s₊=q とすればよい。q∉S なら、K の葉は S に属するので q は葉ではなく、K∖{q} には p を含まない成分 C が存在する。この C に S の点がなければ、C を除いたより小さい連結部分木が S を含み、K の最小性に反する。従って s₊∈C∩S を選べる。道 [p,s₊] は q を通るため d(p,s₊)−d(q,s₊)=D。p,q を交換すると差が −D の基準点 s₋ も得られる。三角不等式による絶対値の上界 D と合わせ、両極値が ±D と確定する。∎

単射の必要十分条件。 各付け根から K の外へ出る部分が、根を端点とする一本の区間であること。すなわち、同じ付け根から二本以上の枝が出ず、その先にも枝分かれがないことである。

実際、外向きの二方向が分かれると、分岐から等距離にある別々の点は同じ根と高さを持ち、(T1) で識別不能になる。逆に各根の外側が一本の区間なら、ρ=0 は根と高さの一致を意味し、その点自身が一意に決まる。K 上の点は高さ0として含まれる。

1.3 S1.2:最悪増幅率の厳密式

単射の場合に、正の長さを持つ外枝の付け根を b、その長さを L_b とする。異なる付け根間の距離を D_bc=d(b,c)>0 とおく。

c(T,S):=infxyρS(x,y)d(x,y)=min({1}{DbcDbc+2min(Lb,Lc):b<c}).(T2)

b<c は、付け根対を重複なく数えるための任意の順序である。外枝が二本未満なら c=1。単射でなければ c=0。

証明。 同じ外枝内の二点、または少なくとも一方が K にある二点では ρ=d。異なる付け根からの高さ h,k の二点では

ρ=D+|hk|,d=D+h+k.

h≥k と仮定すると、比は 1−2k/(D+h+k) なので h を k まで減らすと増えない。次に h=k の共通値を増やすと D/(D+2k) は減少する。従って h=k=min(L_b,L_c) で最小になる。有限個の付け根対で最小を取れば (T2) を得る。∎

最良の逆Lipschitz係数、すなわち位置差/観測差の最大倍率は 1/c である。この量は、基準点が何個あるかだけでは決まらない。近接した分岐から長い無観測枝が伸びると、任意に大きくなる。

1.4 S1.3:有限の誤差でどこまで曖昧になるか

δ≥0 に対して

AS(δ):=max{d(x,y):ρS(x,y)δ}

を定義する。最大値はコンパクト性で達成される。単射の場合の完全な式は

AS(δ)=max({min(δ,diamT)}{min(Dbc+Lb+Lc, δ+2min(Lb,Lc)):b<c, Dbcδ}).(T3)

証明。 異なる外枝の対では、制約は D+|h−k|≤δ。δ<D ならこの対は実行不可能である。δ≥D とし、L_b≤L_c としてよい。h+k の最大値は、短い枝を h=L_b とし、もう一方を k=min(L_c,L_b+δ−D) に取ることで達成される。従って最大距離は min(D+L_b+L_c,δ+2L_b)。

残る対の距離は δ 以下である。一方、直径を与える道上には min(δ,diam T) 離れた二点があり、ρ≤d だからその対は必ず実行可能。これで上界と達成が一致する。∎

閾値の条件 D_bc≤δ は不可欠。A は連続とは限らない。 二本以上の外枝があるとき

Δ=minb<cDbc

とすれば、0≤δ<Δ では A_S(δ)=δ。最初の閾値では

AS(Δ)=Δ+2maxb<c:Dbc=Δmin(Lb,Lc)>Δ.(T4)

つまり、誤差がある幅に達した瞬間に、離れた枝の候補が一斉に現れる。局所等長性の存在そのものは既存のtravel-time理論で扱われており、ここでは木に対して閾値と跳躍量を明示した。

1.5 非単射の場合を含む一般式

各付け根 b に付く外部部分木の最大高さを H_b>0 とする。これらを K から外向きに根付ける。付け根自身も含め、二方向以上に外向きに分かれる頂点 z について、分岐点 z から測った各外向き方向の最大距離のうち大きい二つを α_z≥β_z>0 とする。

このとき一般の有限非空 S について

AS(δ)=max({min(δ,diamT)}{min(Dbc+Hb+Hc,δ+2min(Hb,Hc)):b<c, Dbcδ}{min(αz+βz,δ+2βz):z は外向き分岐}).(T5)

同じ根へ射影される二点が別方向へ分かれる場合、その最終共通点 z からの距離を u,v とすれば、ρ=|u−v|、d=u+v。長方形の中での最大化は (T3) と同じ計算になる。方向別の高さを増やすほど候補値は増えるので、各分岐では大きい二つだけを使えばよい。同じ方向の祖先・子孫の対では ρ=d。他の根の対は (T1) と H_b を用いる。この分類で全対を覆い、各項に達成点がある。

特に無誤差でも残る曖昧さは

AS(0)=2maxzβz

であり、分岐がなければ0とする。これは単射条件と一致する。

1.6 S1.4:最良の決定論的推定誤差

受信値を y=F_S(x)+e とし、各成分の誤差を独立に −ε≤e_s≤ε の任意値とする。推定器 g は受信値から T の任意の点を返してよい。このモデルで

ES(ε):=infgsupxT, eεd(g(FS(x)+e),x)=AS(2ε)2.(T6)

上界。 y に整合する集合 C_y={x:||F_S(x)−y||∞≤ε} は非空ならコンパクトで、その直径は A_S(2ε) 以下。実木上の非空コンパクト集合は、直径対の中点を中心として直径の半分の半径で覆える。その点を返す推定器を選ぶ。実現不能な y での出力は任意でよい。

この半径の事実を直接確認する。D=d(u,v) とし、z∈C_y の [u,v] への射影を p、a=d(z,p)、t=d(p,u) とおく。木の道の一意性と直径の定義から

a+tD,a+(Dt)D,amin{t,Dt}.

中点 m までの道も p を通るので

d(z,m)=a+|tD/2|min{t,Dt}+|tD/2|=D/2.

D=0 でも同じ結論となる。従って全ての z を半径 D/2 の球で覆える。中心を C_y 内に制約する必要はない。

下界。 A_S(2ε) を達成する x,x' の観測ベクトルの座標ごとの中点を y とする。これは両者と整合する。どの出力 g(y) も三角不等式から、少なくとも一方の真値まで A_S(2ε)/2 以上離れる。∎

この半直径の結論は、情報半径・最適回復と実木の外接半径の性質による直接の系である。より広くhyperconvexな復元先にも同じ原理が使える。新規性比較節で既知原理との関係を示す。推定器が必ず観測と整合する点だけを返す、という追加制約の下では一般に成立しない。

1.7 21倍の例での正確な閾値

幹線 S₁—b—c—S₂ の各辺長を1、bとcから外へ伸びる行き止まりを各10とする。二つの先端 X,Y の距離は21だが、基準点への観測はそれぞれ (11,12)、(12,11)。この木の直径は21、Δ=1、c=1/21 である。

AS(δ)={δ0δ<1,21δ1,ES(ε)={ε0ε<1/2,21/2ε1/2.
各観測の最大誤差 ε 同じ受信値に整合し得る2点の最大隔たり 最良の推定器の最悪位置誤差
0.10 0.20 0.10
0.49 0.98 0.49
0.50 21.00 10.50
1.00 21.00 10.50

これは「観測誤差に応じて位置誤差が常に滑らかに増える」という期待の反例になる。最悪の場合についての主張であり、平均誤差や確率的な発生頻度を述べてはいない。

1.8 S1.5:基準点配置を葉の有限集合へ還元する

定理。 |S|≥2 なら、T の葉だけからなる集合 S' で、|S'|≤|S| かつ

ρS(x,y)ρS(x,y)(x,yT)(T7)

を満たすものが存在する。

証明。 K の各葉を、K に戻らない方向に T の葉まで延長する。既に T の葉であれば動かさない。各延長は異なる葉に到達し、その集合 S' の凸包 K' は K を含む。K の各葉は S に属するので、個数は増えない。

固定した x,y に対し f(s)=d(x,s)−d(y,s) は、s の道 [x,y] への射影位置のアフィン関数である。任意の道上では一定または単調に変化するため、|f| の基準点凸包上での最大値は基準点上の最大値に等しい。K⊂K' から、

maxsS|f(s)|=maxsK|f(s)|maxsK|f(s)|=maxsS|f(s)|.

これが (T7) である。∎

従って、全ての δ で同時に A_{S'}(δ)≤A_S(δ)。c も悪化しない。基準点の設置位置を自由に選べ、各点の費用が同じで、個数予算が m≥2 のとき、c の最大化や任意の誤差幅での最悪誤差最小化は、葉の部分集合を調べれば最適解を得られる。

予算が2個以上で元の集合が1点の場合は、先に任意の別の基準点を一つ加えてから定理を適用できる。これは連続配置から有限配置への厳密な還元である。葉数を ℓ とすれば、素朴には高々 min(m,ℓ) 個を選ぶ部分集合を列挙できる。葉の個数に関する多項式時間アルゴリズムは本稿では証明していない。 また設置禁止場所・位置依存の費用・基準点1個だけの一般問題は対象に含めない。

1.9 境界と適用外

  • T が一点なら位置誤差と曖昧さは常に0。c は空集合上の下限となるため、本稿では別規約を与えず定理の対象を diam(T)>0 に限定した。
  • 閉路のある空間には、付け根への一意な射影や道の一意性をそのまま移せない。
  • 基準点への距離を異なる速度・未知の開始時刻を含む到達時間で観測するモデル、距離ごとに誤差幅が異なるモデルは未検証。
  • 木の構造そのものは既知とする。空間全体の復元と、既知の空間内での位置推定は異なる問題である。
S2:短い区間の構造・最良比較係数・全nの等号例

2. S2:直線上の不確実な位置の接続

2.1. 定義と主定理

n >= 2 とし、各点の独立した位置不確実性を閉区間

Ii=[ai,bi]R,aibi

で表す。点区間、同一区間の重複、点の一致を許す。全域木は点のラベル 1,...,n 上の木である。配置 x=(x_1,...,x_n) に対して

B(x)=minTmaxijE(T)|xixj|,RA=maxxiIiB(x),
RF=minTmaxxiIimaxijE(T)|xixj|.

有限個の木とコンパクト配置空間を扱うので、最大・最小はいずれも存在する。R_A は、配置に応じて接続木を選び直せる場合の、全配置を保証する最小通信距離。R_F は、先に固定した同じ木の全辺を全配置で使用可能にする最小通信距離。

主定理(一般証明を記録)。

RARFn2RA.

右側の係数は各 n >= 2 で最良である。

2.2. 距離 r での補題

以下、r>0 とし、全ての許容配置について、距離 r 以下の点対を辺とするグラフが連結であると仮定する。

補題1:長い区間の削除

区間 I_i の長さが r 以上なら、その点を削除しても、残りの各配置の距離 r グラフは連結である(残りが1点なら自明)。

証明。 残りの点のある配置が不連結だとする。実直線上では、ソート順に隣接した点 u<v の間に g=v-u>r の隙間がある。その隙間の左と右を追加の1点 x で接続するには

x[vr,u+r]

が必要である。この区間が空でなければ、その長さは 2r-g<r である。長さが r 以上ある I_i の全点をここに含めることはできない。従って許容される x のどれかでは元の全体グラフも不連結になり、仮定に反する。∎

この補題は繰り返して適用できる。削除できる条件は幅≥r、主証明で実際に削除する条件は幅>r である。幅がちょうど r の区間も補題上は削除可能だが、以降は削除せず、幅≤r の「短い区間」集合に残す。こうして、残す集合と削除する集合は重複も漏れもなく全区間を分ける。

補題2:短い区間は少なくとも1本存在する

S={i:biair},m=|S|

とおくと、m>=1 である。

証明。 全区間の長さが r より大きいと仮定する。補題1を使って2本を残すまで削除する。残った2区間の長さを w_1,w_2>r とすれば、両区間間の最大距離は少なくとも

w1+w22>r

である。実際 b_1-a_2b_2-a_1 の和が w_1+w_2 なので、その少なくとも一方はこの半分以上である。許容される2点配置に距離が r を超えるものが存在し、連結性に反する。∎

補題3:短い区間だけなら固定木が距離 r で存在する

全区間の幅が r 以下で、全配置で距離 r 連結なら、同じ距離 r で全配置に使える固定全域木が存在する。

証明。 各区間について非空閉区間

Ji=[bir,ai]

を定義する。ラベル i,j を、全許容位置で距離 r 以下になる場合に結ぶ。その条件は

biajr,bjair,

従ってちょうど J_iJ_j が交差することに等しい。

この交差グラフが不連結なら、有限個の閉区間の成分の間に正の隙間がある。隣接成分の間で、全ラベルを非空な左群 L と右群 R に分けると

maxiLai<minjR(bjr).

左群では x_i=a_i、右群では x_j=b_j を選ぶ。その配置には幅 r より大きな隙間が生じ、連結性の仮定に反する。よって交差グラフは連結であり、その任意の全域木を固定木にできる。∎

補題1で長い区間を全て削除すると短い区間集合 S の全配置連結性が残り、補題3が適用できる。その固定距離 r グラフを H とする。

補題4:長い区間の両端には、それぞれ確実に接続できる短い区間がある

長い区間 I_i=[A,B] を1本選ぶ。少なくとも1個の u in S が存在して

maxyIu|Ay|r

となる。同様に、少なくとも1個の v in S について max_{y in I_v}|B-y|<=r となる。

証明。 I_i 以外の長い区間を全て削除すると、短い区間集合と I_i の全配置連結性が残る。x_i=A に固定する。仮に全ての短い区間 I_j について |A-y_j|>r となる位置 y_j in I_j を選べるなら、それらを独立に同時選択することで A が孤立する。従って、全ての位置で A と距離 r 以内にある短い区間が少なくとも1本ある。B も同様。∎

2.3. 主定理の構成的証明

r=R_A>0 とする。上記の短い区間集合 S、そのサイズ m>=1、固定距離 r グラフ H を使う。

長い区間がなければ補題3より R_F<=r であり、証明が完了する。

長い区間 I_i=[A,B] を1本選び、補題4の短い区間 u,v を選ぶ。H 内の u から v への単純路を取る。仮想的な固定端点 A,B を加えると

AIuIvB

という、全ての辺が全配置で距離 r 以下である道が得られる。道を v₀=A,v₁,…,v_L=B と書く。内部頂点は相異なる短い区間のラベルで、その個数 L−1 は1以上 m 以下だから、2≤L≤m+1。u=v の場合は A,I_u,B の2辺の道とする。

中央の添字 t=⌊L/2⌋ を選ぶと、L≥2 より 1≤t≤L−1。従って v_t は必ず内部の短い区間 I_j である。両端からの辺数 t と L−t はともに ⌈L/2⌉ 以下になる。各辺の距離保証と三角不等式により、I_j の任意の位置 y について

|Ay|L2r,|By|L2r.

実直線上では |x-y|x in [A,B] に関する最大値は端点で達成される。従って

maxxIi,yIj|xy|m+12r.

各長い区間に対し、このような短い区間を1本選んで固定辺を加える。短い区間の固定木と合わせると、全ての長い区間が葉となる固定全域木が得られる。長い区間が1本以上ある場合、m<=n-1 なので

RFm+12rn2r.

R_A=0 の場合、どの配置でも距離0で全点が繋がる必要があるので、独立性から全区間が同一の点区間となり、R_F=0。最後に R_A<=R_F は、配置を見て木を選ぶ自由を許すと必要距離が増えないことから直ちに従う。∎

2.4. より強い定理と等号例

短い区間数による強化(証明済み)。 r=R_A>0m=#{i:b_i-a_i<=r} とする。

  • 長い区間がなければ R_F=R_A
  • 長い区間があれば R_F<=ceil((m+1)/2) R_A

後者は、任意の m>=1 と任意の長い区間数 k>=1 に対して最良である。

等号構成。 m 本の固定点区間

{1},{2},,{m}

と、k 本の同一区間 [0,m+1] を使う。全ての可動点は固定点のどれかと距離1以内にあり、固定点の鎖も距離1で連結するので R_A<=1。可動点を全て0に配置すれば幅1の隙間が残るので R_A>=1。従って R_A=1

長い区間同士の最悪距離は m+1。長い区間と固定点 j の最悪距離は max(j,m+1-j) で、その最小値は ceil((m+1)/2)。従ってこの値未満では長い区間はどの頂点とも固定辺を持てず、固定木は存在しない。一方、全長区間を中央の固定点に接続すればこの値で固定木ができる。

k=1m=n-1 とすれば元の ceil(n/2) の各点数に対する鋭さが得られる。

2.5. 路の短さによる実例ごとの改善

長い区間 I_i=[A_i,B_i] の両端に確実に距離 r で接続する短い区間の集合を、それぞれ U_i,V_i とする。短い区間の固定距離 r グラフを H とし、集合間最短路の辺数を

di=distH(Ui,Vi)

とすれば、上の構成で

RFrmax{1,maxiSdi+22}

という実例ごとの証明書が得られる。長い区間がないときは右辺を r とする。これは最適な R_F の公式ではなく、構成的な上界である。

2.6. 計算検査の再現性

spatial_research_verify.py intervals は標準Pythonのみを使い、整数演算で以下を再現する。

  1. 端点 0,...,6 の全28種類の閉区間から、重複可・順序無視で n=3,4,5 本選ぶ。
  2. 2^n の端点配置を列挙し、ソート後の最大隣接間隔の最大を R_A とする。
  3. 完全グラフの辺重み max(|a_i-b_j|,|b_i-a_j|) にKruskal法を適用し、最大木辺を R_F とする。
  4. 上の証明に対応した構成で固定木を実際に作り、短い区間の連結性、両端の確実な接続先、道の中央頂点による上界、全域木の辺数、強化上界を検査する。

端点配置だけで R_A が厳密に求まる理由: 任意配置の最大隙間で点を左右群に分け、左群の各点をその左端、右群をその右端へ動かす。隙間は減らず、端点配置が得られる。逆方向は端点配置が許容配置の一部なので自明。

保存された検証記録の母集団:

n 区間族数 R_A=0 の例 最大比 R_F/R_A
3 4,060 7 2
4 31,465 7 2
5 201,376 7 3
合計 236,901 21

これらの有限検査は証明の代わりではない。主定理の一般的な根拠は上記の数学的証明である。

2.7. 任意のコンパクト集合への拡張と独立性の境界

凸包不変性(証明済み)。 各ラベルの不確実集合を任意の非空コンパクト集合 U_i subset R としても、これを閉区間 I_i=[min U_i,max U_i] に置き換えて R_AR_F は変わらない。

R_F については、各点対の最大距離は互いの端点の組で達成されるためである。R_A については、区間族の任意配置の最大隙間で左右群を分け、左群を各集合の最小値、右群を各集合の最大値へ移すと隙間が減らない。移動先の全点は元のコンパクト集合に属する。従って区間族の R_A は元の集合族の R_A 以下で、逆不等式は配置空間の包含から従う。

従って主定理は、独立した任意非空コンパクト集合 U_i subset R にそのまま成り立つ。強化定理の短さは diam(U_i)<=R_A で判定すればよい。

独立性を外すと主定理は偽。 許容配置を、固定位置集合 {0,1,...,n-1} の全順列だけに限定する相関モデルを考える。各配置では隣接位置を結べるので R_A=1。一方、どのラベル対も許容配置のどれかで両端 0,n-1 を占めるため、各固定辺の最大距離は n-1 である。従って R_F=n-1 となり、n>=4ceil(n/2) 上界を破る。この相関モデルでは、各点の周辺的な不確実集合だけを用いると独立性の情報を失うため、凸包不変性を適用できない。

2.7.1 全配置連結性の必要十分条件

任意の r>0 に対し、幅が r 以下の区間を短い区間集合 S とし、その全配置で使える距離 r グラフを H とする。n>=2 では、全配置が距離 r で連結であることは、次の3条件と同値である。

  1. S が非空。
  2. H が連結。
  3. 各長い区間の両端について、その端点との距離が全位置で r 以下になる短い区間が存在する(両端で別の短い区間でよい)。

必要性は補題2〜4で証明済み。十分性を示すため、短い区間の任意配置を固定する。H の固定木があるので短い点の距離 r グラフは連結し、それらの閉 r 近傍の和集合は実直線上の1つの閉区間になる。条件3により各長い区間の両端がこの和集合に属するので、長い区間全体も含まれる。従って各長い点のどの位置も、短い点のどれかと距離 r 以下で結ばれる。

条件2が成り立つとき、条件3は各長い区間 [A,B] について

AminjSbjr,BmaxjSaj+r

と同値になる。確実に少なくとも1個の短い区間へ接続できる位置集合は

jS[bjr,aj+r]=[minjSbjr,maxjSaj+r]

だからである。等号は、H が区間 [b_j-r,a_j] の連結な交差グラフであることから従う。

付録A:S2の独立した帰納的証明(English)

付録A:S2の独立した帰納的証明

以下は主本文の交差区間による証明と別に導出した英語の証明記録。両方とも通常の数学的論証であり、証明支援系による形式証明ではない。

A. Setting and claim

Let n ≥ 2 and let I_i = [a_i,b_i] be nonempty bounded closed intervals on the real line. A realization independently selects x_i in I_i. Let T range over spanning trees on the labelled vertex set {1,...,n}. Define

RA=maxxminTmaxijE(T)|xixj|,RF=minTmaxxmaxijE(T)|xixj|.

Then

RFn2RA.

The factor is sharp for every n ≥ 2, including both parities.

For a realization, its optimal bottleneck spanning-tree value is the largest consecutive gap after sorting its n coordinates (ties allowed). Thus R_A ≤ r means that every realization has all consecutive gaps ≤ r. Call such a family universally r-connected.

For distinct labels define the robust edge weight

d_ij = max(b_i-a_j, b_j-a_i).

This is exactly max_{x_i in I_i,x_j in I_j}|x_i-x_j|. Consequently R_F is the minimum bottleneck of a spanning tree in the complete graph with weights d_ij. It suffices to prove that the graph containing edges d_ij ≤ ⌈n/2⌉r is connected whenever the family is universally r-connected.

A. Lemma 1: deleting a long interval

Assume r > 0. If a universally r-connected family contains an interval I_i of length at least r, deleting that interval leaves a universally r-connected family.

Proof. Otherwise some fixed realization of the remaining labels has a consecutive gap (y,z) of length g = z-y > r. For an added point x_i to remove every gap larger than r across this particular gap, it must lie in

[z-r, y+r].

This interval has length 2r-g < r; if its endpoints are reversed, it is empty. Since all choices x_i in I_i must work, I_i would have to be contained in this interval, contrary to its length being at least r. A remaining singleton is universally r-connected by convention. QED.

A. Lemma 2: width bound for a deletable interval

Assume n ≥ 2, the full family is universally r-connected, and deleting I_i leaves a universally r-connected family. Then

b_i-a_i ≤ n r.

Proof. Put L = min_{j ≠ i} b_j and R = max_{j ≠ i} a_j. If a_i < L-r, select x_i=a_i and x_j=b_j for all j ≠ i; x_i is isolated from the others by a gap > r. Hence a_i ≥ L-r. The symmetric realization x_i=b_i, x_j=a_j gives b_i ≤ R+r.

It remains to show R-L ≤ (n-2)r. If R ≤ L this is immediate. If R > L, the labels attaining R as a left endpoint and L as a right endpoint must be distinct. Choose those two endpoints in a realization of the remaining n-1 labels. The span of that realization is at least R-L and, by universal r-connectivity, is at most (n-2)r. Therefore

b_i-a_i ≤ R-L+2r ≤ nr.

QED.

A. Lemma 3: robust neighbor by a two-sided counting argument

Assume r > 0, the n-interval family is universally r-connected, k is a positive integer with 2k ≥ n, and a distinguished interval I_i has width ≤ 2kr. Then some j ≠ i satisfies d_ij ≤ kr.

Proof. Suppose every d_ij > kr. Define

ell = b_i-kr, u = a_i+kr.

The width assumption implies ell ≤ u. For each j ≠ i, the inequality d_ij > kr says that at least one of the following holds:

a_j < ell, b_j > u.

Independently select a bad endpoint for every other label: choose a_j < ell whenever possible; otherwise choose b_j > u. The selected points partition into a left group of size p, with all coordinates < ell, and a right group of size q, with all coordinates > u. We have p+q=n-1.

Both groups are nonempty. If the right group were empty, choosing x_i=b_i would leave a gap > kr ≥ r between x_i and all remaining points. If the left group were empty, x_i=a_i gives the symmetric contradiction.

Now keep all selected endpoints fixed and choose x_i=a_i. Let z be the first right-group point. Then z-a_i > kr. All selected points strictly between a_i and z belong to the left group, so there are at most p of them. Universal r-connectivity therefore gives z-a_i ≤ (p+1)r. It follows that p+1 > k, and since p and k are integers, p ≥ k.

Next choose x_i=b_i. Let y be the last left-group point. Then b_i-y > kr, and at most q right-group points lie strictly between y and b_i. The same argument gives q ≥ k.

Thus n-1 = p+q ≥ 2k ≥ n, a contradiction. QED.

The strict inequalities here matter: d_ij > kr gives distances strictly greater than kr, forcing at least k intermediary points, rather than merely k-1.

A. Main theorem by induction

It suffices to prove the graph statement for every r > 0 and n ≥ 2.

Base n=2: universal r-connectivity says precisely d_12 ≤ r, and ceil(2/2)=1.

Inductive step n≥3: put k=⌈n/2⌉, so k≥2 and 2k≥n.

Case 1: some interval has width ≥ r. Delete it using Lemma 1. By induction, the robust graph on the remaining n-1 labels is connected at threshold ⌈(n−1)/2⌉r ≤ kr. Lemma 2 bounds the deleted interval's width by nr ≤ 2kr. Lemma 3 supplies a robust edge of weight ≤ kr from it to a remaining label. Adding that edge proves connectivity on all n labels.

Case 2: every interval has width < r. Choose its midpoint c_i=(a_i+b_i)/2 and half-width h_i=(b_i-a_i)/2 < r/2. Sort the midpoints. Since their realization is r-connected, consecutive midpoint gaps are ≤ r. For each consecutive pair i,j,

d_ij = |c_i-c_j| + h_i+h_j < 2r ≤ kr.

Their consecutive-pair path is therefore a spanning tree in the robust graph. This completes the induction.

Take r=R_A if R_A>0. If R_A=0, every realization consists of equal coordinates. Independence then forces every interval to be the same singleton, so R_F=0 as well.

A. Sharpness

Take n-1 singleton intervals at 1,2,...,n-1 and one moving interval [0,n]. Every realization has consecutive gaps at most 1, and the realization with moving point 0 has a gap 1; hence R_A=1.

Every spanning tree must attach the moving label to at least one singleton t in {1,...,n-1}. That edge has robust weight

max(t,n-t) ≥ ⌈n/2⌉.

Conversely, connect the singleton labels consecutively and attach the moving label to an integer t nearest n/2. The robust bottleneck is ⌈n/2⌉. Therefore R_F=⌈n/2⌉, proving sharpness.

3. 計算方法・独立監査・再現

3.1 適応半径の簡潔な高速公式

n≥2 とし、区間を左端の順 a₁≤⋯≤aₙ に並べる。同じ左端を持つ区間の順序は任意でよい。

RA=max{0,max1k<n(minj>kbjak),maxjbjan}.(I-fast)

並べ替え後の右端のsuffix最小値を使えば O(n log n) 時間、O(n) 作業領域で計算できる。実数の比較・四則演算を一定費用とするモデルであり、有理数ビット長の費用は別に数える。

証明。 全配置の最大隣接gapの最大は、非空真部分集合 U を左側にする全てのcutについて

RA=maxU[n](minjUbjmaxiUai)

で与えられる。任意配置の最大gapはそのcutの右辺以下で、正の右辺は左群の点を各左端、右群を各右端に置けば達成する。最大値が0の場合も R_A≥0 と合わせればよい。

任意のcutの t=max_{i∈U}a_i について、a_j>t の点が残っていれば、U を {i:a_i≤t} へ拡大してもgapは減らず、prefixの項に帰着する。残っていなければ t=a_n なのでgapは max_j b_j−a_n 以下。逆に各prefixは実際のcutであり、jを最大右端のラベルとして補集合を {j} にすれば、そのgapは b_j−max_{i≠j}a_i≥max_jb_j−a_n となる。∎

実装では第3項を max_j(b_j−max_{i≠j}a_i) という同値な形で計算する。j=n の差分は prefix 項 k=n−1 に含まれるため、全体の最大値は一致する。詳細は§3.3に記す。

n=1 では R_A=R_F=0 と別に定義する。この場合に (I-fast) を適用すると、幅のある一区間で誤答になるので適用しない。

固定半径 R_F は、既知のrobust bottleneck原理によって、各辺の最悪距離を重みにした最小ボトルネック全域木で求まる。全辺を列挙するKruskal法なら O(n² log n) 時間となるが、中心順の2走査を用いたBorůvka法によって、R_Fとそれを達成する木を O(n log n) の比較・算術操作、O(n)領域で求められる。全辺Kruskal法は独立な検証用として残す。第2節の構成は最良係数を保証する固定木を返すが、その木が各入力における R_F を必ず達成するという主張ではない。

3.1.1 固定接続の高速計算と最適木の構成

既知のBorůvka法を、区間の中心順で辺重みが分離する構造に適用する。以下の方法で R_F とそれを達成する木を O(n log n) の比較・算術操作、O(n) 領域で求める。新規性の主候補は増やさず、計算手法の具体化として扱う。標準Borůvka法の著者公開実装

定理

n >= 2 個の非空有界閉区間 I_i=[a_i,b_i] を考え、異なるラベル間の重みを

wij=max(biaj,bjai)

とする。この完全グラフの最小全域木を O(n log n) の比較・算術操作、O(n) 領域で構成できる。その最大辺重みは

RF=minTmaxijE(T)wij

である。区間の重複、中心の一致、点区間、辺重みの同点を許す。

整数・有理数の場合、厳密計算をそのまま用いられる。計算量は比較・算術操作数についての評価であり、任意精度数のビット演算費用まで O(1) と主張するものではない。

一度のソートで辺の式が分離する

中心 c_i=(a_i+b_i)/2 と半幅 h_i=(b_i-a_i)/2 を置くと、i != j に対して

wij=hi+hj+|cicj|.

したがって中心順に並べた i<j について

wij=bjai.

中心が同じ場合も成立する。実装では半整数を作らず、a_i+b_i で一度だけソートすればよい。

各成分の最小外向き辺を線形時間で求める

現在の全域森の各成分に「色」を付ける。頂点 i の左側にある異なる色の頂点との最小辺は

minj<i, C(j)C(i)wji=bimaxj<i, C(j)C(i)aj.

右側なら

minj>i, C(j)C(i)wij=minj>i, C(j)C(i)bjai.

左から右への走査では、走査済み頂点の a_j の最大値を異なる2色分だけ保持する。最大の色が現在頂点と異なればそれを使い、同じなら2番目の色を使う。右から左も b_j の最小値を2色分保持する。同色の記録はその色の最良値にまとめる。新たな記録1件を既存の高々2件に挿入して比較するだけなので、更新・照会は O(1)

なぜ2色だけで足りるか。各照会が除外するのは現在頂点の1色だけであり、全色の最良記録の先頭2色があれば、除外後の最良値が必ずその中にあるからである。

2回の走査から各頂点の最小外向き辺が分かる。それらを成分ごとに比較して最小を取れば、各成分の最小外向き辺になる。この段階全体は O(n)

Borůvka 法による正しさと計算量

各成分が選んだ最小外向き辺を追加して成分を縮約する。これは Borůvka 法の標準的な1段階であり、カット性質から最小全域木へ延長可能な全域森を保つ。同じ重みがあるときは、全段階を通じて

(重み, 小さい方の元ラベル, 大きい方の元ラベル)

という共通の順序で選ぶ。これにより、標準的な一貫した同点処理ができる。走査の値の同点も元ラベルの小さい方を優先すれば、同じ辺順序に一致する。

重複を除いた選択辺に閉路があると仮定し、その閉路で共通順序が最大の辺を取る。その辺を選んだ成分には、閉路上のもう1本の、より小さい外向き辺があるため、最小辺を選んだことに矛盾する。したがって選択辺は森となり、以下の深さ優先探索はその全辺を保持する。

成分が k>1 個ある段階では、各成分に外向き辺が存在する。縮約後の各成分は旧成分を少なくとも2個含むため、成分数は高々 k/2。したがって段階数は O(log n)

実装では毎回、選んだ高々 k 本の辺を旧成分上の隣接リストに置き、深さ優先探索で新しい成分番号を振る。これは O(k)。全頂点の色配列を更新する費用は O(n)。この縮約と色配列の更新は線形時間なので、走査以外に余分な段階ごとの対数因子は生じない。

初期ソート O(n log n) と、各 O(n)O(log n) 段階を合わせて O(n log n)。色配列、走査記録、成分隣接リスト、出力木は合計 O(n) 領域で足りる。

最後に、任意の最小全域木は最小ボトルネック全域木である。実際、その最大辺 e を除いたカットを横切る辺は w(e) 未満ではあり得ない。もしあれば交換により総重みが減るからである。したがって、すべての全域木はそのカットを w(e) 以上の辺で横切る必要があり、出力木の最大辺は R_F に等しい。∎

手順の要約

中心順を一度だけソートする
各頂点を別成分として開始する
成分が2個以上ある間:
    左右2走査で、各成分の最小外向き辺を求める
    選ばれた辺を追加する
    旧成分上のグラフを線形時間で縮約し、色配列を更新する
出力木と、その最大辺重みを返す

コード:spatial_research_verify.pyrobust_fixed_fast(intervals)。返り値は (R_F, 辺一覧, 各段階の成分数)。辺は (重み, 元ラベル1, 元ラベル2)

独立検証結果

実行コマンド:python spatial_research_verify.py fixed

検証 件数 内容
整数端点0〜6、n=2 406 全区間多重集合
同、n=3 4,060 同上
同、n=4 31,465 同上
上記合計 35,931 完全グラフ Kruskal と照合
整数端点0〜4、n=2〜4 3,860 Prüfer 列による全ラベル付き木の直接最小最大値とも照合。上記の部分集合であり件数を加算しない
整数乱数、n=2〜50 2,500 ラベル順をランダム化
有理数乱数、n=2〜19 200 fractions.Fraction による厳密比較
指定退化例 4 n=1、同一位置50点、中心共通の入れ子50区間、一直線の50点

不一致0件。 比較は R_F だけでなく、重み総和と共通の同点処理による最小全域木の全辺まで確認した。各段階の成分数半減も確認した。乱数種は 20260914。数学的な比較に浮動小数は使用していない。有限検証は上記の一般証明を補助するものであり、形式検証ではない。

3.2 検証の範囲

対象 方法 検証記録
S2の一般上界 短い区間の交差グラフを使う構成的証明 主本文に全証明を収録
S2の独立証明 長区間の削除・幅の上界・左右の点数による帰納法 付録Aに収録。主証明とは別に導出
区間の全域木構成 n=3,4,5、整数端点0〜6の全区間多重集合。全端点配置oracle・高速式・Kruskal・構成木の保証を整数演算で照合 236,901族、全件一致
(I-fast)そのものの独立検査 n=2,3,4、整数端点0〜6の全区間多重集合で、全cutと照合 35,931族、全件一致。上の母集団と重複するため合算しない
木の係数 c 80本の重み付き木。辺対の直線配置を有理数で厳密列挙 80件一致。単射60・非単射20
木の A_S(δ) 各辺対で二変数半平面制約の頂点を有理数で厳密列挙。閾値の直前・一致・直後を含む 586設定、全件一致
葉への優越 新旧観測差の全直線配置を共通細分し、その頂点で検査 4,707頂点、全件一致

木の検証は点を格子状に抜き出す方法ではなく、列挙した各木の辺内部を含む連続領域を最適化する。観測差を表す符号付きアフィン関数の最大値を直接扱い、幾何学的な射影公式を最適化oracleに使用しない。分岐構造から求める予測式と比較する。

比率の検査では、観測差のアフィン関数が切り替わる直線配置の各セル内で線形分数関数になる。分母が正のセルでは値は頂点値の範囲にあり、対角上で分母・分子が共に0の場合も、その点からの線分で比は一定なので欠落しない。葉優越の差は共通細分した各セルでアフィンになる。

80本は、明示した5例と seed=20260914 で生成した75例。辺長は正整数、頂点数3〜8を中心とする。基準点は頂点に置くが、次数2の点も含むため、辺を分割した内部基準点を含めて扱える。これは全ての木の列挙でも一般定理の形式証明でもない。

3.3 再現コード

このHTMLに埋め込んだ spatial_research_verify.py は標準Pythonのみを使用する。数学的な比較に浮動小数は使用せず、整数または fractions.Fraction で処理する。

python spatial_research_verify.py all
python spatial_research_verify.py intervals --sizes 3 4 5 --max-endpoint 6
python spatial_research_verify.py trees
python spatial_research_verify.py fixed

最初のコマンドで全検査を再現できる。木の全入力、各係数、閾値数、葉への移動結果は、実行したスクリプトと同じディレクトリの tree_verification_results.json に出力される。区間は全入力を規則から再生成する。簡易実行には intervals --sizes 3 --max-endpoint 4 を使える。

高速の区間実装は (I-fast) と同値な「補集合が一点であるcut」の最大を用いる形で実装し、独立な全端点配置oracleと比較している。具体的に、左端順の j<n では max_{i≠j} a_i=a_n。j=n のときにだけ生じる b_n−a_{n−1} は、表示式の prefix 項 k=n−1 そのものである。従ってコードの max_j(b_j−max_{i≠j}a_i) と表示式の max_j b_j−a_n は、prefix 項と合わせた全体の最大値として一致する。左端が同じ場合もこの説明は変わらない。式に似たコードを二つ書いて一致を確認するだけの検査を避けた。

検証コードを取り出す(Python)

埋め込んだ検証コードの全文
#!/usr/bin/env python3
"""Spatial mathematical exploration: reproducible exact verification.
Date: 2026 09 14. Requires only the Python standard library.

Usage:
  python spatial_research_verify.py all
  python spatial_research_verify.py intervals --sizes 3 4 5 --max-endpoint 6
  python spatial_research_verify.py intervals --help
  python spatial_research_verify.py trees
  python spatial_research_verify.py fixed

With no mode argument, runs all checks. Interval options also apply to `all`.

Interval checks exhaustively enumerate multisets of closed integer-endpoint
intervals within the requested range; repeated and singleton intervals are
allowed. An independent endpoint oracle checks the O(n log n) adaptive-radius
formula, while an optimal robust MBST and constructive certificates check the
strengthened bound on the interval adaptivity gap. All interval computations
use integers.

Tree checks use direct edge-distance formulas, without the landmark projection
identity, as an independent oracle. Exact Fraction polytope optimization and
affine arrangements cover entire edges for each of the 80 specified weighted
trees with vertex landmarks (5 designated cases and 75 cases from seed
20260914). They check the ambiguity diameter, inverse Lipschitz constant, and
leaf-landmark dominance. No floating point comparisons or grid sampling are
used. Tree results are written to tree_verification_results.json beside this
script.

The fixed mode checks the O(n log n) robust fixed-tree algorithm against
complete-graph Kruskal, direct Prufer tree enumeration, and seeded integer
and rational instances; it also checks the returned robust-weight MST.

These finite, reproducible checks support the accompanying general proofs;
they neither prove the claims for all instances nor constitute a formal proof.
"""

# ===== Independent interval implementation =====
from argparse import ArgumentParser
from collections import deque
from itertools import combinations_with_replacement, product
from math import comb
import json


def robust_distance(first, second):
    a, b = first
    c, d = second
    return max(abs(a - d), abs(b - c))


def adaptive_radius(family):
    """Exact: moving each side of a maximal gap outward preserves its gap."""
    if len(family) <= 1:
        return 0
    return max(
        max(right - left for left, right in zip(ordered, ordered[1:]))
        for endpoints in product(*family)
        for ordered in [sorted(endpoints)]
    )


def adaptive_radius_fast(family):
    """Exact O(n log n) formula via maximal-gap cuts, checked against endpoints."""
    n = len(family)
    if n <= 1:
        return 0
    ordered = sorted(family)
    suffix_min = [0] * n
    suffix_min[-1] = ordered[-1][1]
    for i in range(n - 2, -1, -1):
        suffix_min[i] = min(ordered[i][1], suffix_min[i + 1])
    answer = max(0, max(suffix_min[k + 1] - ordered[k][0]
                        for k in range(n - 1)))
    for j, (a, b) in enumerate(ordered):
        largest_other_a = ordered[-2][0] if j == n - 1 else ordered[-1][0]
        answer = max(answer, b - largest_other_a)
    return answer


def fixed_radius(family):
    """Kruskal on pairwise worst distances; MST is a bottleneck MST."""
    n = len(family)
    if n <= 1:
        return 0
    parent = list(range(n))
    remaining = n

    def root(vertex):
        while parent[vertex] != vertex:
            parent[vertex] = parent[parent[vertex]]
            vertex = parent[vertex]
        return vertex

    edges = sorted(
        (robust_distance(family[i], family[j]), i, j)
        for i in range(n) for j in range(i)
    )
    for weight, i, j in edges:
        u, v = root(i), root(j)
        if u != v:
            parent[u] = v
            remaining -= 1
        if remaining == 1:
            return weight
    raise AssertionError("Complete graph did not become connected")


def shortest_path(adjacency, starts, targets):
    queue = deque(starts)
    predecessor = {vertex: None for vertex in starts}
    target_set = set(targets)
    while queue:
        vertex = queue.popleft()
        if vertex in target_set:
            path = []
            while vertex is not None:
                path.append(vertex)
                vertex = predecessor[vertex]
            return path[::-1]
        for neighbor in adjacency[vertex]:
            if neighbor not in predecessor:
                predecessor[neighbor] = vertex
                queue.append(neighbor)
    raise AssertionError("No path between endpoint neighbor sets")


def constructive_tree(family, radius):
    """Return a fixed tree and the proved bound, asserting all certificates.

    Short core: intervals of length <= radius. Long intervals become leaves.
    The proof gives a sharper factor ceil((m+1)/2), m = core size, if any
    long interval is present, and factor 1 if all intervals are short.
    """
    n = len(family)
    if n <= 1:
        return [], 0
    if radius == 0:
        assert all(a == b == family[0][0] for a, b in family)
        return [(0, i) for i in range(1, n)], 0

    core = [i for i, (a, b) in enumerate(family) if b - a <= radius]
    long = [i for i, (a, b) in enumerate(family) if b - a > radius]
    assert core, "A robustly connected family must have a short interval"
    adjacency = {
        i: [j for j in core if j != i and
            robust_distance(family[i], family[j]) <= radius]
        for i in core
    }
    tree = []
    seen = {core[0]}
    queue = deque([core[0]])
    while queue:
        vertex = queue.popleft()
        for neighbor in adjacency[vertex]:
            if neighbor not in seen:
                seen.add(neighbor)
                tree.append((vertex, neighbor))
                queue.append(neighbor)
    assert seen == set(core), "The short core must have a fixed radius tree"

    for i in long:
        a, b = family[i]
        starts = [j for j in core if
                  robust_distance((a, a), family[j]) <= radius]
        targets = [j for j in core if
                   robust_distance((b, b), family[j]) <= radius]
        assert starts and targets, "Each endpoint has a guaranteed core neighbor"
        path = shortest_path(adjacency, starts, targets)
        # Augmented path: endpoint a, core path vertices, endpoint b.
        # Its edge count is len(path)+1; this is an interior central vertex.
        center = path[(len(path) - 1) // 2]
        assert robust_distance(family[i], family[center]) <= \
            ((len(path) + 2) // 2) * radius
        tree.append((i, center))

    factor = (len(core) + 2) // 2 if long else 1
    bound = factor * radius
    assert len(tree) == n - 1
    assert max(robust_distance(family[i], family[j]) for i, j in tree) <= bound
    assert bound <= ((n + 1) // 2) * radius
    return tree, bound


def run_intervals():
    parser = ArgumentParser(description=__doc__)
    parser.add_argument("--sizes", nargs="+", type=int, default=[3, 4, 5])
    parser.add_argument("--max-endpoint", type=int, default=6)
    options = parser.parse_args()
    regions = [(a, b) for a in range(options.max_endpoint + 1)
               for b in range(a, options.max_endpoint + 1)]
    total = 0
    for n in options.sizes:
        count = zero = violations = 0
        numerator, denominator, example = 0, 1, None
        for family in combinations_with_replacement(regions, n):
            count += 1
            adaptive = adaptive_radius(family)
            assert adaptive_radius_fast(family) == adaptive
            fixed = fixed_radius(family)
            tree, bound = constructive_tree(family, adaptive)
            assert fixed <= bound
            if adaptive == 0:
                zero += 1
            if fixed > ((n + 1) // 2) * adaptive:
                violations += 1
            if adaptive and fixed * denominator > numerator * adaptive:
                numerator, denominator, example = fixed, adaptive, family
        assert count == comb(len(regions) + n - 1, n)
        total += count
        print(json.dumps({
            "n": n, "families": count, "zero_adaptive_radius": zero,
            "violations": violations,
            "maximum_ratio_fraction": [numerator, denominator],
            "first_maximizer": example,
            "constructive_certificates_verified": count,
        }, ensure_ascii=False))
    print(json.dumps({"total_families": total}))


# ===== Independent tree implementation =====
from fractions import Fraction as Q
from itertools import combinations
from pathlib import Path
import random


class Tree:
    def __init__(self, edges):
        self.edges = [(a, b, Q(w)) for a, b, w in edges]
        self.n = 1 + max(max(a, b) for a, b, _ in edges)
        self.adj = [[] for _ in range(self.n)]
        for a, b, w in self.edges:
            self.adj[a].append((b, w))
            self.adj[b].append((a, w))
        self.d = []
        for start in range(self.n):
            row = [None] * self.n
            row[start] = Q(0)
            stack = [(start, -1)]
            while stack:
                v, p = stack.pop()
                for u, w in self.adj[v]:
                    if u != p:
                        row[u] = row[v] + w
                        stack.append((u, v))
            self.d.append(row)
        self.diameter = max(map(max, self.d))

    def sensor_affine(self, e, s):
        a, b, w = self.edges[e]
        if self.d[a][s] < self.d[b][s]:
            return Q(1), self.d[a][s]
        return Q(-1), w + self.d[b][s]

    def edge_regions(self, e, f, sensors):
        a, b, le = self.edges[e]
        c, d, lf = self.edges[f]
        constraints = [(-1, 0, 0), (1, 0, le), (0, -1, 0), (0, 1, lf)]
        affines = []
        for s in sensors:
            ax, bx = self.sensor_affine(e, s)
            ay, by = self.sensor_affine(f, s)
            z = (ax, -ay, bx - by)
            affines.extend([z, tuple(-t for t in z)])
        if e == f:
            return [
                (constraints + [(-1, 1, 0)], (1, -1, 0), affines),
                (constraints + [(1, -1, 0)], (-1, 1, 0), affines),
            ]
        candidates = [(1, 1, self.d[a][c]),
                      (1, -1, lf + self.d[a][d]),
                      (-1, 1, le + self.d[b][c]),
                      (-1, -1, le + lf + self.d[b][d])]
        distance = min(candidates, key=lambda z: value(z, (le / 2, lf / 2)))
        return [(constraints, distance, affines)]


def value(z, p):
    return z[0] * p[0] + z[1] * p[1] + z[2]


def vertices(lines, domain):
    answer = set()
    for (a, b, c), (u, v, w) in combinations(lines, 2):
        determinant = a * v - b * u
        if not determinant:
            continue
        x = Q(c * v - b * w) / determinant
        y = Q(a * w - c * u) / determinant
        if all(i * x + j * y <= k for i, j, k in domain):
            answer.add((x, y))
    return answer


def arrangement_vertices(domain, affines):
    lines = list(domain)
    for a, b in combinations(affines, 2):
        line = (a[0] - b[0], a[1] - b[1], b[2] - a[2])
        if line[0] or line[1]:
            lines.append(line)
    return vertices(lines, domain)


def oracle_c(tree, sensors):
    result = Q(1)
    for e in range(len(tree.edges)):
        for f in range(e, len(tree.edges)):
            for domain, distance, affines in tree.edge_regions(e, f, sensors):
                for p in arrangement_vertices(domain, affines):
                    d = value(distance, p)
                    if d > 0:
                        result = min(result, max(value(z, p) for z in affines) / d)
    return result


def oracle_A(tree, sensors, delta):
    result = Q(0)
    for e in range(len(tree.edges)):
        for f in range(e, len(tree.edges)):
            for domain, distance, affines in tree.edge_regions(e, f, sensors):
                feasible = domain + [(a, b, delta - c) for a, b, c in affines]
                for p in vertices(feasible, feasible):
                    result = max(result, value(distance, p))
    return result


def hull_vertices(tree, sensors):
    hull = set(sensors)
    for s, t in combinations(sensors, 2):
        hull.update(v for v in range(tree.n)
                    if tree.d[s][v] + tree.d[v][t] == tree.d[s][t])
    return hull


def structural_data(tree, sensors):
    hull = hull_vertices(tree, sensors)
    roots = {}
    branch_heights = []

    def visit(v, parent):
        child_heights = sorted([w + visit(u, v) for u, w in tree.adj[v]
                                if u != parent and u not in hull], reverse=True)
        if len(child_heights) >= 2:
            branch_heights.append((v, child_heights[0], child_heights[1]))
        return child_heights[0] if child_heights else Q(0)

    for v in hull:
        h = visit(v, -1)
        if h > 0:
            roots[v] = h
    return hull, roots, branch_heights


def predicted_c(tree, roots, branches):
    if branches:
        return Q(0)
    return min([Q(1)] + [tree.d[b][c] / (tree.d[b][c] + 2 * min(h, k))
                        for (b, h), (c, k) in combinations(roots.items(), 2)])


def predicted_A(tree, roots, branches, delta):
    terms = [min(delta, tree.diameter)]
    for (b, h), (c, k) in combinations(roots.items(), 2):
        d = tree.d[b][c]
        if d <= delta:
            terms.append(min(d + h + k, delta + 2 * min(h, k)))
    for _, h, k in branches:
        terms.append(min(h + k, delta + 2 * min(h, k)))
    return max(terms)


def dominating_leaf_sensors(tree, sensors):
    hull = hull_vertices(tree, sensors)
    if len(hull) < 2:
        return None
    selected = []
    for v in hull:
        if sum(u in hull for u, _ in tree.adj[v]) != 1:
            continue
        reachable = []
        stack = [(v, -1)]
        while stack:
            u, parent = stack.pop()
            if len(tree.adj[u]) == 1:
                reachable.append(u)
            stack.extend((z, u) for z, _ in tree.adj[u]
                         if z != parent and z not in hull)
        selected.append(min(reachable))
    assert len(set(selected)) == len(selected) <= len(sensors)
    assert hull <= hull_vertices(tree, selected)
    return selected


def verify_dominance(tree, old, new):
    # Both observation norms are affine on the common full arrangement.
    # Therefore checking its vertices proves the inequality for this tree.
    checked = 0
    for e in range(len(tree.edges)):
        for f in range(e, len(tree.edges)):
            old_regions = tree.edge_regions(e, f, old)
            new_regions = tree.edge_regions(e, f, new)
            for (domain, _, a), (_, _, b) in zip(old_regions, new_regions):
                for p in arrangement_vertices(domain, a + b):
                    assert max(value(z, p) for z in a) <= max(value(z, p) for z in b)
                    checked += 1
    return checked


def run():
    rng = random.Random(20260914)
    cases = [
        ([(0, 1, 1), (1, 2, 1), (2, 3, 1), (1, 4, 10), (2, 5, 10)], [0, 3], "21-fold example"),
        ([(0, 1, 2), (1, 2, 3), (1, 3, 5)], [0], "noninjective tripod"),
        ([(0, 1, 2), (1, 2, 3)], [0], "single endpoint sensor"),
        ([(0, 1, 2), (1, 2, 3)], [1], "single interior sensor"),
        ([(0, 1, 2), (1, 2, 3), (1, 3, 5), (3, 4, 4), (3, 5, 2)], [0, 2], "deep outside branching"),
    ]
    for index in range(75):
        n = rng.randint(3, 8)
        edges = [(rng.randrange(v), v, rng.randint(1, 6)) for v in range(1, n)]
        sensors = sorted(rng.sample(range(n), rng.randint(1, n)))
        cases.append((edges, sensors, f"seeded random {index}"))
    reports = []
    count_A = 0
    dominance_vertices = 0
    injective = 0
    for edges, sensors, label in cases:
        tree = Tree(edges)
        hull, roots, branches = structural_data(tree, sensors)
        actual_c = oracle_c(tree, sensors)
        expect_c = predicted_c(tree, roots, branches)
        assert actual_c == expect_c, (label, "c", actual_c, expect_c)
        injective += not bool(branches)
        thresholds = {Q(0), Q(1, 2), Q(1), tree.diameter / 3, tree.diameter / 2,
                      tree.diameter, tree.diameter + 1}
        for b, c in combinations(roots, 2):
            d = tree.d[b][c]
            thresholds.update({d, max(Q(0), d - Q(1, 2)), d + Q(1, 2)})
        for delta in sorted(thresholds):
            actual_A = oracle_A(tree, sensors, delta)
            expect_A = predicted_A(tree, roots, branches, delta)
            assert actual_A == expect_A, (label, "A", delta, actual_A, expect_A)
            count_A += 1
        new_sensors = dominating_leaf_sensors(tree, sensors)
        if new_sensors is not None:
            dominance_vertices += verify_dominance(tree, sensors, new_sensors)
        reports.append({"name": label, "edges": edges, "sensors": sensors,
                        "c": str(actual_c), "injective": not bool(branches),
                        "thresholds_checked": len(thresholds),
                        "dominating_leaf_sensors": new_sensors})
        if len(reports) % 10 == 0:
            print(f"Validated {len(reports)} / {len(cases)} trees", flush=True)
    results = {
        "seed": 20260914,
        "trees_checked": len(cases),
        "injective_cases": injective,
        "noninjective_cases": len(cases) - injective,
        "exact_continuous_c_checks": len(cases),
        "exact_continuous_A_checks": count_A,
        "exact_dominance_arrangement_vertices_checked": dominance_vertices,
        "mismatches": 0,
        "method": "Direct edge-distance affine formulas; exact Fraction arrangement and polytope vertex enumeration",
        "scope": "Finite listed weighted trees with vertex sensors; no grid sampling; does not replace general proof",
        "cases": reports,
    }
    out = Path(__file__).with_name("tree_verification_results.json")
    out.write_text(json.dumps(results, ensure_ascii=False, indent=2) + "\n")
    print(json.dumps({k: v for k, v in results.items() if k != "cases"}, indent=2))





# ===== Fixed robust MST: center-sorted Boruvka and independent checks =====
from fractions import Fraction

def _offer(two, value, vertex, color):
    """Keep the two smallest (value, vertex) entries of distinct colors."""
    entries = sorted(two + [(value, vertex, color)])
    out = []
    for entry in entries:  # At most three entries: constant time.
        if all(entry[2] != previous[2] for previous in out):
            out.append(entry)
            if len(out) == 2:
                break
    return out


def robust_fixed_fast(intervals):
    """Return (RF, MST_edges, round_component_counts).

    Each edge is (weight, smaller_label, larger_label). Original label indices
    are preserved. The returned tree also minimizes the SUM of robust edge
    weights, which implies its maximum edge is the optimal bottleneck RF.
    n=1 is assigned RF=0 and the empty tree; n=0 is rejected.
    """
    n = len(intervals)
    if not n or any(a > b for a, b in intervals):
        raise ValueError("Expected nonempty bounded closed intervals, n >= 1")
    order = sorted(range(n), key=lambda i: (sum(intervals[i]), i))
    colors = list(range(n))
    count = n
    tree = []
    counts = [count]

    while count > 1:
        best = [None] * count
        for reverse in (False, True):
            two = []
            for i in (reversed(order) if reverse else order):
                color = colors[i]
                # The smallest stored entry outside this component, if present.
                eligible = next((entry for entry in two if entry[2] != color), None)
                if eligible is not None:
                    _, j, _ = eligible
                    # Center-sorted i_left,j_right imply w=b_right-a_left.
                    weight = intervals[j][1] - intervals[i][0] if reverse else intervals[i][1] - intervals[j][0]
                    edge = (weight, min(i, j), max(i, j))
                    if best[color] is None or edge < best[color]:
                        best[color] = edge
                value = intervals[i][1] if reverse else -intervals[i][0]
                two = _offer(two, value, i, color)

        # All components have at least one outgoing edge in the complete graph.
        assert all(edge is not None for edge in best)
        adjacency = [[] for _ in range(count)]
        for edge in best:
            _, i, j = edge
            u, v = colors[i], colors[j]
            adjacency[u].append((v, edge))
            adjacency[v].append((u, edge))

        # Traverse the chosen-edge forest (allowing duplicate undirected edges).
        # Assign dense new component IDs in O(number of old components).
        new_color = [-1] * count
        new_count = 0
        for root in range(count):
            if new_color[root] >= 0:
                continue
            new_color[root] = new_count
            stack = [root]
            while stack:
                u = stack.pop()
                for v, edge in adjacency[u]:
                    if new_color[v] < 0:
                        new_color[v] = new_count
                        tree.append(edge)
                        stack.append(v)
            new_count += 1
        assert new_count * 2 <= count
        colors = [new_color[color] for color in colors]
        count = new_count
        counts.append(count)

    assert len(tree) == n - 1
    return max((edge[0] for edge in tree), default=0), tree, counts


def robust_fixed_complete(intervals):
    """Independent full-edge Kruskal oracle, O(n^2 log n)."""
    n = len(intervals)
    edges = sorted((max(bi - aj, bj - ai), i, j)
                   for i, (ai, bi) in enumerate(intervals)
                   for j, (aj, bj) in enumerate(intervals) if i < j)
    parents = list(range(n))

    def find(i):
        while parents[i] != i:
            parents[i] = parents[parents[i]]
            i = parents[i]
        return i

    tree = []
    for edge in edges:
        _, i, j = edge
        u, v = find(i), find(j)
        if u != v:
            parents[u] = v
            tree.append(edge)
            if len(tree) == n - 1:
                break
    return max((edge[0] for edge in tree), default=0), tree


def robust_fixed_prufer(intervals):
    """Third oracle: enumerate labeled trees, directly minimize bottleneck."""
    n = len(intervals)
    if n == 1:
        return 0
    answer = None
    for code in product(range(n), repeat=n - 2):
        degree = [1] * n
        for v in code:
            degree[v] += 1
        weights = []
        for v in code:
            u = next(j for j in range(n) if degree[j] == 1)
            weights.append(max(intervals[u][1] - intervals[v][0], intervals[v][1] - intervals[u][0]))
            degree[u] -= 1
            degree[v] -= 1
        u, v = [j for j in range(n) if degree[j] == 1]
        weights.append(max(intervals[u][1] - intervals[v][0], intervals[v][1] - intervals[u][0]))
        value = max(weights)
        answer = value if answer is None else min(answer, value)
    return answer


def _rf_check(intervals, use_prufer=False):
    value, edges, counts = robust_fixed_fast(intervals)
    expected, expected_edges = robust_fixed_complete(intervals)
    assert value == expected, (intervals, value, expected)
    assert sum(edge[0] for edge in edges) == sum(edge[0] for edge in expected_edges), intervals
    # Common total edge ordering yields the same unique tie-broken MST.
    assert sorted(edges) == sorted(expected_edges), intervals
    assert all(max(intervals[i][1] - intervals[j][0], intervals[j][1] - intervals[i][0]) == weight
               for weight, i, j in edges)
    assert all(2 * after <= before for before, after in zip(counts, counts[1:]))
    if use_prufer:
        assert value == robust_fixed_prufer(intervals), intervals


def run_fixed_fast():
    universe = [(a, b) for a in range(7) for b in range(a, 7)]
    exhaustive = {}
    for n in (2, 3, 4):
        total = 0
        for intervals in combinations_with_replacement(universe, n):
            _rf_check(intervals)
            total += 1
        exhaustive[n] = total

    # Independent direct minimax oracle, with label permutations and ties.
    small_universe = [(a, b) for a in range(5) for b in range(a, 5)]
    prufer_total = 0
    for n in (2, 3, 4):
        for intervals in combinations_with_replacement(small_universe, n):
            _rf_check(intervals, use_prufer=True)
            prufer_total += 1

    rng = random.Random(20260914)
    random_total = 2500
    for _ in range(random_total):
        n = rng.randrange(2, 51)
        intervals = []
        for i in range(n):
            a, b = sorted((rng.randrange(-100, 101), rng.randrange(-100, 101)))
            intervals.append((a, b))
        rng.shuffle(intervals)
        _rf_check(intervals)

    rational_total = 200
    for _ in range(rational_total):
        n = rng.randrange(2, 20)
        intervals = [tuple(sorted((Fraction(rng.randrange(-30, 31), rng.randrange(1, 11)),
                                   Fraction(rng.randrange(-30, 31), rng.randrange(1, 11)))))
                     for i in range(n)]
        _rf_check(intervals)
    _rf_check([(0, 0)])
    _rf_check([(0, 0)] * 50)
    _rf_check([(-i, i) for i in range(50)])
    _rf_check([(i, i) for i in range(50)])

    result = {
        "algorithm": "center-sorted two-color Boruvka, O(n log n) arithmetic/comparison operations, O(n) space",
        "exhaustive_integer_multisets_endpoints_0_to_6": exhaustive,
        "exhaustive_total": sum(exhaustive.values()),
        "prufer_crosschecks_endpoints_0_to_4": prufer_total,
        "random_integer_labelled_families": random_total,
        "random_rational_labelled_families": rational_total,
        "handpicked_degenerate_cases": 4,
        "mismatches": 0,
        "seed": 20260914,
    }
    print(json.dumps(result, ensure_ascii=False, indent=2))
    return result




if __name__ == "__main__":
    import sys
    mode = sys.argv[1] if len(sys.argv) > 1 else "all"
    if mode not in {"all", "intervals", "trees", "fixed"}:
        raise SystemExit("Choose all, intervals, trees, or fixed")
    sys.argv = [sys.argv[0]] + sys.argv[2:]
    if mode in {"all", "intervals"}:
        print("INTERVAL CHECKS", flush=True)
        run_intervals()
    if mode in {"all", "fixed"}:
        print("FIXED ROBUST TREE CHECKS", flush=True)
        run_fixed_fast()
    if mode in {"all", "trees"}:
        print("TREE CHECKS", flush=True)
        run()
訂正記録・仮定の境界・次の研究課題

5. 訂正・失敗しやすい推論・次の問い

論点 本稿で採用する正確な扱い
ceil(n/2) を予想として出発した 一般証明と全 n の達成例を記録。予想の状態を更新
短い区間だけの固定接続に2r必要という粗い見積り 交差区間 J_i=[b_i−r,a_i] によって r で十分と分かった
各頂点に近い隣接先があるだけで全体連結とする それだけでは不足。独立証明では削除後の帰納法を必ず組み合わせる
小さい観測誤差なら、誤差を増やしても滑らかに劣化する (T3) は閾値で跳躍する。D≤δ の条件を落とさない
推定器の最適中心は必ず観測に整合する 一般には違う。(T6) の出力制約を明記
葉に最小識別集合を置けること自体を新規とする 既知。今回の検討対象は全点対の数値的優越
独立な不確実集合と相関のある全配置集合を同一視する 全順列の相関反例では n−1 倍になる
有限検査・複数AIの一致を形式証明や人間査読と呼ぶ いずれも未実施。証明本文と検査の実際の範囲を提示

次の研究として具体的に残るのは、(i) S1の葉部分集合最適化を効率よく解くアルゴリズム、(ii) 閉路が一本ある空間や異なる誤差幅への拡張、(iii) S2で最良係数を達成する全ての区間族の分類、(iv) 正確な命題ごとの文献追跡と外部レビュー、(v) 幾何学の定式化を含む証明支援系への移植、(vi) S2の比較係数が木距離やユークリッド空間 ℝᵈ の独立な不確実集合でも成り立つかの検討である。最後の問いでは、実直線で使った隙間・端点・短区間の削除という構造をそのまま仮定できない。これらの一般化の成立は本稿では未証明である。

現段階で「空間一般を解いた」「新定理が学術的に確定した」とは主張しない。一方で、今回の二つの研究には、仮定・結論・達成例・完全な証明・再現コードを備えた検証可能な単位ができている。

出典と照合範囲

本文の比較判断は、以下の一次論文の定義・定理・証明のうち、明記した箇所を根拠とする。「全文から該当節を照合」は、論文全体の全証明を逐行監査したという意味ではない。書誌のみ、要旨のみ、部分プレビューは区別する。定理番号はリンク先の版に対応する。

S1:距離観測・木・最適回復

  1. Joonas Ilmavirta, Antti Kykkänen, Matti Lassas, Teemu Saksala, Andrew Shedlock. Lipschitz Stability of Travel Time Data. 2024 preprint/2025 journal. 本文出版版。定義1・3・4、注意11、命題13・17・23、定理6・9の対象と結論を本文照合。出版版追加部分の全面照合は未完。

  2. Samir Khuller, Balaji Raghavachari, Azriel Rosenfeld. Localization in Graphs, UMIACS-TR-94-92 (1994)/Landmarks in graphs, Discrete Applied Mathematics 70(3), 217–229 (1996). 技術報告出版版。報告§2.1、補題2.1–2.3、定理2.4と証明を照合。出版版に同じ定理番号を当てていない。

  3. Andrew V. Goldberg, Chris Harrelson. Computing the Shortest Path: A* Search Meets Graph Theory. MSR-TR-2004-24/SODA 2005. 研究機関の書誌報告本文。§6–7の距離差による下界とランドマーク選択、§10の関連結論を照合。無向グラフの同じsup型下界と周辺配置の先例。

  4. Asuman Güven Aksoy, Timur Oikhberg. Some results on Metric Trees. 2010 preprint. 本文。定義2.1、定理2.3、定義6.1、定理6.2と証明、注意6.4を照合。非凸な整合集合にも使える半直径の中心原理。

  5. Iztok Peterin, Jelena Sedlar, Riste Škrekovski, Ismael G. Yero. Resolving vertices of graphs with differences. 2023 preprint. 本文。§1–3の定義・木、§4.1定理19の定式化・構成を照合。距離差のℓ1合計によるweak k-metric dimension。全証明の独立再検証は未実施。

  6. Paula Mürmann, Robin Jaccard, Maximilien Dreveton, Aryan Alavi Razavi Ravari, Patrick Thiran. Reducing Sensor Requirements by Relaxing the Network Metric Dimension. 2025. 本文出版版。定義2.2、定理3.1–3.2、§6.1の証明構造を照合。等しい署名の空間的曖昧さとstemming。

  7. Urs Lang, Maël Pavón, Roger Züst. Metric stability of trees and tight spans. 2013. 本文出版版。§2のspanningの定義、補題2.4、主定理3.2の対象を照合。S1.5の短い別証明の幾何学的背景。

  8. David Bryant, Katharina T. Huber, Vincent Moulton, Andreas Spillner. Subtree Distances, Tight Spans and Diversities. 2025 preprint v2. 本文。§2.1定理2.1–2.2、§2.2定理2.4の関連性質と証明を照合。Dressに由来するtight-span固定点性を確認。Dressの1984年原典全文は未照合。

  9. Sheng Bau, Alan F. Beardon. The Metric Dimension of Metric Spaces. Computational Methods and Function Theory 13, 295–305 (2013). 出版版読めた論文本文の転載。§1–3、§5の対象、§7定理7.1–7.2と証明を照合。前段の要旨のみの確認から、本文確認へ更新。

  10. Craig Gotsman, Kai Hormann. On Landmark Distances in Polygons. Computer Graphics Forum 40(5), 275–287 (2021). 出版版著者PDF。出版社提供の冒頭1頁プレビューで§1の式(1)(2)と要旨を確認。全文未照合。未読の補題の有無は判断していない。

  11. Alejandro Estrada-Moreno, Carlos García-Gómez, Yunior Ramírez-Cruz, Juan Alberto Rodríguez-Velázquez. The Simultaneous Strong Metric Dimension of Graph Families. 2015 preprint. 本文。導入と§5冒頭の、木のstrong metric basisが葉数−1となる既知結果の再掲を確認。原典Sebő–Tannier (2004) 全文は未照合。

  12. Le, Ruiz, Dhara. Landmark-Based Node Representations for Shortest Path Distance Approximations in Random Graphs. 2025, v2. 本文。Algorithm 1、定理4.1などの前段の本文照合を継承。ランダムグラフの定量的歪みという既知内容に帰属する。

  13. Albert Cohen, Wolfgang Dahmen, Ronald DeVore. State Estimation — The Role of Reduced Models. 2020 preprint. 本文。§2.3、式(2.20)–(2.22)を照合。整合集合のChebyshev中心と半径による最適回復。論文の設定はHilbert空間・線形観測であり、本稿の非線形な木の観測全体をそのまま同じ定理とはしない。

S2:不確実位置・ボトルネック・区間構造

  1. Erin Chambers, Alejandro Erickson, Sándor P. Fekete, Jonathan Lenchner, Jeff Sember, Venkatesh Srinivasan, Ulrike Stege, Svetlana Stolpner, Christophe Weibel, Sue Whitesides. Connectivity Graphs of Uncertainty Regions. ISAAC 2010/Algorithmica 78, 990–1019 (2017). 本文v4出版版。定義、§1.1–1.2、§5の定理5.1–5.3と証明、結論・引用先を照合。会議版は書誌と要旨まで。

  2. Adam Kasperski, Paweł Zieliński. Bottleneck combinatorial optimization problems with uncertain costs and the OWA criterion. Operations Research Letters 41(6), 639–643 (2013). 本文。§1–2と§3冒頭を照合。最悪のitem costに置換する一般原理を明示する。

  3. Jack Edmonds, D. R. Fulkerson. Bottleneck Extrema. Journal of Combinatorial Theory 8(3), 299–306 (1970). 大学公開の原著PDF出版版。§2の無番号Theorem、補題A–Cと証明、pp.300–303を照合。clutter/blockerのmin–max双対。

  4. Sergio Cabello, David Gajser. Connectivity with Uncertainty Regions Given as Line Segments. Algorithmica 86, 1512–1544 (2024). 本文出版版。導入の定義・関連研究・結果と引用先を照合。best-caseのFPT結果。全FPT証明の逐行監査ではない。

  5. Abolfazl Poureidi, Mohammad Farshi. On algorithmic complexity of imprecise spanners. Computational Geometry 117, 102051 (2024). 出版版。2024版は公開された要旨・導入の定義まで。関連する同著者の2017原稿 The well-separated pair decomposition for balls§1–2・補題1 は本文確認。両版の完全な同一性は仮定しない。

  6. Magnús M. Halldórsson, Murilo Santos de Lima. Query-Competitive Sorting with Uncertainty. Theoretical Computer Science (2021). 本文出版版。§2定義1・定理3と証明・補題4、§9 Facts 31–33を照合。co-TT/符号付き区間の構造は既知だが、最適化対象は問い合わせ費用。

  7. Marin Bougeret, Jérémy Omer, Michael Poss. Optimization problems in graphs with locational uncertainty. INFORMS Journal on Computing (2023). 本文。定義、§2、§4、結論の前段の本文照合を継承。独立な位置不確実性の下で、固定グラフの辺長の合計を評価する。

  8. Marin Bougeret, Jérémy Omer, Michael Poss. Approximating optimization problems in graphs with locational uncertainty. Discrete Mathematics & Theoretical Computer Science 26:3 (2024). 本文。目的、§2.1–2.2、表1などの前段の本文照合を継承。「和の最大」と「最大の和」の比較であり、本稿の木選択の量化交換とは違う。

  9. Gui Citovsky, Tyler Mayer, Joseph S. B. Mitchell. TSP With Locational Uncertainty: The Adversarial Model. SoCG 2017. 本文出版版。§1の定義・関連研究、§2の対象と結果を本文確認。前段の要旨のみの確認から更新。巡回順序の先決めの先例で、目的は総延長。

  10. Maarten Löffler, Benjamin Raichel. Preprocessing Uncertain Data into Supersequences for Sorting and Gaps. 2026 01 27, arXiv:2601.19453v1. 本文。§1.1–1.4、§2、§5.2、定義18–19を照合。与えられた実現の最大隙間の復元と、その前処理。arXiv本文中の会議テンプレート表記は刊行情報に使わない。

  11. Ankush Acharyya, Vahideh Keikha, Maria Saumell, Rodrigo I. Silveira. Computing Largest Minimum Color-Spanning Intervals of Imprecise Points. Theory of Computing Systems 70, article 31 (2026 04 30). 本文。導入、§1.1、§2の定理1・2と系1、§3の補題3・分離条件を照合。色が与えられた区間のmin color-spanning intervalを最大化する。

  12. Mario E. Consuegra, Giri Narasimhan. Geometric Avatar Problems. 2013. 著者公開PDF。§1–2、定理1–2を照合。最大化する最小隙間と、最小化する最大隙間。全文の全節を照合したという意味ではない。

  13. Pranjal Awasthi, Vineet Goyal, Brian Y. Lu. On the adaptivity gap in two-stage robust linear optimization under uncertain packing constraints. Mathematical Programming 173, 313–352 (2019). 出版版著者公開稿。著者公開稿の§1、式(1.1)–(1.2)、§6・式(6.1)・定理9、列独立の場合の定理6–7・系1を照合。連続packingモデルの静的/可変比。全証明の逐行監査ではない。定理番号は出版版と混同しない。

  14. Dimitris Bertsimas, Vineet Goyal, Brian Y. Lu. A tight characterization of the performance of static solutions in two-stage adjustable robust linear optimization. Mathematical Programming 150, 281–319 (2015). 出版版著者公開稿。著者公開稿の§2・式(2.3)–(2.6)、§3、§4定理3–4を照合。一般の凸集合に関する 2015年の著者補足ノート は冒頭と修正証明の構成を確認。全証明の独立再検証ではない。

  15. Robert Sedgewick, Kevin Wayne. BoruvkaMST.java, Algorithms, 4th edition の著者公開実装。本文。各成分の最小外向き辺を選ぶ標準Borůvka法と、その反復を確認。本稿の中心順2走査は、標準枠組みの一次元への具体化として証明する。

新規性の判定に残る限界

照合対象は、metric dimension、strong metric dimension、landmark distortion、travel-time representation、ALT、tight span、spanning、optimal recovery、information radius、WCU、robust bottleneck、adaptivity gap、static versus adjustable robust optimization、two-stage adjustable robust optimization、a priori optimization、price of nonadaptivity、locational uncertainty、imprecise spanner、co-TT、every transversal、maximum gapとその引用先・後続研究である。数式の文字列が見つからないことだけで新規性を判断していない。 目的関数、量化順序、空間、辺内部の扱い、測定誤差の種類、短い既知帰結かどうかを比較した。

未解消の重要な照合先は次の通りである。

MathSciNet/zbMATHの網羅検索、全学位論文・非英語文献・全被引用文献の追跡、著者への照会は未実施である。主要な差分を説明できる段階にはあるが、専門家による独立照合を終えた優先権確認ではない。次の確認では、S2の正確なcore条件と最良係数、S1の非単射を含む A_S の式を、そのまま比較可能な短い命題として提示する必要がある。

公開する場合の主張

有限実木の固定距離観測について、有限誤差の曖昧さ直径を明示した。また、独立した直線上の位置不確実性について、全配置連結性を短い区間の構造で特徴付け、固定/可変接続の最良係数を導いた。距離座標、情報半径、spanning、WCU、robust bottleneck、符号付き区間グラフは既知の道具である。2026 09 14までに照合した一次資料では、主結果それぞれと同一の定理を特定できていない。数学的な一般証明は本稿に収録し、学術的新規性は独立確認を待つ。

レビュー対応記録

HTML版1.0への提供レビュー review_spatial_novelty_2026-09-14.html を踏まえ、版1.1で次の変更を行った。指摘番号は提供レビューに対応する。

指摘 判断と対応
01:射影恒等式の両極値 採用。葉の場合と、点を除いた成分に基準点がある場合を分け、差 ±D の達成を明示した
02:半直径中心の証明 採用。ただし提案の a≤t だけでは説明が足りないため、a≤min(t,D−t) を導いて両側を処理した
03:幅 r の境界 明確化を採用。削除可能な条件≥rは保ち、実際に削除するのは>r、幅=rは短い群に残すと明記した
04:道の中央頂点 採用。2≤L≤m+1 と、添字⌊L/2⌋が内部頂点となることを補った
05:高速公式と実装の違い 採用。j=n の項が prefix の k=n−1 に含まれることを明記し、全体の最大値の同値性を説明した
06:adaptivity gap の文献 追加照合を採用。過去にも同語で検索していたが本文への反映が不足していた。指定された2論文系列の定義・主要定理を照合し、位置独立と辺費用独立の違いを追加。英語の命題は「全区間族にわたる最悪比」と明確にした
07:他の空間への拡張 未解決の問いとして採用。木距離・ℝᵈへの拡張を追加し、成立は未証明とした
08:固定接続の計算量 改善を実施。中心順の2走査を用いるBorůvka法で、R_Fと最適固定木を O(n log n) 操作・O(n)領域で計算する証明と実装を追加した
09:コード結合の残骸 採用。途中のshebang・docstring・古い実行ファイル名を除き、実行案内を先頭に統合した
10:付録の言語属性 採用。日本語の見出し・説明を除き、英語本文だけに lang="en" を適用した
11:数式の代替テキスト 表示式には既にaria-labelがあった。alttextを追加し、番号付きの主要式には日本語の読み下しも付けた。付録の主要定義・主不等式をMathMLに統一した
12:分冊・著者・ライセンス 分冊化は採用せず、単一HTMLとして維持した。英語命題とS1/S2別の証明区画で焦点を明確化。プロジェクト表記を保ち、新たな著者名・ライセンスは指定していない

提供レビューに記載された独立検査は、検証コードが同梱されていないため、本稿で再実行済みの検査件数には加算していない。特に、分母4の有理格子で点を選ぶ検査を、辺内部の全連続領域を調べた検査とは扱わない。レビューの評価を、専門家による査読完了や形式検証完了の認定には用いない。

新たに追加した固定木アルゴリズムは、本稿の更新コードで再現できる。整数の全列挙35,931族、Prüfer全木との直接比較3,860族(部分重複)、整数乱数2,500族、有理数乱数200族、退化例4族で不一致はなかった。これはアルゴリズムの検証記録であり、主定理の新規性を補強する件数ではない。

研究記録・文献照合日:2026 09 14 / HTML版 1.1
「探索的な数学的発見」プロジェクト。識別子 S1・S2 は本研究ノート内のものであり、既存の成果台帳の E01・E02 とは別に扱う。

本文、数式、図解、検証コードはこの1ファイルに収録。出典への外部リンクの閲覧には通信が必要。数学的状態:一般証明を記録。新規性の状態:正確な主候補の同一先行結果は未特定、独立確認を待つ。