

def nth_root(a, n, tolerance):
    '''uses Newton-Raphson to find nth root'''
    oldGuess = 1.0
    newGuess = oldGuess - (oldGuess ** n - a) / (n * oldGuess**(n - 1))
    while abs(oldGuess - newGuess) > tolerance:
        oldGuess = newGuess
        newGuess = oldGuess - (oldGuess ** n - a) / (n * oldGuess**(n - 1))
    return newGuess



# We can break the same function up into smaller functions if we want


def next_guess(a, n, oldGuess):
    '''part of Newton-Raphson approach to finding nth root'''
    nextGuess = oldGuess - (oldGuess ** n - a) / (n * oldGuess**(n - 1))
    return nextGuess

def has_next_guess(a, n, tolerance, oldGuess):
    '''predicate function for Newton-Raphson method for finding nth root'''
    newGuess = next_guess(a, n, oldGuess)
    return (abs(oldGuess - newGuess)>tolerance)

def nth_root2(a, n, tolerance):
    '''Uses Newton-Raphson to find nth root of a'''
    guess=1.0
    while has_next_guess(a, n, tolerance, guess):
        guess = next_guess(a, n, guess)
    return next_guess(a, n, guess)




