factorization techniques