47 lines
1.2 KiB
Python
47 lines
1.2 KiB
Python
# Implements a modified version of the TRIBES low-influence function
|
|
# mentioned in https://arxiv.org/pdf/1406.5694.pdf and outputs the
|
|
# probability that any specific user will be able to influence the result
|
|
|
|
import random, math
|
|
|
|
def mkbits(n):
|
|
return random.randrange(2**n)
|
|
|
|
def tribes_log(n):
|
|
w = 1
|
|
while w * 2**w * 693 < n * 1000:
|
|
w += 1
|
|
return w
|
|
|
|
def tribes(val, n):
|
|
split = tribes_log(n)
|
|
o = []
|
|
full_subset = (1 << split) - 1
|
|
for i in range(n):
|
|
vall = val ^ ((2*i+3)**n % 2**n)
|
|
t = 0
|
|
for _ in range(n // split):
|
|
if vall & full_subset == full_subset:
|
|
t = 1
|
|
break
|
|
vall >>= split
|
|
o.append(t)
|
|
if len(o) % 2 == 0 and o[-2] == 0 and o[-1] == 1:
|
|
return 0
|
|
if len(o) % 2 == 0 and o[-2] == 1 and o[-1] == 0:
|
|
return 1
|
|
return o[-1]
|
|
|
|
def influence(val, n):
|
|
tot = 0
|
|
w = tribes(val, n)
|
|
for i in range(n):
|
|
val2 = val ^ (1 << i)
|
|
w2 = tribes(val2, n)
|
|
if w != w2:
|
|
tot += 1
|
|
return tot / n
|
|
|
|
print(sum([influence(mkbits(50), 50) for i in range(1000)]) / 1000)
|
|
# print(sum([tribes(mkbits(50), 50) for i in range(1000)]) / 1000)
|