optimized loop over subsets in ``dup_zz_zassenhaus``

In this commit factorization is much faster than in master when
the loop over the subsets is long; e.g. with

``minpoly(S('sqrt(1 + 2**(1/5)) + 2**(1/5)*sqrt(1 + 2**(1/5))'), x)``

the resultant has degree 100; it is factored 150x faster in this commit
than in master; the loop over subsets has 6e5 cases, but only 1000
of them pass the test on the constant term.
In this commit it is attempted to choose ``p`` such that there are
fewer factorizations over Z_p[x]. There is a small overhead for this.
faster ``swinnerton_dyer_poly`` using ``minimal_polynomial``