implements plu decomposition