partial products algorithm