# Arup Guha
# 6/10/2025
# Start of a Fraction Class

import math

class Fraction:

    # Basic constructor.
    def __init__(self, num, den):

        # Get the common divisor.
        div = math.gcd(num, den)

        # Set up the fraction in lowest terms.
        self.num = num//div
        self.den = den//div
        
    # Adds self to frac2 and returns the answer in a new Fraction.
    def add(self, frac2):
            
        # This is what you get when you take a standard common denominator.
        newNum = self.num*frac2.den + frac2.num*self.den
        newDen = self.den*frac2.den
        return Fraction(newNum, newDen)

    # Subtracts frac2 from self and returns the answer in a new Fraction.
    def subtract(self, frac2):

        # This is what you get when you take a standard common denominator.
        newNum = self.num*frac2.den - frac2.num*self.den
        newDen = self.den*frac2.den
        return Fraction(newNum, newDen)

    # Multiplies self and frac2 and returns the answer in a new Fraction.
    def multiply(self, frac2):

        # This one's easier.
        newNum = self.num*frac2.num
        newDen = self.den*frac2.den
        return Fraction(newNum, newDen)

    # Raises self to the power exp and returns the answer in a new Fraction.
    def power(self, exp):

        # This is self to the 0 power.
        ans = Fraction(1,1)
        
        # Multiply self into ans exp times.
        for i in range(exp):
            ans = ans.multiply(self)
        return ans

    # String representation of a fraction.
    def __str__(self):
        return str(self.num)+"/"+str(self.den)

# Quick test.
def test():

    # Create two fractions.
    f1 = Fraction(2,3)
    f2 = Fraction(5,6)

    # Add and print out!
    ans = f1.add(f2)
    print(f1,"+",f2,"=",ans)

    # Testing quiz questions.
    print(f2.subtract(f1))
    print(f1.multiply(f2))
    print(f1.power(4))

# Run it.
test()

    
