- 物理機リージョン/AZ
- ハイパーバイザVM exit で捕まえる
- VMゲストOS
- コンテナnamespace / cgroup
- プロセスアプリ / DB今ここ
この期の各回は「問題の構造を1つ使って速くする」話でした。最終回は、使える構造が見つかっていない問題をどう見分け、どう扱うかです。
まず結論
「NP 完全」は「解けない」という意味ではありません。NP に属するどの問題もこれに言い換え(還元)られるので、これが速く解けたら全部が速く解ける、という位置づけです。
その「速く解けるか」は未解決です。だから実務では、前提を絞る・小さく総当たりする・保証つきで近似する、のどれかを選びます。
部分和(数の集まりから、合計がちょうど目標になる組を探す)を総当たりで解きます。要素を20個から30個に増やすと、時間はおよそ何倍になるでしょうか。
当てることが目的ではありません。外した予測ほど記憶に残るので、直感で選んでください。
検算は速い。探すのは倍々に増える
部分和の問題で考えます。数の集まりから、合計がちょうど目標になる組を探す問題です。答えの候補を渡されたら、足して比べれば済みます。読むのは候補の要素だけです。ところが探す側は、組の数が要素1個ごとに倍になります。
Clay Mathematics Institute は、この非対称を問題の核心としています。
If it is easy to check that a solution to a problem is correct, is it also easy to solve the problem? This is the essence of the P vs NP question.
ここで還元を使います。問題 A の入力を問題 B の入力に言い換え、B を解いて答えを持ち帰る操作です。言い換えが多項式時間で済むなら、B が速く解ければ A も速く解けます。難しさは A から B へ運ばれます。NP 完全とは、NP のどの問題からも還元が届く行き先のことです。
- ・還元が示すのは「少なくとも同じだけ難しい」という順序。行き先が解けないとは言っていない
- ・P = NP かどうかは未解決(Clay の表示は Unsolved)
部分和を総当たりすると、1個ごとに約2倍
手元で測りました(Python 3.14.6 / macOS 26.5.2 arm64、2026-10-07)。要素は全部偶数で、目標は奇数です。したがって解はなく、全部の組を必ず調べます。
n 2^n time_s ratio_to_prev10 1024 0.000311 2048 0.0006 2.1720 1048576 0.5767 2.1021 2097152 1.2183 2.1122 4194304 2.5566 2.10n=22 check ok=True per-check 0.80 microseconds (reads 11 elements)
n=10〜22 で、時間の比は 2.09〜2.27(中央値は約 2.1)でした。2 を少し超えるのは、1組ごとに n 個を足すからです。秒数は機械で変わるので、見るのは倍率です。検算は n=22 でも1回 1μs 未満でした。
この「全部をどれかに言い換える」を、Cook が 1971 年(STOC '71)、Karp が 1972 年に発表しました。Levin の論文の刊行は 1973 年です(Clay は、Cook と Levin が 1971 年に独立に定式化したと書きます)。Cook の Summary の趣旨はこうです。非決定性の多項式時間で解ける認識問題はどれも、命題論理式についての1つの問題へ還元できる。Karp は21問題の一覧(SATISFIABILITY、CLIQUE、KNAPSACK、PARTITION、DIRECTED HAMILTON CIRCUIT など)を挙げ、こう書きました。
We proceed to give a series of explicit reductions, showing that SATISFIABILITY is reducible to each of the problems listed.
Levin について、Cook は Clay の問題記述でこう書いています。「independently of Cook and Karp, defined the notion of “universal search problem”」。そして結論は、今も次の一文です。
Most complexity theorists believe that P ≠ NP.
「問題 A を問題 B に多項式時間で還元できる」から言えることはどれですか。
1語変えると性質が変わり、前提を絞ると戻る
NP 完全の札は、問題の文言に付きます。手法に付くのではありません。だから次の3点を確かめます。
- 問題を1語変えていないか。 似た名前の問題でも、多項式時間の手法があるとは限りません。
- 前提を絞れないか。 一般形が NP 完全でも、実際の入力が特別な形なら速く解けることがあります。
- 近似で足りないか。 最適でなくても、「最悪でも何倍以内」と保証できる手法があります。
3 の例として、三角不等式が成り立つ巡回セールスマン問題を挙げます。巡回路から1辺を抜くと全域木なので、最小全域木の重さは最適以下です。木を前順にたどって往復すると重さの2倍で、三角不等式があれば近道しても伸びません。だから最適の2倍以内に収まります。Christofides の抄録は、2倍が既知の値だったと書いています。
This represents a 50% reduction over the value 2 which was the previously best known such ratio for the performance of other polynomial growth algorithms for the TSP.
3/2 倍の手法は、Christofides(1976)と Serdyukov(1978)が並べて挙げられます。van Bevern & Slugina(2020)は、Serdyukov が独立に得たことを「plausible」としています。手元の6点の固定例では比が 1.0000 でしたが、これは偶然です。ランダムに200例を作ると最大 1.3306 で、どれも2以下でした。
最短と最長、特定の版と最小版
最短路と最長単純閉路。 最短路には、負の閉路が無い場合、多項式時間で解ける手法があります(この期の第8・9回で扱いました)。問いを「同じ頂点を2度通らない、最も長い閉路」に変えます。辺の重みを全部1にして「長さが頂点数 V の単純閉路があるか」と問うと、全頂点を1度ずつ回る閉路があるか、つまり Karp の一覧の10番 UNDIRECTED HAMILTON CIRCUIT そのものです。還元の向きで読むと、最長単純閉路は少なくともこれと同じだけ難しいことになります。
依存の解決。 Russ Cox の「Version SAT」(2016-12-13)はこう書き出します。
Dependency hell is NP-complete. But maybe we can climb out.
本文では「the version selection problem is NP-complete」と書き、3-SAT からの還元を自分で示しています。Cox は、Debian と RedHat の NP 完全性の証明が EDOS の報告書(2005)にあるとも紹介しています。プロジェクト側の Web 版には次の定理文があります(報告書の PDF 本体は未取得)。
Theorem 1 Checking whether a single package P can be installed, given a repository R, is NP-complete.
Cox は、前提の側を変える道も示しています。
what if, instead of allowing a dependency to list specific package versions, a dependency can only specify a minimum version?
Go の MVS は、この形で動きます。go.dev/ref/mod の説明はこうです。
MVS starts at the main modules (special vertices in the graph that have no version) and traverses the graph, tracking the highest required version of each module.
これはグラフの巡回です(第11期の『依存はグラフ — import が解決される形』で見た形です)。ただし、このページに NP の語はありません。「Go 公式が NP を避けた」とは書けません。
Go の MVS が依存の版をグラフの巡回で決められる理由として、出典に沿っているのはどれですか。
特定の版を指定できる依存解決(Cox の VERSION)
依存として特定の版(例: B 1.0)を指定でき、版ごとに依存が違ってよく、同じパッケージの2つの版は同時に入れられない。Cox はこうした前提だけで、どんな 3-SAT の例も答えを変えずに変換できると示した。
最小版だけを指定する依存解決(Go の MVS)
require は「この版以上」だけを書く。MVS はグラフをたどって、各モジュールの最大の要求版を記録する。それが全要求を満たす最小の版の組になる。
どちらも「依存の版を決める」問題です。片方は NP 完全、もう片方はグラフの巡回で済みます。差を生んでいるのは何でしょうか。
Cox が NP 完全を避ける道として、どの前提を崩したかを思い出してください。
この章のまとめ
- NP 完全は「解けない」ではない。 NP のどの問題からも還元が届く行き先である。これが速く解ければ全部が速く解ける。P = NP かどうかは未解決(Clay: Unsolved)。
- 検算は速く、探すのは倍々。 部分和の時間比は要素1個ごとに 2.09〜2.27、検算は1μs 未満だった。
- 札は問題の文言に付く。 1語変える、前提を絞る(MVS)、保証つきで近似する(三角不等式つきなら2倍以内)。
- この期の13本が使っている構造は次のとおりです。
| 回 | タイトル | 使っている構造 |
|---|---|---|
| 1 | 正しさは「毎周守られる約束」で言う — ループ不変式 | 毎周守られる約束 |
| 2 | 分けて、解いて、合わせる — 仕事は段ごとに数える | 段ごとの仕事の和 |
| 3 | 最悪の入力を、乱数の側へ移す — 乱択と期待値 | 自分で振る乱数 |
| 4 | キーの形を知っていれば床をくぐれる — 比較しない整列 | キーの桁・範囲 |
| 5 | 配列に詰めた木 — ヒープは添字で親子をたどる | 隙間の無い木の形 |
| 6 | 部分問題を定義し、依存の順に表を埋める — 動的計画法 | 部分問題と依存の順 |
| 7 | 1手目を入れ替えても損しないとき — 貪欲法と交換論法 | 交換しても損しない |
| 8 | 最も近いものから確定する — Dijkstra 法は負の辺が無いことを使う | 負の辺が無い |
| 9 | 確定できないなら、全部の辺を回数分ゆるめる — Bellman-Ford 法 | 最短路は同じ頂点を2度通らない |
| 10 | カットを渡る最も軽い辺は使ってよい — 最小全域木 | カット |
| 11 | 流せる量は一番細い切れ目で決まる — 最大フロー=最小カット | 細い切れ目(カット) |
| 12 | 一致した分を捨てない — 文字列照合と失敗関数 | パターン自身の重なり |
| 13 | 還元は難しさを運ぶ — NP 完全と「速く解けない」の意味 | 使える構造が見つかっていない |
- 既存クイズでは、「計算理論と形式言語」の computation-theory-14〜18、「計算理論と形式言語 II(発展編)」の computation-theory-2-2・-4・-12・-13・-14、「アルゴリズム IV(実務と設計判断)」の algorithm-4-9・-10 がこの章の結論の一行版です。
CLRS(『アルゴリズムイントロダクション』)の目次や索引で NP-completeness(NP 完全性) を探すと、この回の内容に対応する章や節が見つかります。章の題と番号は版で変わるので、手元の目次で確かめてください。
自分の現場で確かめる
読んだだけでは身につきません。手元の環境で実際に見てみてください。
理解度チェック
読んだ直後は「分かった」と感じやすいものです。実際に解いて確かめてください。
P と NP の関係について、2026年10月時点で言えることはどれですか。
用語集(3語)
- 還元(reduction)
- 問題 A の入力を問題 B の入力に言い換え、B の答えから A の答えを得ること。言い換えが多項式時間なら、B が速く解ければ A も速く解ける。
- NP 完全
- NP に属し、かつ NP のどの問題もそこへ多項式時間で還元できる問題。どれか1つが多項式時間で解ければ NP 全体が解ける。
- 近似比
- 近似の答えと最適値の比。上限が証明されていれば「最悪でも何倍以内」と言える。
出典(一次ソース)
- Cook (1971) The complexity of theorem-proving procedures, STOC '71 pp.151–158(著者サイト) ↗
- Karp (1972) Reducibility among Combinatorial Problems(DOI) ↗
- Clay Mathematics Institute — P vs NP ↗
- Stephen Cook — The P versus NP Problem(Clay 公式問題記述) ↗
- Russ Cox — Version SAT(2016-12-13) ↗
- Go Modules Reference — Minimal version selection (MVS) ↗
- EDOS — algorithmic(mancoosi.org。WP2-D2.1 の成果の Web 版) ↗
- Di Cosmo (2005) EDOS deliverable WP2-D2.1(HAL hal-00697463) ↗
- Christofides — Worst-Case Analysis of a New Heuristic for the TSP(Operations Research Forum 2022 再刊) ↗
- van Bevern & Slugina (2020) A historical note on the 3/2-approximation algorithm for the metric TSP(arXiv) ↗