diff --git a/pytest/pure.py b/pytest/pure.py new file mode 100644 index 0000000..1c7ad77 --- /dev/null +++ b/pytest/pure.py @@ -0,0 +1,75 @@ +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)