def f_haploid(n):
a = 2 ** (2 ** (n - 1))
b = 2 ** n - 1
c = 2 ** n
result = a * b / c
assert result % 1 == 0 # is integer
return int(result)
def f_diploid(n):
a = 2 ** n - n
result = 2 ** a
assert result % 1 == 0 # is integer
return int(result)
def f_sharp(n):
a = 2 ** n - n - 1
result = 2 ** a
assert result % 1 == 0 # is integer
return int(result)
def f_blunt(n):
a = 2 ** (2 ** n)
b = 2 ** (2 ** (n - 1) + 1)
c = 2 ** n - 1
d = 2 ** (n + 1)
result = (a + b * c) / d
assert result % 1 == 0 # is integer
return int(result)
def f_total(n):
a = 2 ** (2 ** n)
b = 2 ** (2 ** (n - 1))
c = 2 ** n - 1
d = 2 ** n
result = (a + b * c) / d
assert result % 1 == 0 # is integer
return int(result)
haploid = [0, 1, 3, 14, 240, 63488, 4227858432]
diploid = [2, 2, 4, 32, 4096, 134217728, 288230376151711744]
sharp = [1, 1, 2, 16, 2048, 67108864, 144115188075855872]
blunt = [1, 2, 5, 30, 2288, 67172352, 144115192303714304]
total = [2, 3, 7, 46, 4336, 134281216, 288230380379570176]
assert [f_haploid(n) for n in range(7)] == haploid
assert [f_diploid(n) for n in range(7)] == diploid
assert [f_sharp(n) for n in range(7)] == sharp
assert [f_blunt(n) for n in range(7)] == blunt
assert [f_total(n) for n in range(7)] == total
for n in range(7):
assert haploid[n] == blunt[n] - sharp[n]
assert diploid[n] == 2 * sharp[n]
assert sharp[n] == blunt[n] - haploid[n]
assert blunt[n] == sharp[n] + haploid[n] == (total[n] + haploid[n]) / 2
assert total[n] == sharp[n] + blunt[n] == haploid[n] + diploid[n]