Fundamentals of Abstract Algebra