with(combinat); R := proc(n) local bits, len, part, cert, blocks, pos, offs, val, seg; bits := convert(n, base, 2); len := nops(bits); for part in partition(len) do blocks := []; pos := len; for seg in part do offs := pos-seg+1; if bits[pos] > 0 then val := add(bits[q]*2^(q-offs), q=offs..pos); else break; fi; blocks := [op(blocks), val]; pos := pos-seg; od; if nops(blocks) = nops(part) then for pos to nops(blocks)-1 do if blocks[pos+1] mod blocks[pos] > 0 then break; fi; od; if pos = nops(blocks) then cert := [part, blocks]; break; fi; fi; od; cert; end; X := n -> nops(op(1, R(n)));