(I believe this one is back on-topic, because it could result in
@Tim-Seok_Nawibo changing how the tournament will be run.)
With 8 rounds, actual double-elimination (i.e., not what this site does when
that option is chosen) can in fact handle 20 players, rather than just 16.
Furthermore, still with just 8 rounds, one can handle [20 players who need to lose twice to
be eliminated] plus [4 players who get eliminated by a single loss] (analogous to McMahon).
For 65 players, actual double-elimination can need 11 rounds, and 11 rounds lets it handle 128 players.
(though here, adding any who can be eliminated with 1 loss
requires reducing the number who need 2 loses to be eliminated)
Python code for the above
def yield_nextsibs_(winners,losers):
if (winners+losers)%2 == 0:
byesibs = ((0,0),)
elif losers%2 == 1:
byesibs = (((0,1),) if winners == 0 else ((0,1),(1,0)))
else:
byesibs = (((1,0),) if losers == 0 else ((1,0),(0,1)))
for byes in byesibs:
winnerswhoplay,loserswhoplay = winners-byes[0],losers-byes[1]
cross_sibs = (((1,0),(0,2)) if loserswhoplay%2 == 1 else ((0,0),))
yield tuple(((winnerswhoplay//2)+byes[0]+crossresult[0],(winnerswhoplay//2)+(loserswhoplay//2)+byes[1]+crossresult[1]) for crossresult in cross_sibs)
roundsneeded = [[-1 for losers in range(140)] for winners in range(140)]
roundsneeded[0][1],roundsneeded[1][0] = 0,0
for total in range(2,140):
for winners in range(total+1):
losers = total-winners
roundsneeded[winners][losers] = 1+min(max(roundsneeded[W][L] for (W,L) in byechoice) for byechoice in yield_nextsibs_(winners,losers))
print((roundsneeded[12][4],roundsneeded[12][5],roundsneeded[13][0]))
print((roundsneeded[20][4],roundsneeded[20][5],roundsneeded[21][0]))
print((roundsneeded[64][64],roundsneeded[64][65],roundsneeded[65][0]))
print((roundsneeded[128][0],roundsneeded[128][1],roundsneeded[129][0]))