
print("\nExercice 3\n")

def étoile():
	print('*',end='')

def dièse() :
	print('#',end='')

def nouvelle_ligne() :
	print()



def tapis_a(largeur,hauteur):
    i=0
    while i<hauteur: # Pour chaque ligne
        j=0
        while j<largeur:  # Pour chaque colonnes
            dièse()
            j=j+1
        nouvelle_ligne()
        i=i+1

def tapis_b(largeur,hauteur):
    i=0
    while i<hauteur: # Pour chaque ligne
        j=0
        while j<largeur:  # Pour chaque colonnes
            if j%2==0: # Si j est pair
                étoile()
            else: # sinon j est forcèment impaire
                dièse()
            j=j+1
        nouvelle_ligne()
        i=i+1


def ligne_alternée(n,symbole1,symbole2): #  pour afficher les lignes -> *#*#*#*
    j=0
    while j<n:
        if j%2==0:
            symbole1()
        else:
            symbole2()
        j=j+1
    nouvelle_ligne()

def tapis_b(largeur,hauteur):
    i=0
    while i<hauteur:
        ligne_alternée(largeur,étoile,dièse)
        i=i+1

def tapis_c(largeur,hauteur):
    i=0
    while i<hauteur:
        if i%2==0:
            ligne_alternée(largeur,étoile,dièse)
        else:
            ligne_alternée(largeur,dièse,étoile)
        i=i+1

def tapis_d(largeur,hauteur):
    i=0
    while i<hauteur:
        if i%3==0:
            ligne_alternée(largeur,étoile,dièse)
        elif i%3==1:
            ligne_alternée(largeur,dièse,étoile)
        else:
            ligne_alternée(largeur,étoile,étoile)
        i=i+1


# def tapis_d(n):
#     i=0
#     while i<n-1:
#         if i%4==1:
#             étoile()
#             ligne_simple(n-1,dièse)
#         elif i%4==3:
#             ligne_simple(n-1,dièse)
#             étoile()
#         else:
#             ligne_simple(n,étoile)
#         nouvelle_ligne() # Dans tous les cas
#         i=i+1




print("Tapis a")
tapis_a(10,10)
print("Tapis b")
tapis_b(10,10)
print("Tapis c")
tapis_c(10,10)
print("Tapis d")
tapis_d(10,10)




print("\nExercice 4\n")

def fermat(n):
    return 2 ** (2 ** n) + 1

i=0
while i<=5:
    print("fermat(",i,")=",fermat(i),sep='')
    i=i+1

def premier_facteur(n):
    d = 2
    while n%d != 0 :
        d = d+1
    return d

i=2
while i<=20:
    print('Le premier facteur de',i,'est',premier_facteur(i))
    i=i+1


print('Le premier facteur de',57,'est',premier_facteur(57))




def est_premier(n):
    return n == premier_facteur(n)

def dernière_question() :
    n = 0
    # Heureusement que Fermat s'est trompé, sinon notre boucle ne terminerai jamais !
    while est_premier(fermat(n)) :
        n = n + 1
    print('fermat(',n,')=',fermat(n),' n’est pas premier',sep='',end=' ')
    print('car il a pour diviseur ', premier_facteur(fermat(n)),sep='')

dernière_question()

def dernière_question_v2() :
    n = 0
    f = fermat(n)
    p = premier_facteur(f)
    # Pour que le test du while ait un sens la première fois qu'on
    # rentre dans la boucle, il faut initialiser f et p avant.
    while f == p :
        n = n + 1
        f = fermat(n)
        p = premier_facteur(f)
    print('fermat(',n,')=',f,' n’est pas premier',sep='',end=' ')
    print('car il a pour diviseur ',p,sep='')

dernière_question_v2()

def dernière_question_v3() :
    n = 0
    f = fermat(0)
    p = premier_facteur(f)
    while f == p :
        n = n + 1
        f = (f-1)**2 + 1
        p = premier_facteur(f)
    print('fermat(',n,')=',f,' n’est pas premier',sep='',end=' ')
    print('car il a pour diviseur ',p,sep='')

dernière_question_v3()



print("\nExercice 5\n")

def dériver(f,a,h) :
    return (f(a+h) - f(a)) / h

def résoudre(f,a,h) :
    while abs(f(a)) >= h :
        a = a - f(a) / dériver(f,a,h)
    return a

def f(x) :
    return x*x - 2

print("racine(2) =",résoudre(f, 1, 0.000001))


print("\nExercice 6\n")


def étoile():
	print('*',sep='',end='')

def dièse() :
	print('#', sep='',end='')

def nouvelle_ligne() :
	print()

# Pour afficher n fois le même symbole
def ligne_simple(n,symbole):
    i=0
    while i<n:
        symbole()
        i=i+1

def tapis_A(largeur,hauteur):
    ligne_simple(largeur,étoile) # première ligne
    nouvelle_ligne()
    i=0
    while i<hauteur-2:
        étoile()
        ligne_simple(largeur-2,dièse)
        étoile()
        nouvelle_ligne()
        i=i+1
    ligne_simple(largeur,étoile) # dernière ligne
    nouvelle_ligne()

# Pour afficher ######*##### où l'* est à la position p
def ligne_position(n,p,symbole1,symbole2):
    i=0
    while i<n:
        if i==p:
            symbole2()
        else:
            symbole1()
        i=i+1


def tapis_B(largeur,hauteur):
    i=0
    while i<hauteur:
        ligne_position(largeur,largeur-i-1,dièse,étoile)
        nouvelle_ligne()
        i=i+1

def barre_1():
    print('/',end='')

def barre_2():
    print('\\',end='') # Il faut échapper le symbole de backslash

# Ne marche que si largeur est pair
def tapis_C(largeur,hauteur):
    i=0
    m=hauteur//2
    n=largeur//2
    while i<m:
        ligne_position(n,n-i-1,dièse,barre_1)
        ligne_position(n,i,dièse,barre_2)
        nouvelle_ligne()
        i=i+1
    i=0
    while i<m:
        ligne_position(n,i,dièse,barre_2)
        ligne_position(n,n-i-1,dièse,barre_1)
        nouvelle_ligne()
        i=i+1

print("tapis A")
tapis_A(10,10)
print("tapis B")
tapis_B(10,10)
print("tapis C")
tapis_C(10,10)




def suivant(un):
    if un%2 == 0:
        return un//2
    else:
        return 3*un + 1



def syracuse_récursive(un):
    if un == 1:
        print(1)
    else:
        print(un, " -> ", end='')
        syracuse_récursive(suivant(un))

def nombre_syracuse_récursive(un):
    if un == 1:
        return 0
    else:
        return 1+nombre_syracuse_récursive(suivant(un))




print("Test de la fonction syracuse_rec")
syracuse_récursive(12)

print("Test de la fonction nombre_syracuse_récursive")
print('12 nécessite',nombre_syracuse_récursive(12),'étapes.')
