derivative algorithms