delinearize memory access functions
in findGCD of multiply expr return the gcd

we used to return 1 instead of the gcd
handle special cases when findGCD returns 1

used to fail with 'Step should divide Start with no remainder.'
divide by the result of the gcd

used to fail with 'Step should divide Start with no remainder.'