changed to unsigned long so it handle up to ~65 factorial