A calculus of the absurd
\(\newcommand{\footnotename}{footnote}\)
\(\def \LWRfootnote {1}\)
\(\newcommand {\footnote }[2][\LWRfootnote ]{{}^{\mathrm {#1}}}\)
\(\newcommand {\footnotemark }[1][\LWRfootnote ]{{}^{\mathrm {#1}}}\)
\(\let \LWRorighspace \hspace \)
\(\renewcommand {\hspace }{\ifstar \LWRorighspace \LWRorighspace }\)
\(\newcommand {\mathnormal }[1]{{#1}}\)
\(\newcommand \ensuremath [1]{#1}\)
\(\newcommand {\LWRframebox }[2][]{\fbox {#2}} \newcommand {\framebox }[1][]{\LWRframebox } \)
\(\newcommand {\setlength }[2]{}\)
\(\newcommand {\addtolength }[2]{}\)
\(\newcommand {\setcounter }[2]{}\)
\(\newcommand {\addtocounter }[2]{}\)
\(\newcommand {\arabic }[1]{}\)
\(\newcommand {\number }[1]{}\)
\(\newcommand {\noalign }[1]{\text {#1}\notag \\}\)
\(\newcommand {\cline }[1]{}\)
\(\newcommand {\directlua }[1]{\text {(directlua)}}\)
\(\newcommand {\luatexdirectlua }[1]{\text {(directlua)}}\)
\(\newcommand {\protect }{}\)
\(\def \LWRabsorbnumber #1 {}\)
\(\def \LWRabsorbquotenumber "#1 {}\)
\(\newcommand {\LWRabsorboption }[1][]{}\)
\(\newcommand {\LWRabsorbtwooptions }[1][]{\LWRabsorboption }\)
\(\def \mathchar {\ifnextchar "\LWRabsorbquotenumber \LWRabsorbnumber }\)
\(\def \mathcode #1={\mathchar }\)
\(\let \delcode \mathcode \)
\(\let \delimiter \mathchar \)
\(\def \oe {\unicode {x0153}}\)
\(\def \OE {\unicode {x0152}}\)
\(\def \ae {\unicode {x00E6}}\)
\(\def \AE {\unicode {x00C6}}\)
\(\def \aa {\unicode {x00E5}}\)
\(\def \AA {\unicode {x00C5}}\)
\(\def \o {\unicode {x00F8}}\)
\(\def \O {\unicode {x00D8}}\)
\(\def \l {\unicode {x0142}}\)
\(\def \L {\unicode {x0141}}\)
\(\def \ss {\unicode {x00DF}}\)
\(\def \SS {\unicode {x1E9E}}\)
\(\def \dag {\unicode {x2020}}\)
\(\def \ddag {\unicode {x2021}}\)
\(\def \P {\unicode {x00B6}}\)
\(\def \copyright {\unicode {x00A9}}\)
\(\def \pounds {\unicode {x00A3}}\)
\(\let \LWRref \ref \)
\(\renewcommand {\ref }{\ifstar \LWRref \LWRref }\)
\( \newcommand {\multicolumn }[3]{#3}\)
\(\require {textcomp}\)
\(\newcommand {\LWRmarginnote }[1][]{}\)
\(\newcommand {\marginnote }[2][]{\qquad {\small \textrm {#2}}\LWRmarginnote }\)
\(\def \LWRsidenote {1}\)
\(\newcommand {\sidenotemark }[1][\LWRsidenote ]{{}^{\mathrm {#1}}}\)
\(\newcommand {\intertext }[1]{\text {#1}\notag \\}\)
\(\let \Hat \hat \)
\(\let \Check \check \)
\(\let \Tilde \tilde \)
\(\let \Acute \acute \)
\(\let \Grave \grave \)
\(\let \Dot \dot \)
\(\let \Ddot \ddot \)
\(\let \Breve \breve \)
\(\let \Bar \bar \)
\(\let \Vec \vec \)
\(\newcommand {\nicefrac }[3][]{\mathinner {{}^{#2}\!/\!_{#3}}}\)
\(\newcommand {\unit }[2][]{#1 \mathinner {#2}}\)
\(\newcommand {\unitfrac }[3][]{#1 \mathinner {{}^{#2}\!/\!_{#3}}}\)
\(\newcommand {\bm }[1]{\boldsymbol {#1}}\)
\(\require {mathtools}\)
\(\newenvironment {crampedsubarray}[1]{}{}\)
\(\newcommand {\smashoperator }[2][]{#2\limits }\)
\(\newcommand {\SwapAboveDisplaySkip }{}\)
\(\newcommand {\LaTeXunderbrace }[1]{\underbrace {#1}}\)
\(\newcommand {\LaTeXoverbrace }[1]{\overbrace {#1}}\)
\(\newcommand {\LWRmultlined }[1][]{\begin {multline*}}\)
\(\newenvironment {multlined}[1][]{\LWRmultlined }{\end {multline*}}\)
\(\let \LWRorigshoveleft \shoveleft \)
\(\renewcommand {\shoveleft }[1][]{\LWRorigshoveleft }\)
\(\let \LWRorigshoveright \shoveright \)
\(\renewcommand {\shoveright }[1][]{\LWRorigshoveright }\)
\(\newcommand {\shortintertext }[1]{\text {#1}\notag \\}\)
\(\newcommand {\vcentcolon }{\mathrel {\unicode {x2236}}}\)
\(\newcommand {\Var }{\operatorname {Var}}\)
\(\newcommand {\Expected }{\operatorname {E}}\)
\(\newcommand {\abs }[1]{\left \lvert #1\right \rvert }\)
\(\newcommand {\norm }[1]{\left \lVert #1\right \rVert }\)
\(\newcommand {\rbrackets }[1]{\left (#1\right )}\)
\(\newcommand {\sbrackets }[1]{\left [#1\right ]}\)
\(\newcommand {\cbrackets }[1]{\left \{#1\right \}}\)
\(\newcommand {\RE }{\operatorname {Re}}\)
\(\newcommand {\IM }{\operatorname {IM}}\)
\(\newcommand {\Span }{\operatorname {span}}\)
16.3 Listing all permutations of a string
Sometimes, we have a string (e.g. "MATHS"), of which we’d like to list out all the possible permutations. To list these, we have to do this systematically. A nice way to do this is using Heap’s algorithm. To generate all the permutations of a string, we first pick one letter. When we generate all
the permutations of this string, we will have different strings, each of which has that letter at a different position. For example, in the case of "MATHS", we will have all the following (where “_” means we don’t know what letter will be at that position.)
-
• “M____”
-
• “_M___”
-
• “__M__”
-
• “___M_”
-
• “____M”
The key idea of Heap’s algorithm is that in each of these cases, the valid choices for the four unknown items (“_”) are any of the permutations of the four letters in question. This means that we’ve found a way to write the permutations of five letters (which we don’t know) in terms of the
permutations of four letters arranged with a known letter in-between them. From here, we can apply the same algorithm many times - for the four-letter permutation we can reduce it to a three letter permutation, and so on until we have only one letter left. In this case, there is only one
possible permutation.
There are too many possibilities here to list out all the permutations, but for the first one (“M____”), the process would go something like this:
-
• “MA___”
-
• “M_A__”
-
• “M__A_”
-
• “M___A”
If we then pick the first one here (the process for the rest is the same) we have
-
• “MAT__”
-
• “MA_T_”
-
• “MA__T”
proceeding with the first one again
and then finally
There are a lot more possibilities than that, but I’ve only listed out some of them; to obtain the full list, just continue the process.