Null move pruning (NMP): at a non-PV node with depth ≥ 3, give the opponent an extra move (side flips, no piece moved).
Search at depth
d − R − 1 (typically R=2). If score ≥ β, real moves would fail high too — return β without searching moves.
Based on zugzwang is rare in middlegames. Endgames with zugzwang need guards.Concept
Pass Move Test
Position P
Side to move considers real moves…
∅ →
Null position
Opponent moves twice. Still winning? → prune all moves at P.
Algorithm
When to Try NMP
1
Guards pass? Not in check, has non-pawn material, depth ≥ 3, not PV node.
2
Make null move — flip side, increment ply, hash key unchanged (usually).
3
Search
−search(d − 1 − R, −β, −β + 1) null window.4
Fail-high? score ≥ β → return β (cutoff). Else search real moves normally.
if (depth >= 3 && !pvNode && hasNonPawnMaterial && !inCheck) {
makeNullMove();
score = -search(depth - 3, -beta, -beta + 1); // R=2
unmakeNullMove();
if (score >= beta) return beta;
}
Guards
When NMP Is Disabled
Zugzwang endgamesOnly kings/pawns — passing can be mandatory loss.
In checkMust respond; null move illegal conceptually.
PV / rootNever prune principal variation nodes.
Verification searchRe-search suspicious cutoffs at reduced R or disable NMP.
Related: Late Move Reduction · Razoring · All Blogs