void Rec_Syst_Conv_Code::encode_tail(const bvec &input, bvec &tail, bmat &parity_bits)
{
  int i, j, length = input.size(), target_state;
  parity_bits.set_size(length+m, n-1, false);
  tail.set_size(m, false);
  
  encoder_state = 0;
  for (i=0; i<length; i++) {
    for (j=0; j<(n-1); j++) {
      parity_bits(i,j) = output_parity(encoder_state,2*j+int(input(i)));
    }
    encoder_state = state_trans(encoder_state,int(input(i)));
  }
  
  // add tail of m=K-1 zeros
  for (i=0; i<m; i++) {
    target_state = (encoder_state<<1) & ((1<<m)-1);
    if (state_trans(encoder_state,0)==target_state) { tail(i) = bin(0); } else { tail(i) = bin(1); }
    for (j=0; j<(n-1); j++) {
      parity_bits(length+i,j) = output_parity(encoder_state,2*j+int(tail(i)));
    }
    encoder_state = target_state;
  }
  terminated = true;
}
void Rec_Syst_Conv_Code::encode(const bvec &input, bmat &parity_bits)
{
  int i, j, length = input.size();
  parity_bits.set_size(length, n-1, false);
  
  encoder_state = 0;
  for (i=0; i<length; i++) {
    for (j=0; j<(n-1); j++) {
      parity_bits(i,j) = output_parity(encoder_state,2*j+int(input(i)));
    }
    encoder_state = state_trans(encoder_state,int(input(i)));
  }
  terminated = false;
}