
def puiss1Rec(x, n, y):
    """  Puissance naive terminale
 
     :param x: un réel
     :param n: un entier
     :param y: le cumul
     :return: Puissance x^n
    """
    return (y if n == 0 else puiss1Rec(x, n - 1, x * y))


def puiss1(x, n):
    """  Puissance naive (suppose n >= 0)
 
     :param x: un réel
     :param n: un entier
     :return: Puissance x^n
    """
    return puiss1Rec(x, n, 1.0)


def carre(x):
    """  Carré d'un réel
 
     :param x: un réel
     :return: carré de x
    """
    return (x * x)


def puiss2(x, n):
    """  Puissance basée sur la parité de n (suppose n >= 0)
 
     :param x: un réel
     :param n: un entier
     :return: Puissance x^n
    """
    if n == 0:
        return 1.0
    elif n % 2 == 0:
        return carre(puiss2(x, n // 2))
    else:
        return x * carre(puiss2(x, (n - 1) // 2))


def puiss3Rec(x, n, y):
    """  Puissance terminale
 
     :param x: un réel
     :param n: un entier
     :param y: le cumul
     :return: Puissance x^n
    """
    if n == 0:
        return y
    elif n % 2 == 0:
        return puiss3Rec(x * x, n // 2, y)
    else:
        return puiss3Rec(x, n - 1, x * y)


def puiss3(x, n):
    """  Puissance basée sur la parité de n (suppose n >= 0)
 
     :param x: un réel
     :param n: un entier
     :return: Puissance x^n
    """
    return puiss3Rec(x, n, 1.0)


def puiss4(x, n):
    """  Puissance itérative basée sur la parité de n (suppose n >= 0)
 
     :param x: un réel
     :param n: un entier
     :return: Puissance x^n
    """
    y = 1.0
    while n != 0:
        if n % 2 == 0:
            x *= x
            n //= 2
        else:
            y *= x
            n -= 1
    return y


def PGPuissance():
    x = float(input("Puissance x? "))
    n = int(input("Ordre n? "))
    print("==> puiss1(x,n) vaut ", puiss1(x, n), sep="")
    print("==> puiss2(x,n) vaut ", puiss2(x, n), sep="")
    print("==> puiss3(x,n) vaut ", puiss3(x, n), sep="")
    print("==> puiss4(x,n) vaut ", puiss4(x, n), sep="")

PGPuissance()