Berger explained
Otto Milvang, Rev
2, September 17, 2026
The Berger
tables are a predefined pairing system used for round-robin tournaments. They
are described in FIDE Handbook C.05, Annex 1: Details of Berger Table. This
article shows an efficient way to use Berger tables in round-robin tournaments
and explains how to calculate them. The document covers only Berger tables for an
even number of players. When there are an odd number of players, the highest
number is treated as a bye.
Rd 1: 1 - 10
2 - 9 3 - 8 4 - 7
5 – 6
Rd 2: 10 - 6 7 - 5
8 - 4 9 - 3 1 – 2
Rd 3: 2 - 10 3 - 1
4 - 9 5 - 8 6 – 7
Rd 4: 10 - 7 8 - 6
9 - 5 1 - 4 2 – 3
Rd 5: 3 - 10 4 - 2
5 - 1 6 - 9 7 – 8
Rd 6: 10 - 8 9 - 7
1 - 6 2 - 5 3 – 4
Rd 7: 4 - 10 5 - 3
6 - 2 7 - 1 8 – 9
Rd 8: 10 - 9 1 - 8
2 - 7 3 - 6 4 – 5
Rd 9: 5 - 10 6 - 4
7 - 3 8 - 2 9 - 1
The players sit at random or according to a drawing of lots. The boards are arranged
with alternating colors, as shown in the figure, with the board closest to the arbiter
always having Black on the arbiter’s left. The player seated at this board has
the highest starting number, remains in the same place throughout the
tournament, and is therefore called the fixed player.
Counterclockwise from the arbiter,
the players are numbered in the order in which they meet the player with the highest
starting number. Another approach is to place the players counterclockwise by
seating the white players first, from 1 to N/2, followed by the black players,
from N/2 + 1 to N.
When the first round is finished,
all players move one step clockwise around the table, skipping over the fixed
player. The fixed player turns the board after each round so that they
alternate between black and white games. The tournament continues in this way until
everyone has played everyone else.
If there is
an odd number of players, the board next to the arbiter can be removed. In that
case, remember that player 1 has a bye in round 1.
This scheme will follow the Berger
tables. The board numbers follow the white players start number from round 1.
There are two
main types of result tables for Berger tournaments: the cross table and the
Berger result table.
The cross
table is easy to understand, but it does not show which round a game was played
in or which colors the players had.
The Berger
result table has one column per round and also shows
the colors. For example, if player 3 has the number 5 in the left corner in
round 7, player 5 has White against player 3, written as 5-3.
Create your
own Berger tables at: https://www.milvang.no/spp/berger/berger.html
For an odd
number of players, the Berger table gives each player a perfect color alternation.
In each round, the opponent’s starting number increases by 1 using cyclic
arithmetic, where 1 follows P and P is the number of players. A player cannot
play against themselves, so that round is recorded as a bye. For an odd P, the
tournament therefore needs P rounds for every player to meet every other
player.
The
following tables illustrate these properties. Each row shows one player’s
sequence of opponents and colors across the rounds. The dash marks the round in
which the player has a bye.
1 2
3 4 5 6
7
========================
1: -- 2w 3b 4w 5b 6w 7b
2: 7w 1b -- 3w 4b 5w 6b
3: 6w 7b 1w 2b -- 4w 5b
4: 5w 6b 7w 1b 2w 3b --
5: 4b -- 6w 7b 1w 2b 3w
6: 3b 4w 5b -- 7w 1b 2w
7: 2b 3w 4b 5w 6b -- 1w
With an
even number of players, the added last player meets the player who would
otherwise have had a bye, alternating color from round to round. For an even P,
the tournament needs P - 1 rounds for every player to meet every other player.
1 2
3 4 5 6
7
========================
1: 8w
2w 3b 4w 5b 6w 7b
2: 7w 1b 8w 3w 4b 5w 6b
3: 6w 7b 1w 2b 8w 4w 5b
4: 5w 6b 7w 1b 2w 3b 8w
5: 4b 8b 6w 7b 1w 2b 3w
6: 3b 4w 5b 8b 7w 1b 2w
7: 2b 3w 4b 5w 6b 8b 1w
8: 1b 5w 2b 6w 3b 7w 4b
Note that no player has the same color in the last two rounds. It is impossible, however, to
prevent every player from having the same color twice in a row at some point.
For players 1 to P - 1, the opponent’s starting number increases by 1 using
cyclic arithmetic, where 1 follows P - 1 and P is the number of players.
Instead of meeting themselves, these players meet player P. Player P has Black
in round 1 and then alternates color in each following round.
The properties described above are valid for any number of players.
If the
Berger table is simply played twice, with colors reversed in the second cycle,
some players may receive the same color in three consecutive games.
The FIDE
Handbook gives the following recommendation: “For a double-round tournament it
is recommended to reverse the order of the last two rounds of the first cycle.
This is to avoid three consecutive games with the same colour.”
However,
this recommendation disrupts the regular structure of the Berger tables. For
example, when P is even, almost all players will have the same color in rounds
P - 3 and P - 2. The same problem also occurs when P is odd: almost all players
will have the same color in rounds P - 2 and P - 1.
My
recommendation is to use the Berger table for N players twice. In the first
cycle, start with the last round of the Berger table, then play the remaining
rounds in the order 1, 2, … . In the second cycle,
play the rounds in the normal order with colors reversed.
Analysis, 7
players
7 1 2 3
4 5 6 1
2 3 4 5
6 7
=============================================
1: 7b -- 2w 3b 4w 5b 6w -- 2b 3w 4b 5w 6b 7w
2: 6b 7w 1b -- 3w 4b 5w 7b 1w -- 3b 4w 5b 6w
3: 5b 6w 7b 1w 2b -- 4w 6b 7w 1b 2w -- 4b 5w
4: -- 5w 6b 7w 1b 2w 3b 5b 6w 7b 1w 2b 3w --
5: 3w 4b -- 6w 7b 1w 2b 4w -- 6b 7w 1b 2w 3b
6: 2w 3b 4w 5b -- 7w 1b 3w 4b 5w -- 7b 1w 2b
7: 1w 2b 3w 4b 5w 6b -- 2w 3b 4w 5b 6w -- 1b
No player
has the same color twice in a row. The increase in the opponents’ starting
numbers is preserved, with a double step from the first cycle to the second.
Analysis, 8
players
7 1 2 3
4 5 6 1
2 3 4 5
6 7
=============================================
1: 7b 8w 2w 3b 4w
5b 6w 8b 2b 3w 4b 5w 6b
7w
2: 6b 7w 1b 8w 3w 4b 5w
7b 1w 8b 3b 4w 5b 6w
4: 5b 6w 7b 1w 2b 8w 4w
6b 7w 1b 2w 8b 4b 5w
4: 8w 5w 6b 7w 1b 2w 3b 5b 6w 7b 1w 2b 3w 8b
5: 3w 4b 8b 6w 7b 1w 2b 4w 8w 6b 7w 1b 2w 3b
6: 2w 3b 4w 5b 8b 7w 1b
3w 4b 5w 8w 7b 1w 2b
7: 1w 2b 3w 4b 5w 6b 8b
2w 3b 4w 5b 6w 8w 1b
8: 4b 1b 5w 2b 6w 3b 7w 1w 5b 2w 6b 3w 7b 4w
Each player
has one pair of consecutive White games and one pair of consecutive Black
games.
The
advantage of this method is that it improves color balance without losing the
regular structure of the Berger table. By starting the first cycle with the
last Berger round and then continuing with the remaining rounds in normal
order, the sequence of opponents remains systematic and easy to calculate. At
the same time, the method, for an odd number of players no player receives the
same color twice in a row, and for an even number of players each player has
only one pair of consecutive White games and one pair of consecutive Black
games.
Let N be
the number of players, or the number of players plus 1 if the number of players
is odd. The players are assigned pairing numbers from 1 to N. The number of
boards is B = N/2. In the first round, the lower half has White and the upper
half has Black. In general, on board b, where b is in
the range 1 ... B, player m has White against player N - m + 1.
Example 10
players:
Rd 1: 1 - 10
2 - 9 3 - 8 4 - 7
5 – 6
All
following rounds are built from the previous round using this algorithm:
Step 1: Sort
players 1 ... N - 1 according to their pairing numbers in the previous round,
placing White before Black. On the first board, player N meets the last player
in the sorted list. Remove that player from the list and pair them with player
N. Player N alternates color from round to round. The other player is White if their
pairing number is in the range 1 ... B, and Black otherwise.
Example 10
players:
Rd 1: 1 - 10
2 - 9 3 - 8 4 - 7
5 – 6
List: 1 2 9 3 8 4 7 5 6
Board 1: 10 – 6
Remaining: 1 2 9 3 8 4 7 5
Step 2:
Starting from the end of the list, make a pair with the penultimate player as
White and the last player as Black, then remove both players from the list.
Repeat this process until the list is empty.
Example 10
players:
Remaining: 1 2 9 3 8 4 7 5
Board 1-2: 10 - 6 7 - 5
Remaining: 1 2 9
3 8 4
Board 1-3: 10 - 6 7 - 5 8 - 4
Remaining: 1 2 9
3
Board 1-4: 10 - 6 7 - 5 8 - 4 9 - 3
Remaining: 1 2
Board 1-5: 10 - 6 7 - 5 8 - 4 9 - 3 1 – 2
Repeat from
step 1 until all rounds are paired.
After 9
rounds, the complete pairing is:
Rd 1: 1 - 10
2 - 9 3 - 8 4 - 7
5 – 6
Rd 2: 10 - 6 7 - 5
8 - 4 9 - 3 1 – 2
Rd 3: 2 - 10 3 - 1
4 - 9 5 - 8 6 – 7
Rd 4: 10 - 7 8 - 6
9 - 5 1 - 4 2 – 3
Rd 5: 3 - 10 4 - 2
5 - 1 6 - 9 7 – 8
Rd 6: 10 - 8 9 - 7
1 - 6 2 - 5 3 – 4
Rd 7: 4 - 10 5 - 3
6 - 2 7 - 1 8 – 9
Rd 8: 10 - 9 1 - 8
2 - 7 3 - 6 4 – 5
Rd 9: 5 - 10 6 - 4
7 - 3 8 - 2 9 – 1
"""
Created on Sun
Nov 12 15:50:51 2023
@author: Otto Milvang, sjakk@milvang.no
bergertables is the core of the round-robin pairing system.
See the FIDE Handbook: C. General Rules and Technical Recommendations for
Tournaments; 05. General Regulations for Competitions; Annex 1: Details of
Berger Table.
n is he number
of players, odd numbers are lifted to the first even number
returns a 3-level dict
1-dim - 1 .. n-1 is [round_number]
2-dim - 1 ..
n/2 is [pair_number]
3-dim - {'white',
'black'} - players numbered 1 ..
n
rr = bergertables(n)
In round 6, board 2:
white = rr['parining'][6][2]['white']
black = rr['parining'][6][2]['black']
"""
def bergertablesGeneric(nplayers):
nplayers = nplayers + (nplayers % 2)
pairs = nplayers//2
bergertable
= { 'players': nplayers, 'parining':
{} }
pairing = {}
for board in range(1, pairs + 1):
pairing[board] = {'white': board,
'black': nplayers - board + 1}
bergertable['parining'][1] = pairing
nplayeriswhite
= False
for rnd in
range(2, nplayers):
playerlist
= []
for board in range(1, pairs+1):
for color in ['white',
'black']:
if pairing[board][color]
< nplayers:
playerlist.append(pairing[board][color])
pairing = {}
firstboard
= playerlist.pop()
if nplayeriswhite:
pairing[1] = {'white': firstboard, 'black': nplayers}
else:
pairing[1] = {'white': nplayers, 'black': firstboard}
nplayeriswhite
= not nplayeriswhite
for board in range(2, pairs+1):
black = playerlist.pop()
white = playerlist.pop()
pairing[board] = {'white': white, 'black': black}
bergertable['parining'][rnd]
= pairing
return bergertable
See: https://github.com/OttoMilvang/TieBreakServer/blob/main/berger.py
3 or 4
players:
Rd 1: 1-4, 2-3.
Rd 2: 4-3, 1-2.
Rd 3: 2-4, 3-1.
5 or 6 players:
Rd 1: 1-6, 2-5, 3-4.
Rd 2: 6-4, 5-3, 1-2.
Rd 3: 2-6, 3-1, 4-5.
Rd 4: 6-5, 1-4, 2-3.
Rd 5: 3-6, 4-2, 5-1.
7 or 8
players:
Rd 1: 1-8, 2-7, 3-6, 4-5.
Rd 2: 8-5, 6-4, 7-3, 1-2.
Rd 3: 2-8, 3-1, 4-7, 5-6.
Rd 4: 8-6, 7-5, 1-4, 2-3.
Rd 5: 3-8, 4-2, 5-1, 6-7.
Rd 6: 8-7, 1-6, 2-5, 3-4.
Rd 7: 4-8, 5-3, 6-2, 7-1.
9 or 10
players:
Rd 1: 1-10, 2-9, 3-8, 4-7, 5-6.
Rd 2: 10-6, 7-5, 8-4, 9-3, 1-2.
Rd 3: 2-10, 3-1, 4-9, 5-8, 6-7.
Rd 4: 10-7, 8-6, 9-5, 1-4, 2-3.
Rd 5: 3-10, 4-2, 5-1, 6-9, 7-8.
Rd 6: 10-8, 9-7, 1-6, 2-5, 3-4.
Rd 7: 4-10, 5-3, 6-2, 7-1, 8-9.
Rd 8: 10-9, 1-8, 2-7, 3-6, 4-5.
Rd 9: 5-10, 6-4, 7-3, 8-2, 9-1.
11 or 12
players:
Rd 1: 1-12, 2-11, 3-10, 4-9, 5-8, 6-7.
Rd 2: 12-7, 8-6, 9-5, 10-4, 11-3, 1-2.
Rd 3: 2-12, 3-1, 4-11, 5-10, 6-9, 7-8.
Rd 4: 12-8, 9-7, 10-6, 11-5, 1-4, 2-3.
Rd 5: 3-12, 4-2, 5-1, 6-11, 7-10, 8-9.
Rd 6: 12-9, 10-8, 11-7, 1-6, 2-5, 3-4.
Rd 7: 4-12, 5-3, 6-2, 7-1, 8-11, 9-10.
Rd 8: 12-10, 11-9, 1-8, 2-7, 3-6, 4-5.
Rd 9: 5-12, 6-4, 7-3, 8-2, 9-1, 10-11.
Rd 10: 12-11, 1-10, 2-9, 3-8, 4-7, 5-6.
Rd 11: 6-12, 7-5, 8-4, 9-3, 10-2, 11-1.
13 or 14
players:
Rd 1: 1-14, 2-13, 3-12, 4-11, 5-10, 6-9, 7-8.
Rd 2: 14-8, 9-7, 10-6, 11-5, 12-4, 13-3, 1-2.
Rd 3: 2-14, 3-1, 4-13, 5-12, 6-11, 7-10, 8-9.
Rd 4: 14-9, 10-8, 11-7, 12-6, 13-5, 1-4, 2-3.
Rd 5: 3-14, 4-2, 5-1, 6-13, 7-12, 8-11, 9-10.
Rd 6: 14-10, 11-9, 12-8, 13-7, 1-6, 2-5, 3-4.
Rd 7: 4-14, 5-3, 6-2, 7-1, 8-13, 9-12, 10-11.
Rd 8: 14-11, 12-10, 13-9, 1-8, 2-7, 3-6, 4-5.
Rd 9: 5-14, 6-4, 7-3, 8-2, 9-1, 10-13, 11-12.
Rd 10: 14-12, 13-11, 1-10, 2-9. 3-8, 4-7, 5-6.
Rd 11: 6-14, 7-5, 8-4, 9-3, 10-2, 11-1, 12-13.
Rd 12: 14-13, 1-12, 2-11, 3-10, 4-9, 5-8, 6-7.
Rd 13: 7-14, 8-6, 9-5, 10-4, 11-3, 12-2, 13-1.
15 or 16 players:
Rd 1: 1-16, 2-15, 3-14, 4-13, 5-12, 6-11, 7-10, 8-9.
Rd 2: 16-9, 10-8, 11-7, 12-6, 13-5, 14-4, 15-3, 1-2.
Rd 3: 2-16, 3-1, 4-15, 5-14, 6-13, 7-12, 8-11, 9-10.
Rd 4: 16-10, 11-9, 12-8, 13-7, 14-6, 15-5, 1-4, 2-3.
Rd 5: 3-16, 4-2, 5-1, 6-15, 7-14, 8-13, 9-12, 10-11.
Rd 6: 16-11, 12-10, 13-9, 14-8, 15-7, 1-6, 2-5, 3-4.
Rd 7: 4-16, 5-3, 6-2, 7-1, 8-15, 9-14, 10-13, 11-12.
Rd 8: 16-12, 13-11, 14-10, 15-9, 1-8, 2-7, 3-6, 4-5.
Rd 9: 5-16, 6-4, 7-3, 8-2,
9-1, 10-15, 11-14, 12-13.
Rd 10: 16-13, 14-12, 15-11,
1-10, 2-9, 3-8, 4-7, 5-6.
Rd 11: 6-16, 7-5, 8-4, 9-3, 10-2,
11-1, 12-15, 13-14.
Rd 12: 16-14, 15-13, 1-12, 2-11,
3-10, 4-9, 5-8, 6-7.
Rd 13: 7-16, 8-6, 9-5, 10-4, 11-3,
12-2, 13-1, 14-15.
Rd 14: 16-15, 1-14, 2-13, 3-12,
4-11, 5-10, 6-9, 7-8.
Rd 15: 8-16, 9-7, 10-6, 11-5,
12-4, 13-3, 14-2, 15-1.