19 return matrix(k, [[j == i for j in xrange(w)]
21 [[j == i or j == i + c for j in xrange(w)]
25 def A(w, c, i): return Abase(w, c)[i:i + w, 0:w]
27 def B(w, c, i, j): return A(w, c, i) + A(w, c, j)
29 def urank(w, c, i): return A(w, c, i).rank()
33 if urank(w, c, i) < w: return ZZ(i)
35 if B(w, c, i, j).rank() < w: return ZZ(i)
36 return ZZ(w) #unlikely
39 for c1 in xrange(0, 8):
40 for c8 in xrange(w - 8, -8, -8):
44 want_bits = (w - 1).nbits()
45 best_bits, best_dom, best_c = 0, 0, -1
49 if bits == want_bits: return c, d
50 elif bits > best_bits: best_bits, best_dom, best_c = bits, d, c
51 return best_c, best_dom
53 for w in [64, 96, 128, 192, 256]:
54 c, dom = stretch_shift(w)
55 print '%3d: %3d [%d]' % (w, c, dom)