76 lines
1.4 KiB
Python
76 lines
1.4 KiB
Python
import itertools
|
|
from math import inf
|
|
|
|
n = 16
|
|
k = 6
|
|
p = 2
|
|
|
|
def in_set_a(x):
|
|
return x.bit_count() == k
|
|
|
|
def in_set_b(y):
|
|
return y.bit_count() == k + 1
|
|
|
|
def related(a, b):
|
|
return (x ^ y).bit_count() == 1
|
|
|
|
|
|
m = inf
|
|
m_prime = inf
|
|
|
|
window = (1 << p) - 1
|
|
l = 0
|
|
l_prime = 0
|
|
|
|
# Look at all the `x`s, find the `x` with least number of relations, and
|
|
# what is the `x` with most relations (under the window condition)
|
|
for x in range(2**n):
|
|
if not in_set_a(x):
|
|
continue
|
|
|
|
relations_count = 0
|
|
|
|
for y in range(2**n):
|
|
if not in_set_b(y):
|
|
continue
|
|
|
|
if not related(x, y):
|
|
continue
|
|
|
|
relations_count += 1
|
|
|
|
if (x & window) != (y & window):
|
|
l += 1
|
|
|
|
# This `x` has less relations than all `x` we've looked at so far
|
|
if relations_count < m:
|
|
m = relations_count
|
|
|
|
for y in range(2**n):
|
|
if not in_set_b(y):
|
|
continue
|
|
|
|
relations_count = 0
|
|
|
|
for x in range(2**n):
|
|
if not in_set_a(x):
|
|
continue
|
|
|
|
if not related(x, y):
|
|
continue
|
|
|
|
relations_count += 1
|
|
|
|
if (x & window) != (y & window):
|
|
l_prime += 1
|
|
|
|
# This `y` has less relations than all `y` we've looked at so far
|
|
if relations_count < m_prime:
|
|
m_prime = relations_count
|
|
|
|
# Finally, see if we can get a better `l_max` under this window than
|
|
# what we've seen so far
|
|
l_max = l * l_prime
|
|
|
|
print(m, m_prime, l_max)
|