Local cycles optimization: a technique for designing low density parity check codes