software algorithm