\section{Computer checks} \label{rw:app:computer} Some of the computations in this paper were also carried out by computer. No proof depends on such a computation: in each case the argument is given in the text, and the program is a check on it. Statements about a classical group of arbitrary rank can be checked by a program only in the ranks indicated, and for the other ranks the argument in the text is the only proof. The programs are written in Python, with the libraries SymPy and NumPy, and are in the directory \texttt{anc} of the source of this paper. The program \texttt{exchange\_checker.py} is a common library. It keeps track of a set of roots and of the roots on which a character is not trivial, and at each exchange it tests that the sets are closed and normalized under addition of roots, that the character has the required support, and that the sum of the two exchanged roots lies in this support. These are the conditions on roots in Lemma~\ref{fl:lem:odd-exchange}; the constants of the commutators and the Fourier pairing over the adeles are treated in the text. The other programs compute with matrices, for subspaces of Lie algebras or for the groups themselves. \begingroup \small \renewcommand{\arraystretch}{1.15} \begin{longtable}{@{}>{\raggedright\arraybackslash}p{.25\textwidth} >{\raggedright\arraybackslash}p{.31\textwidth} >{\raggedright\arraybackslash}p{.38\textwidth}@{}} \toprule Statement & What is checked & Program and range\\ \midrule \endfirsthead \toprule Statement & What is checked & Program and range\\ \midrule \endhead \bottomrule \endfoot Lemmas~\ref{rw:lem:jacquet-double-coset} and~\ref{rw:lem:jacquet-intersection} & exactly one double coset of Weyl elements contributes, and the intersection of unipotent groups is as stated & \texttt{\footnotesize check\_orthogonal\_jacquet.py}; $B_2,B_4,B_6$ (also with the criterion of characteristic two), $D_4,D_6$\\ Lemma~\ref{fl:lem:uniform-interleave} & for the two chains, the conditions on the sets of roots and on the supports of the characters & \texttt{\footnotesize check\_interleave.py}, $2\le r\le7$\\ Proposition~\ref{fl:prop:uniform-b-nonzero}, steps~1, 2 and~4 & the sequences of exchanges and the final subgroups and characters & \texttt{\footnotesize check\_odd\_descent\_steps12.py}, $n\le4$; \texttt{\footnotesize check\_sw\_exchange.py}, $m\le12$\\ Proposition~\ref{fl:prop:uniform-b-nonzero}, step~3 & the hyperbolic basis, the determinant of $P_t$ and the conjugation formula & \texttt{\footnotesize check\_odd\_descent.py}; $n\le5$\\ Lemma~\ref{rw:lem:jacobi-embedding} & the embedding of the Jacobi group and the commutator used in Lemma~\ref{fl:lem:descent-vanishing-and-period} & \texttt{\footnotesize check\_jacobi\_embedding.py}; symbolic\\ Lemma~\ref{fl:lem:even-period-to-generic}, step~2 & the equivalence of the two Fourier coefficients, in the Lie algebra, and the additivity of $\Lambda_c$ on the group & \texttt{\footnotesize check\_even\_descent\_wh.py}, $n=2,3,4$, with several rational values of $c$; \texttt{\footnotesize check\_lambda\_c.py}, $n=2$\\ Lemma~\ref{fl:lem:descent-vanishing-and-period}, steps~2 and~3 & the chain of exchanges and the signs in the final table & \texttt{\footnotesize check\_even\_descent\_chain.py}; $n\le4$\\ \eqref{fl:eq:char2-root-commutator}, \eqref{rw:eq:terminal-commutator}, \eqref{rw:eq:terminal-conjugation}, Corollary~\ref{fl:cor:char2-descent-split} & matrix identities over polynomial rings in characteristic two & \texttt{\footnotesize check\_char2.py}; symbolic\\ Lemma~\ref{fl:lem:char2-row-iteration}, step~5; Proposition~\ref{fl:prop:char2-direct-generic}, steps~1--3 & the sets of roots & \texttt{\footnotesize check\_roots.py}; $m\le9$, $n\le7$\\ \end{longtable} \endgroup