private static byte[] safeFold(byte[] N, byte q) {
    byte r = (byte)Math.round((Math.log(N.length)/LOG_2));
    if(q >= r) {
      return N;
    }
    byte[] R;
    if(r - q > 1) {
      N = safeFold(N, (byte)(q + 1));
    }
    int o = N.length/2;
    R = new byte[o];
    for(int i = 0; i < o; i++) {
      byte b0 = N[2 * i];
      byte b1 = N[2 * i + 1];
      if(b0 == 0 && b1 == 0) {
        R[i] = (byte)0;
      } else {
        R[i] = (byte)(b0 + 1);
      }
    }
    return R;
  }