generalized algorithm