Factoring polynomials over finite fields