Sainte Laguës algoritme i python

Metoden(e) som brukes for å fordele mandater etter valg i Norge er et flott eksempel på en algoritme og kan ganske enkelt implementeres på en datamaskin. Det har tidligere vært eksamensoppgaver i matematikk hvor det skulle bli implementert i regneark, men det blir fort ekstra rotete. Beskrivelsen fra regjeringen er ganske kompakt:

Metoden kalles St. Laguës modifiserte metode. Den går ut på at den enkelte listes stemmetall først divideres med tallet 1,4 og deretter med tallene 3-5-7-9 osv. Ved disse divisjonene fremkommer en rekke tall, såkalte kvotienter. Kvotientene ordnes etter størrelse. Representantplassene fordeles til de listene som har de største kvotientene. Det første mandatet går til den listen som har den største kvotienten, mandat nr. to til den som har den nest største kvotienten osv.

Regjeringen: Den norske valgordningen i hovedtrekk

En enkel funksjon som tar inn en liste med stemmetall og et antall mandater og returnerer fordelingen av mandater er vist under.

def sainteLague(opprinneligeStemmer, antall):
    # Liste med antallet representanter
    resultat = [0] * len(opprinneligeStemmer)
    # Stemmetallet for de første blir justert med 1.4 for å gi
    # St. Laguës modifiserte metode
    justerteStemmer = [i / 1.4 for i in opprinneligeStemmer]
    
    i = 0
    while i < antall: 
        # Posisjonen til listen som har flest stemmer.
        p = justerteStemmer.index(max(justerteStemmer))
        # De får tildelt en representant.
        resultat[p] = resultat[p] + 1
        # Stemmetallet blir justert videre
        justerteStemmer[p] = opprinneligeStemmer[p] / (resultat[p] * 2 + 1)
        
        i += 1
    return resultat

På eksempelet fra en annen post gir den:

>>> stemmer = [258, 141, 105, 15]
>>> print(sainteLague(stemmer, 19))

  [10, 5, 4, 0]

Denne metoden kan brukes til å undersøke resultater fra valg eller studere hvordan en algoritme kan implementeres. Det er såklart en flott oppgave for elevene å lage sin egen implementering.

Oppgaveforslag

  • Sammenlign den modifiserte St. Laguës metode med den umodifiserte, hvor det ikke blir delt på 1,4. Hvorfor gjør den modifiserte metoden det vanskeligere for små partier å komme inn?
  • Valgloven sier at dersom de justerte stemmetallene er like, skal den listen som hadde høyest opprinnelig stemmetall få mandatet. Hvis det opprinnelige stemmetallet var likt, skal det være loddtrekning. Legg dette til i algoritmen.
  • Til fordeling av formannskap i kommunestyrer, skal man bruke den lignende d’Hondts metode, hvor en deler på 1, 2, 3,… i stedet for 1, 3, 5,… Hvordan endrer det fordelingene?
  • Algoritmen gjentar det samme i hvert steg, kan du lage en rekursiv funksjon som gjør den samme fordelingen?
  • Regn ut hvor mange stemmer som skilte for det siste mandatet og hvilken liste som lå an til å ta det.

Underviser i matematikk, fysikk og naturfag på Tryggheim vgs.