Els sistemes D’Hondt i Sainte-Laguë

by marti

El conegut —i criticat— sistema D’Hondt, l’utilitzat a Espanya, és un mètode de representació que assigna escons proporcionalment als resultats obtinguts per llistes de partits. És de la família dels mètodes de les “mitjanes més altes“, que inclou també el mètode Sainte-Laguë.

En aquests mètodes, els vots que rep cada partit es divideixen per una successió de divisors, obtenint una llista de quocients. Els escons s’assignen llavors als quocients més elevats, garantint una certa proporcionalitat. La diferència entre els divisors utilitzats dóna lloc a mètodes diferents: en el cas D’Hondt, s’utilitza la successió 1, 2, 3…, mentre que pel Sainte-Laguë s’utilitza 1, 3, 5… Així, la manera de calcular els quocients Q_s de cada partit en aquests dos mètodes és

Q_s = \frac{V}{a s + 1},

on V és el número total de vots del partit en qüestió, s és el número d’escons que aquest partit ja ha rebut (començant des de 0) i a és un coeficient que depèn del mètode (a=1 per el sistema D’Hondt i a = 2 pel Sainte-Laguë). El D’Hondt tendeix a donar als partits majoritaris una sobre-representació en la proporció d’escons respecte la proporció de vots, mentre que el Saint-Laguë respecta més la proporcionalitat.

Aquests sistemes sovint es modifiquen introduint un llindar, de manera que una llista que no obté aquest llindar no entra a la repartició d’escons. En el cas de les estatals espanyoles, el llindar és del 3% del total de vots en cada circumscripció electoral (que corresponen a les províncies).

Les següents funcions per a Mathematica simulen la repartició d’escons. Els paràmetres són vots, que és una llista dels vots obtinguts per cada partit amb el format

{{"Partit A", votsA}, {"Partit B", votsB}, ...}

n, que és el total d'escons a repartit i llindar (opcional, per defecte 0), que és la fracció mínima per entrar a la repartició (en el cas de les estatals espanyoles, com he dit abans, 0.03).

DHondt[vots_List, n_Integer, llindar_: 0] := Module[
  {taula, tall, votsTotal},

  votsTotal = Plus @@ vots[[All, 2]];

  taula = Table[
    {
     vots[[i, 1]],
     If[vots[[i, 2]] >= (llindar votsTotal),
        vots[[i, 2]]/#,
        0
        ] & /@ Range[n]
     }, {i, 1, Length[vots]}
    ];

  tall = Sort[Flatten[taula[[All, 2]]], Greater][[n]];

  Table[{
    taula[[i, 1]],
    Count[taula[[i, 2]], a_ /; a >= tall]
    }, {i, 1, Length[taula]}
   ]
  ]
SainteLague[vots_List, n_Integer, llindar_: 0] := Module[
  {taula, tall, votsTotal},

  votsTotal = Plus @@ vots[[All, 2]];

  taula = Table[
    {
     vots[[i, 1]],
     If[vots[[i, 2]] >= (llindar votsTotal),
        vots[[i, 2]]/(2 # + 1),
        0
        ] & /@ Range[0, n - 1]
     }, {i, 1, Length[vots]}
    ];

  tall = Sort[Flatten[taula[[All, 2]]], Greater][[n]];

  Table[{
    taula[[i, 1]],
    Count[taula[[i, 2]], a_ /; a >= tall]
    }, {i, 1, Length[taula]}
   ]
  ]

Actualització (07/12/2011): He tret el Floor[], que com diu en Bernat en un comentari no té sentit.

About these ads