@Иван Иванов, гарантированно для случайных бит? Не бывает таких гарантий, но для каждой комбинации есть математической ожидание "времени ожидания":
from bitarray import bitarray
from bitarray.util import *
import numpy as np
def Конвея_корреляция(X: bitarray, Y: bitarray) -> bitarray:
'''оно же "ведущее число".'''
return bitarray(X[i:i + len(Y)] == Y[0:len(X) - i]
for i in range(len(X)))
def Время_ожидания(X: bitarray) -> int:
return 2*ba2int(Конвея_корреляция(X, X))
def Относительные_шансы_B(A: bitarray, B: bitarray) -> float:
AAq = ba2int(Конвея_корреляция(A, A))
ABq = ba2int(Конвея_корреляция(A, B))
BBq = ba2int(Конвея_корреляция(B, B))
BAq = ba2int(Конвея_корреляция(B, A))
return (AAq - ABq)/(BBq - BAq)
def Вероятность_победы_B(A: bitarray, B: bitarray) -> float:
return 1/(1 + 1/Относительные_шансы_B(A, B))
def Выбор_B(A: bitarray, b: int = None) -> bitarray:
if b is None:
# x² + 1, гарантированно беспроигрышный выбор, но, иногда, не лучший
b = A[-2] ^ 1
res = A >> 1
res[0] = b
return res
def Лучший_выбор_B(A: bitarray) -> bitarray:
b = Выбор_B(A)
try:
bb = b.copy()
bb[0] ^= 1
if Относительные_шансы_B(A, bb) > Относительные_шансы_B(A, b):
return bb
except ZeroDivisionError:
pass
return b
assert Конвея_корреляция(bitarray([s == 'H' for s in 'HTHTTH']),
bitarray([s == 'H' for s in 'HTTHT'])) == bitarray('001001')
assert Конвея_корреляция(bitarray([s == 'H' for s in 'HTTHT']),
bitarray([s == 'H' for s in 'HTHTTH'])) == bitarray('00010')
assert Конвея_корреляция(bitarray([s == 'H' for s in 'HTTHT']),
bitarray([s == 'H' for s in 'HTHTTH'])) == bitarray('00010')
assert ba2int(Конвея_корреляция(bitarray([s == 'P' for s in 'OOPOOOP']),
bitarray([s == 'P' for s in 'OOPOOOP']))) == 68
assert ba2int(Конвея_корреляция(bitarray([s == 'P' for s in 'POOPOOO']),
bitarray([s == 'P' for s in 'OOPOOOP']))) == 35
assert Время_ожидания(bitarray([s == 'P' for s in 'P'])) == 2
assert Время_ожидания(bitarray([s == 'P' for s in 'OP'])) == 4
assert Время_ожидания(bitarray([s == 'P' for s in 'OPOO'])) == 18
np.testing.assert_allclose(Относительные_шансы_B(bitarray('000'), bitarray('100')), 7)
np.testing.assert_allclose(Вероятность_победы_B( bitarray('000'), bitarray('100')), 7/8)
assert Выбор_B(bitarray('000')) == bitarray('100')
assert Выбор_B(bitarray('1110')) == bitarray('0111')
assert Выбор_B(bitarray('1010')) == bitarray('0101')
assert Лучший_выбор_B(bitarray('000')) == bitarray('100')
assert Лучший_выбор_B(bitarray('1110')) == bitarray('0111')
assert Лучший_выбор_B(bitarray('1010')) == bitarray('1101')