  Cyclic redundancy check (CRC) codes check if a codeword is correctly
received. This paper presents an algorithm to design CRC codes that are
optimized for the code-specific error behavior of a specified feedforward
convolutional code. The algorithm utilizes two distinct approaches to computing
undetected error probability of a CRC code used with a specific convolutional
code. The first approach enumerates the error patterns of the convolutional
code and tests if each of them is detectable. The second approach reduces
complexity significantly by exploiting the equivalence of the undetected error
probability to the frame error rate of an equivalent catastrophic convolutional
code. The error events of the equivalent convolutional code are exactly the
undetectable errors for the original concatenation of CRC and convolutional
codes. This simplifies the computation because error patterns do not need to be
individually checked for detectability. As an example, we optimize CRC codes
for a commonly used 64-state convolutional code for information length k=1024
demonstrating significant reduction in undetected error probability compared to
the existing CRC codes with the same degrees. For a fixed target undetected
error probability, the optimized CRC codes typically require 2 fewer bits.
