Skip to content

Instantly share code, notes, and snippets.

@sbourdeauducq
Created September 9, 2017 02:22
Show Gist options
  • Select an option

  • Save sbourdeauducq/b5a1b9ccede8ce52a3b6bccbfbcaadac to your computer and use it in GitHub Desktop.

Select an option

Save sbourdeauducq/b5a1b9ccede8ce52a3b6bccbfbcaadac to your computer and use it in GitHub Desktop.
# Based on: https://github.com/Bekbolatov/SortingNetworks/blob/master/src/main/js/gr.js
def boms_get_partner(n, l, p):
if p == 1:
return n ^ (1 << (l - 1))
scale = 1 << (l - p)
box = 1 << p
sn = n//scale - n//scale//box*box;
if sn == 0 or sn == (box - 1):
return n
if (sn % 2) == 0:
return n - scale
return n + scale
def boms_pairs(d):
A = []
for l in range(1, d+1):
for p in range(1, l+1):
Y = set()
for n in range(2**d):
partner = boms_get_partner(n, l, p)
if partner != n:
if partner > n:
partner1 = n
partner2 = partner
else:
partner1 = partner
partner2 = n
Y.add((partner1, partner2))
A.append(Y)
return A
print(boms_pairs(3))
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment