Every reference tournament starts from one short list of numbers, the seed row. This page explains what that list means, the single rule that makes it work, how the generator turns it into a full schedule, and how new seeds are found. The table shuffling that happens afterwards is covered in the overview. All numbers and diagrams below are calculated live from the real seeds.
Seeds are Z-cyclic whist tournament starting rounds. The ideas below come from Durango Bill and JDAWiseman.
Take a tournament with P players (always a multiple of 4). Set one player aside as a special "anchor" called ∞ (infinity). Number the rest 0, 1, 2, … M−1, where M = P − 1.
The seed files write ∞ as the number M (the largest number in the row), so it looks like an ordinary player. In the 20-player example below, M = , so ∞ is written as .
The seed row lists all P players once. Read it four at a time: each group of four is one table, written [a, b | c, e].
Place players 0 to M−1 around a clock with M positions, and put ∞ in the middle. The gap between two players is how many steps apart they are on that clock, going the shorter way round.
So on a clock of M = , gaps run from 1 to . A seed is valid when:
Pairs that include ∞ have no gap and are not counted; ∞ is handled automatically because it sits in the middle and is the same distance from everyone.
Tap a row in the tally to light up the pairs with that gap.
| Gap | Partner pairs | As partners | Opponent pairs | As opponents | OK? |
|---|
To get round 1, add 1 to every number (and wrap M−1 back round to 0, like a clock). ∞ never moves. Do it again for round 2, and so on: M rounds in total ( for 20 players).
On the clock this just turns the whole picture one notch. The chords keep their length, so every pair keeps its gap.
The same is true for every gap: a gap that appears once between partners gives each of the M pairs with that gap exactly one partnership over the tournament. A gap that appears twice between opponents gives each pair exactly two meetings as opponents. Player ∞ sits in the middle and partners each of the others once, because the player opposite it walks all the way round the clock.
Rounds are numbered from 0 here to match the maths. The generator's first round is this round 0.
The grid on the right is built by actually playing all rounds and counting. Each square is one pair of players. Above the diagonal: how many times they were partners. Below the diagonal: how many times they were opponents.
The Run seeder button in the generator (its runSeeder function) does three things. Here they are for the first three rounds of the 20-player seed. Colours mark the five tables of the seed so you can follow them.
For round r, every value becomes (value + r) mod M. The generator finds ∞ as the largest number in the seed and leaves that one slot unchanged in every round (outlined in purple).
Add 1 to everything so players are numbered from 1 like a printed sheet. ∞ (written M = ) becomes player P = 20.
Each row is rotated left by whole tables: shift = ((r mod tables) + 1) × 4 seats, with tables = P/4 = . Rotating by whole tables never splits a table, so nobody's partner or opponents change; only which table number they play at changes.
Finally each row is cut into pairs. Two pairs in a row make one table, which is exactly how the tournament creator reads the file:
For small tournaments a computer simply hunts for a valid seed. Seeds up to 100 players trace back to published cyclic solutions found this way. The method is easy to picture:
The chart is a real search running in your browser right now. Press the button to start again from a new random row.
The search gets much harder as tournaments grow: there are far more rows to try and far more ways to be almost right. Past about 100 players it stalls, which is why the larger sizes need the shortcuts below.
For big tournaments, instead of searching blindly we build seeds out of tables with a built-in symmetry. A mirror table seats a number and its mirror image across 0 as partners:
Such a table does half the work on its own:
So the opponent gaps automatically come in twos, which is exactly what rule B asks for. All that's left is choosing the x, y values so that every gap is used once. That is a far smaller puzzle.
When M splits as M = q × p, where p is a prime of the form 4k+1 (5, 13, 17, 37, …), a big seed can be put together in two parts:
Why 4k+1? The players outside the small seed number q × (p−1), and mirror tables use them four at a time. So q × (p−1) must divide by 4. Since q is odd, p−1 itself must be a multiple of 4.
The table on the right takes each big seed apart: it finds the small-seed tables, divides them by p to recover the small seed, checks that small seed against the rule, and checks that all remaining tables are mirror tables.
| Players | M = q × p | Small seed recovered (÷ p) | Small seed valid? | Mirror tables | Whole seed valid? |
|---|
124 players gives M = 123 = 3 × 41. 3 isn't of the form 4k+1, so shortcut 2 doesn't apply. This seed uses a different trick, in the style of E. H. Moore's classic constructions: multiplying every number by a fixed multiplier.
Multiplying all numbers by m multiplies every gap by m. With m = 10, multiplying five times brings you back where you started: . So one "base" table spawns a family of 5 tables, and their gaps are d, 10d, 100d, … of the base gaps.
The 124 seed is built as:
A computer only has to choose the 6 base tables (24 numbers) rather than all 124, a much smaller search.
Read live from the generator's seed list, the seeds/ folder and the size buttons in the tournament creator. Every seed row is checked against the rule as the page loads.
| Players | M = P−1 | How the seed was made | Seed check | Schedule file | Creator button |
|---|
Expand a seed yourself, see how the tables are balanced afterwards, or load a finished tournament.
Sources for the seeds and constructions, and where to look for the missing sizes (104, 108, 128, 132, 140).