Dev Study
← アルゴリズムの手法 — CLRS を読むための地図
レッスン 13 / 13·約 9 分·第29期 アルゴリズムの手法 — CLRS を読むための地図

還元は難しさを運ぶ — NP 完全と「速く解けない」の意味

アプリと DB の下に何が積まれているか(左が下、右が上)
  1. 物理機リージョン/AZ
  2. ハイパーバイザVM exit で捕まえる
  3. VMゲストOS
  4. コンテナnamespace / cgroup
  5. プロセスアプリ / 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 のどの問題からも還元が届く行き先のことです。

還元の向き — 行き先が速く解ければ、出発点も速く解ける
NP の問題答えの検算は速い
部分和検算は足すだけ
版の選択Cox 2016
多項式時間で言い換える(還元)
NP 完全な問題例: SATISFIABILITY
これが速く解けたら
NP 全体が速く解けるP = NP。未解決
  • ・還元が示すのは「少なくとも同じだけ難しい」という順序。行き先が解けないとは言っていない
  • ・P = NP かどうかは未解決(Clay の表示は Unsolved)
具体実物

部分和を総当たりすると、1個ごとに約2倍

手元で測りました(Python 3.14.6 / macOS 26.5.2 arm64、2026-10-07)。要素は全部偶数で、目標は奇数です。したがって解はなく、全部の組を必ず調べます。

$ python3 subset_exp.py(抜粋)コマンド出力
n 2^n time_s ratio_to_prev
10 1024 0.0003
11 2048 0.0006 2.17
20 1048576 0.5767 2.10
21 2097152 1.2183 2.11
22 4194304 2.5566 2.10
 
n=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. 問題を1語変えていないか。 似た名前の問題でも、多項式時間の手法があるとは限りません。
  2. 前提を絞れないか。 一般形が NP 完全でも、実際の入力が特別な形なら速く解けることがあります。
  3. 近似で足りないか。 最適でなくても、「最悪でも何倍以内」と保証できる手法があります。

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 が依存の版をグラフの巡回で決められる理由として、出典に沿っているのはどれですか。

⇄ 2つを見比べる
具体例 A

特定の版を指定できる依存解決(Cox の VERSION)

依存として特定の版(例: B 1.0)を指定でき、版ごとに依存が違ってよく、同じパッケージの2つの版は同時に入れられない。Cox はこうした前提だけで、どんな 3-SAT の例も答えを変えずに変換できると示した。

具体例 B

最小版だけを指定する依存解決(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部分問題を定義し、依存の順に表を埋める — 動的計画法部分問題と依存の順
71手目を入れ替えても損しないとき — 貪欲法と交換論法交換しても損しない
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 完全性) を探すと、この回の内容に対応する章や節が見つかります。章の題と番号は版で変わるので、手元の目次で確かめてください。

自分の現場で確かめる

読んだだけでは身につきません。手元の環境で実際に見てみてください。

環境:

理解度チェック

読んだ直後は「分かった」と感じやすいものです。実際に解いて確かめてください。

問題 1 / 3正解: 0

P と NP の関係について、2026年10月時点で言えることはどれですか。

用語集(3語)
還元(reduction)
問題 A の入力を問題 B の入力に言い換え、B の答えから A の答えを得ること。言い換えが多項式時間なら、B が速く解ければ A も速く解ける。
NP 完全
NP に属し、かつ NP のどの問題もそこへ多項式時間で還元できる問題。どれか1つが多項式時間で解ければ NP 全体が解ける。
近似比
近似の答えと最適値の比。上限が証明されていれば「最悪でも何倍以内」と言える。