Power and Weighted Votes

How Voting Systems Work

Chapter 9 · Power and Weighted Votes

How Voting Systems Work 8 showed that the lines on a map can matter as much as the votes. This chapter looks at a different hidden lever: weighted voting, where voters or bodies carry different numbers of votes, as shareholders do in a company, member states do on a council, or parties do in a parliament. The tempting assumption is that someone with 40% of the votes has 40% of the say. It is often wrong. The maths stays at counting and one small factorial formula; the Python lists every coalition and every ordering so you can watch the effect for yourself.

What was run, and what to trust
Every Python snippet in this chapter and in the three exercise solutions was executed, and the output in the comments is what Python printed. Historical and technical claims come from two web searches whose results were encyclopedia mirrors, lecture notes, textbook PDFs and arXiv papers; fetched pages are often truncated or model-summarised, so treat the wording as a paraphrase. The sources conflict on credit: one says the Banzhaf index was first created in 1946 by Lionel Penrose and reintroduced by John Banzhaf in 1965, while others mention only Banzhaf, so I name both and do not rank them. All weights, quotas, populations and parties in the code are invented, not real bodies. Statements marked (check) were not confirmed against a source.

Weight Is Not Power

Picture an illustrative parliament of 100 seats with three parties holding 49, 48 and 3 seats. A bill needs 51 votes. The 3-seat party looks like an afterthought, yet any two of the three parties can pass a bill, so every party is equally able to join a winning pair, and equally able to be left out. The small party is exactly as necessary as the big ones. Power in a voting body is about the ability to change the outcome, not the number printed beside your name.

Two ways of measuring this have lasted. Both start from a weighted voting system written [quota: w1, w2, ...]: each voter has a weight, and a motion passes when the weights of its supporters add up to at least the quota. A group of supporters is a coalition; it is winning if it reaches the quota.

The Banzhaf Index: Who Is Critical?

In a winning coalition, a voter is critical if the coalition would lose without them. Count how many winning coalitions each voter is critical in; a voter’s Banzhaf share is their count divided by the total of all the counts. The index carries John Banzhaf’s name from his 1965 analysis of a county board in New York, which the sources say was used in a lawsuit that led to a change in the voting system (I did not confirm the details, so I leave them out), and it is tied to Penrose’s earlier work as noted above. Some authors use the raw count instead of the share; the share is easier to compare across systems.

def banzhaf(weights, quota): """Banzhaf counts and shares: how often each voter is critical in a winning coalition.""" n = len(weights) critical = [0] * n for mask in range(1 << n): members = [i for i in range(n) if mask >> i & 1] total = sum(weights[i] for i in members) if total >= quota: for i in members: if total - weights[i] < quota: critical[i] += 1 s = sum(critical) return critical, [c / s for c in critical] # Illustrative parliament: three parties with 49, 48 and 3 seats; 51 of 100 needed to pass a bill. weights, quota = [49, 48, 3], 51 critical, share = banzhaf(weights, quota) for name, w, c, p in zip("ABC", weights, critical, share): print(f"party {name}: {w:>2} seats ({w/sum(weights):5.1%}) critical {c} Banzhaf share {p:.3f}") # party A: 49 seats (49.0%) critical 2 Banzhaf share 0.333 # party B: 48 seats (48.0%) critical 2 Banzhaf share 0.333 # party C: 3 seats ( 3.0%) critical 2 Banzhaf share 0.333

Each party is critical in exactly two coalitions: A is critical in {A, B} and {A, C}, but not in {A, B, C}, where the others already reach 51 without A. So the 3% party has the same Banzhaf share, one third, as the 49% party. That is the whole lesson in three lines of output.

The Shapley–Shubik Index: Who Tips the Balance?

Lloyd Shapley and Martin Shubik introduced a second index in 1954, built on the Shapley value from cooperative game theory (according to the sources I found). Imagine the voters joining a motion one at a time in a random order. The voter whose arrival lifts the running total to the quota is the pivot. A voter’s share is the fraction of all possible orderings in which they are the pivot. With n voters there are n! orderings, so this brute-force version stops being practical around ten or eleven voters; Exercise 2 shows a formula that avoids listing them.

from itertools import permutations def shapley_shubik(weights, quota): """Share of the orderings in which each voter is the pivot (the one who tips the total to the quota).""" n = len(weights) pivots = [0] * n count = 0 for order in permutations(range(n)): count += 1 running = 0 for i in order: running += weights[i] if running >= quota: pivots[i] += 1 break return pivots, [p / count for p in pivots] weights, quota = [49, 48, 3], 51 pivots, share = shapley_shubik(weights, quota) for name, w, p, s in zip("ABC", weights, pivots, share): print(f"party {name}: {w:>2} seats pivot in {p} of 6 orderings Shapley-Shubik share {s:.3f}") # party A: 49 seats pivot in 2 of 6 orderings Shapley-Shubik share 0.333 # party B: 48 seats pivot in 2 of 6 orderings Shapley-Shubik share 0.333 # party C: 3 seats pivot in 2 of 6 orderings Shapley-Shubik share 0.333

For this parliament the two indices agree: each party is the pivot in 2 of the 6 orderings. They do not always agree, as the next section shows.

Comparing the Two Indices

The next run uses an illustrative six-member board with weights 9, 9, 7, 3, 1 and 1 and a quota of 16 out of 30. Look at the weight column against the two power columns. A lecture I found for a six-member county-board example reports shares of one third for three members and zero for the other three, which is the same pattern as here; I used my own invented weights rather than copy that example. Members D, E and F can never be critical: they are dummies, however many votes they hold. The second system, with weights 3, 2, 1 and 1, is there to show that the two indices can give different answers.

from itertools import permutations def banzhaf(weights, quota): n = len(weights) critical = [0] * n for mask in range(1 << n): members = [i for i in range(n) if mask >> i & 1] total = sum(weights[i] for i in members) if total >= quota: for i in members: if total - weights[i] < quota: critical[i] += 1 return [c / sum(critical) for c in critical] def shapley_shubik(weights, quota): n = len(weights) pivots, count = [0] * n, 0 for order in permutations(range(n)): count += 1 running = 0 for i in order: running += weights[i] if running >= quota: pivots[i] += 1 break return [p / count for p in pivots] def report(weights, quota): total = sum(weights) bz, ss = banzhaf(weights, quota), shapley_shubik(weights, quota) print(f"weights {weights}, quota {quota} of {total}") print("member weight weight% Banzhaf Shapley-Shubik") for name, w, b, s in zip("ABCDEF", weights, bz, ss): print(f"{name:>6} {w:>6} {w/total:8.1%} {b:8.3f} {s:15.3f}") # Illustrative board: six members with weights 9, 9, 7, 3, 1, 1 (total 30); 16 votes needed. report([9, 9, 7, 3, 1, 1], 16) print() # A second illustrative system where the two indices disagree. report([3, 2, 1, 1], 5) # weights [9, 9, 7, 3, 1, 1], quota 16 of 30 # member weight weight% Banzhaf Shapley-Shubik # A 9 30.0% 0.333 0.333 # B 9 30.0% 0.333 0.333 # C 7 23.3% 0.333 0.333 # D 3 10.0% 0.000 0.000 # E 1 3.3% 0.000 0.000 # F 1 3.3% 0.000 0.000 # # weights [3, 2, 1, 1], quota 5 of 7 # member weight weight% Banzhaf Shapley-Shubik # A 3 42.9% 0.500 0.583 # B 2 28.6% 0.300 0.250 # C 1 14.3% 0.100 0.083 # D 1 14.3% 0.100 0.083

On the board, A, B and C hold 30%, 30% and 23.3% of the weight yet each has exactly one third of the power, and the 3-vote member has none, because any two of A, B and C reach 16 on their own. In the second system, A has 42.9% of the weight and 0.500 of the Banzhaf power but 0.583 of the Shapley–Shubik power. Neither index is the “true” one; they answer slightly different questions (“in how many coalitions am I decisive?” against “how often do I arrive as the one who tips the total?”). The sources I found say the two usually give similar results; I did not test that beyond these examples.

IndexCountsQuestion it answersCost for n voters
Weight sharevotes heldhow much of the total is mine?trivial
Banzhafcoalitions where I am criticalhow often can I change a result?2n coalitions
Shapley–Shubikorderings where I am the pivothow often do I tip the balance?n! orderings, or 2n with a formula

Quotas, Councils and the Square-Root Idea

The quota is as important as the weights. Lionel Penrose argued in 1946 that for a body whose members represent populations, fairness for individual citizens requires each member’s power to scale with the square root of its population (the sources I found call this Penrose’s law or the square root law). It is a claim about two-tier voting: citizens elect representatives, who then vote as a bloc. The sources also say the Council of the European Union uses a double-majority rule under the Treaty of Lisbon, roughly 55% of member states representing at least 65% of the EU population (I did not check a primary legal source, so confirm current details before relying on this), and that several authors find the current rules deviate from the square-root law. Estimates of the best quota differ between papers: one study reports about 61.4%, while another notes that proposed quotas usually fall between 60% and 74%. That is a genuine conflict in the literature, not a settled number.

The experiment below sweeps the quota for an invented seven-member council, weights equal to populations in millions. For each quota it prints every member’s Banzhaf share, the number of dummies, and the ratio between the largest and smallest values of power divided by the square root of population (members with no power are left out of that ratio). A ratio of 1 would match the Penrose idea exactly.

from math import sqrt def banzhaf(weights, quota): n = len(weights) critical = [0] * n for mask in range(1 << n): members = [i for i in range(n) if mask >> i & 1] total = sum(weights[i] for i in members) if total >= quota: for i in members: if total - weights[i] < quota: critical[i] += 1 return [c / sum(critical) for c in critical] # Illustrative council of seven members whose populations (millions) are invented. pops = [80, 60, 40, 20, 10, 5, 2] total = sum(pops) print("quota " + " ".join(f"{p:>5}" for p in pops) + " dummies spread of power/sqrt(pop)") for pct in (50, 55, 60, 65, 70, 75): quota = -(-total * pct // 100) # smallest whole number of votes reaching pct percent bz = banzhaf(pops, quota) ratios = [b / sqrt(p) for b, p in zip(bz, pops) if b > 0] # leave out members with no power at all spread = max(ratios) / min(ratios) print(f"{pct:>3}% " + " ".join(f"{b:5.3f}" for b in bz) + f" {bz.count(0):>5} {spread:7.2f}") # quota 80 60 40 20 10 5 2 dummies spread of power/sqrt(pop) # 50% 0.385 0.231 0.231 0.077 0.077 0.000 0.000 2 2.50 # 55% 0.417 0.250 0.250 0.083 0.000 0.000 0.000 3 2.50 # 60% 0.417 0.250 0.146 0.083 0.062 0.021 0.021 0 5.00 # 65% 0.452 0.286 0.095 0.095 0.024 0.024 0.024 0 6.72 # 70% 0.375 0.300 0.100 0.100 0.075 0.025 0.025 0 3.75 # 75% 0.344 0.344 0.156 0.094 0.031 0.031 0.000 1 4.49

Three things stand out. Power is lumpy: moving the quota from 55% to 60% turns three dummies into voters with some power. No quota here gets close to a ratio of 1, partly because with only seven members and whole-number weights the counts are coarse. And a quota that is too low or too high can erase small members entirely (the 75% row has a dummy again). With only one invented council, I would not draw a conclusion about the best real quota; the point is how sensitive power is to a number that looks like a technicality.

RoleMeaningExample from this chapter
Dictatorwins alone51 of quota 51 (Exercise 1)
Veto holderno winning coalition without themeveryone under unanimity
Dummynever critical, whatever the weightmembers D, E and F on the board
Ordinarycritical in at least one coalitionall three parties in the 49/48/3 parliament

Weighted voting also connects back to earlier chapters. Apportionment (How Voting Systems Work 7) decides how many seats or votes each region gets; this chapter shows that the resulting numbers do not translate directly into influence. And like the fairness criteria in How Voting Systems Work 6, the two indices are value choices: each defines “power” one way and no single number ends the argument.

Common mistakes
Equating vote share with power; forgetting that the quota changes everything, including who is a dummy; treating a power index as a prediction of how people will vote (it assumes every coalition is equally likely, which real alliances are not); comparing a Banzhaf count in one source with a Banzhaf share in another; and listing every ordering for large bodies (16 voters already means about 20 trillion orderings). Also remember these indices measure a priori power from the rules alone, not political influence.
Exercise 1

Classify every voter as dictator, veto holder, dummy or ordinary in five systems: [51: 51, 25, 24], [100: 40, 30, 30], [51: 49, 48, 3], [16: 9, 9, 7, 3, 1, 1] and [60: 30, 20, 20, 15, 15]. Print one line per system.

📄 View solution
Exercise 2

Compute the Shapley–Shubik index with a formula (a voter critical in a coalition of size s gets (s−1)! × (n−s)! orderings out of n!) instead of listing orderings. Check it matches the ordering method on eight voters, then run it on sixteen.

📄 View solution
Exercise 3

Generate 200 random five-voter systems (seeded, weights 1 to 12, strict-majority quota). Report how many have a dummy, whether anyone ever has more weight but less Banzhaf power, how many have a voter whose power differs from weight share by over 10 points, and the most extreme system.

📄 View solution

Quick Reference

  • Weighted system: [quota: w1, w2, ...]; a coalition wins if its weights reach the quota
  • Critical voter: in a winning coalition that would lose without them
  • Banzhaf share: a voter’s critical count ÷ all critical counts
  • Pivot: the voter who lifts the running total to the quota in a given ordering
  • Shapley–Shubik share: orderings in which a voter is the pivot ÷ n!
  • Dummy, veto holder, dictator: never critical, always needed, wins alone
  • Penrose’s idea: for fairness between citizens, power should scale with the square root of population
  • Always state: the weights, the quota and which index (and which normalisation) a figure uses
Coming next
How Voting Systems Work 10 is the capstone, Design an Election: comparing systems on simulated electorates and choosing one for a small club.