# [Edu-sig] fun with voting (by secret ballot)

kirby urner kirby.urner at gmail.com
Wed Jun 10 01:18:19 CEST 2015

```"""
The code below derives from a thread on elections-wg at python.org
where we were talking about tie-breaking techniques.  There's a
well known way that's actually used, but I was inspired to think
about a game wherein the ballots are like playing cards in some
ways, each encoded with a unique prime.

I've got some notes in the moderator queue at math-teach (lots
of traffic), for which I'll share the URL.  More in this month's
elections-wg archive, public-facing.

It's just another way to introduce the Fundamental Theorem of
Arithmetic while reminding students of the composite vs. prime
distinction.  Standard fare.

(CL) copyleft, K. Urner / 4Dsolutions.net, 2015

"""

import random

class Ballot:
"""secret:  unique prime belongs to ballot itself
"""

def __init__(self):
self.dna = random.choice(pool_of_primes)  # this is done at the
store
pool_of_primes.remove(self.dna)

def vote(self, name, vote=1):
self.candidate = name
self.approve = vote

def __repr__(self):
return "Ballot with prime {}".format(self.dna)

pool_of_primes = [int(it) for it in """\
2    3   5   7  11  13  17  19  23  29
31   37  41  43  47  53  59  61  67  71
73   79  83  89  97 101 103 107 109 113
127 131 137 139 149 151 157 163 167 173
179 181 191 193 197 199 211 223 227 229
233 239""".split()]  # 52 in a deck in this example

deck = [Ballot() for _ in range(52)]  # two extra ballots were not used
random.shuffle(deck) # dealt to voters (how many they get depends on how
many candidates)

# ballots coming in from voters all over the world!....

# each candidate on the slate gates same number of ballots cast

stackA = []
for _ in range(26):
secret_ballot = deck.pop()
secret_ballot.vote("Shrek")
stackA.append(secret_ballot)

stackB = []
for _ in range(26):
secret_ballot = deck.pop()
secret_ballot.vote("Alice")
stackB.append(secret_ballot)

# the Vote! a TIE, 25 for each candidate!

def break_tie(sA, sB):
productA, productB = 1, 1
for idx in range(len(sA)):
productA = productA * sA[idx].dna
productB = productB * sB[idx].dna
if productA == productB:
print("The impossible happened")
raise Exception
if productA > productB:
print("Shrek wins!")
else:
print("Alice wins!")

break_tie(stackA, stackB)
print("The crowd roars")
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://mail.python.org/pipermail/edu-sig/attachments/20150609/27bfd2eb/attachment.html>
```