"""
exercice 2.12
Décomposition d'un entier en facteurs premiers  """

from math import sqrt

def premier1(n):
    """ renvoie une chaîne de caractères indiquant si n est premier ou multiple (question 1)"""
    diviseur=2
    while diviseur<=sqrt(n) :
        if n%diviseur==0:
            return "non premier car divisible par "+str(diviseur)
        diviseur+=1
    return "premier"

def premier2(n):
    """ renvoie une chaîne de caractères indiquant le produit des facteurs premiers (question 2)
        il n'est pas nécessaire de tester si le facteur est premier comme indiqué dans l'énoncé """
    diviseur=2
    diviseurMax=sqrt(n)
    diviseurs=[]                                #liste destinée à recevoir les diviseurs de n
    while diviseur<=diviseurMax and n>1 :
        while n%diviseur==0:
            diviseurs.append(diviseur)          #enregistrement d'un facteur premier
            n=n//diviseur
        diviseur+=1
    if len(diviseurs)==0 : return "est premier"
    
    produit="= "                                #préparation de l'affichage pour un nombre multiple
    for facteur in diviseurs :
        produit+=str(facteur)+"\u00D7"
    return produit[:-1]                         #suppression du dernier symbole multiplicatif
"""
n=1001
print(n,premier2(n)) # renvoie 1001 = 7×11×13
n=96
print(n,premier2(n)) # renvoie 96 = 2×2×2×2×2×3
n=101
print(n,premier2(n)) # renvoie 101 est premier
"""

def premier3(n):
    """ renvoie une chaîne de caractères indiquant le produit des facteurs premiers (question 3)
        sous la forme du produit des facteurs à la puissance de sa multiplicité  """
    diviseur=2
    diviseurMax=sqrt(n)
    diviseurs=[]                                    #liste destinée à recevoir les diviseurs de n
    while diviseur<=diviseurMax and n>1 :
        while n%diviseur==0:
            diviseurs.append(diviseur)              #enregistrement d'un facteur premier
            n=n//diviseur
        diviseur+=1
    if len(diviseurs)==0 : return "est premier"
    
    produit="= "                                    #préparation de l'affichage pour un nombre multiple
    multiplicite,facteur=1,diviseurs[0]             #initialisation des variables
    for i in range(1,len(diviseurs)) :
        if diviseurs[i]==facteur :
            multiplicite+=1                         #incrémentation de l'exposant
            continue                                #pour éviter la suite tant que facteur est inchangé
        produit+=str(facteur)+"^"+str(multiplicite)+"\u00D7" #affichage du facteur avec sa multiplicité
        multiplicite,facteur=1,diviseurs[i]         #réinitialisation des variables
    produit+=str(facteur)+"^"+str(multiplicite)     #affichage du dernier facteur   
    return produit
"""
n=1001
print(n,premier3(n)) # renvoie 1001 = 7^1×11^1×13^1
n=96
print(n,premier3(n)) # renvoie 96 = 2^5×3^1
n=101
print(n,premier3(n)) # renvoie 101 est premier
"""

def premier3bis(n):
    """ renvoie une chaîne de caractères indiquant le produit des facteurs premiers (question 3)
        sous la forme du produit des facteurs à la puissance de sa multiplicité
        en n'écrivant l'exposant que si il n'est pas 1 """
    diviseur=2
    diviseurMax=sqrt(n)
    diviseurs=[]  #liste destinée à recevoir les diviseurs de n
    while diviseur<=diviseurMax and n>1 :
        while n%diviseur==0:
            diviseurs.append(diviseur) #enregistrement d'un facteur premier
            n=n//diviseur
        diviseur+=1
    if len(diviseurs)==0 : return "est premier"
    #préparation de l'affichage pour un nombre multiple
    produit="= "
    multiplicite=1
    facteur=diviseurs[0]
    for i in range(1,len(diviseurs)) :
        if diviseurs[i]==facteur :
            multiplicite+=1
            continue
        if multiplicite==1 : produit+=str(facteur)+"\u00D7"
        else : produit+=str(facteur)+"^"+str(multiplicite)+"\u00D7"
        multiplicite=1
        facteur=diviseurs[i]
    if multiplicite==1 : produit+=str(facteur)
    else : produit+=str(facteur)+"^"+str(multiplicite)    
    return produit 

n=1001
print(n,premier3bis(n)) # renvoie 1001 = 7×11×13
n=96
print(n,premier3bis(n)) # renvoie 96 = 2^5×3
n=101
print(n,premier3bis(n)) # renvoie 101 est premier
n=38500
print(n,premier3bis(n)) # renvoie 38500 = 2^2×5^3×7×11
