  Subtraction games are played with one or more heaps of tokens, with players
taking turns removing from a single heap a number of tokens belonging to a
specified subtraction set; the last player to move wins. We describe how to
compute the set of winning heap sizes in single-heap subtraction games (for an
input consisting of the subtraction set and maximum heap size $n$), in time
$\tilde O(n)$, where the $\tilde O$ elides logarithmic factors. For multi-heap
games, the optimal game play is determined by the nim-value of each heap; we
describe how to compute the nim-values of all heaps of size up to~$n$ in time
$\tilde O(mn)$, where $m$ is the maximum nim-value occurring among these heap
sizes. These time bounds improve naive dynamic programming algorithms with time
$O(n|S|)$, because $m\le|S|$ for all such games. We apply these results to the
game of subtract-a-square, whose set of winning positions is a maximal
square-difference-free set of a type studied in number theory in connection
with the Furstenberg-S\'ark\"ozy theorem. We provide experimental evidence
that, for this game, the set of winning positions has a density comparable to
that of the densest known square-difference-free sets, and has a modular
structure related to the known constructions for these dense sets.
Additionally, this game's nim-values are (experimentally) significantly smaller
than the size of its subtraction set, implying that our algorithm achieves a
polynomial speedup over dynamic programming.
