def valeurs(nombre_min, nombre_max, carre_parfait, non_simplifiable):
    iteration = 0
    while True:
        # generation d'un nombre entre nombre_min et nombre_max
        nombre = random.randrange(nombre_min, nombre_max)
        # decomposition en facteur premier
        decomposition = Arithmetique.factor(nombre)
        compte = [(k, decomposition.count(k)) for k in set( decomposition)]
        # les facteurs qui apparaissent 2 fois forment le carré, les autres sont le coefficient   
        (coefficient, carre) = (1, 1)
        for i in range(len(compte)):
            coefficient = coefficient * compte[i][0] ** (compte[i][1] % 2)
            carre = carre * compte[i][0] ** (compte[i][1] / 2)
        #Choix
        if carre_parfait == 1 and non_simplifiable == 0 and coefficient == 1:
            break
        if carre_parfait == 0 and non_simplifiable == 1 and carre == 1:
            break
        if carre_parfait == 0 and non_simplifiable == 0 and coefficient != 1 and carre != 1:
            break
        # Controle du bouclage si l'utilisateur fait un choix de valeur min et max absurde
        if iteration > 10000:
            (coefficient, carre) = (0, 0)
            break
    return coefficient, carre
def div(nombre_min, nombre_max):
    # on trouve a et b en valeur absolue
    a_absolu = 2
    while Arithmetique.premier(a_absolu):
        a_absolu = abs(Arithmetique.valeur_alea(nombre_min, nombre_max))
    decomposition_a_absolu = Arithmetique.factor(a_absolu)
    nbre_facteur_a_absolu = len(decomposition_a_absolu)
    decomposition_b_absolu = random.sample(decomposition_a_absolu,random.randrange(1,len(decomposition_a_absolu)))
    b_absolu = 1
    for facteur in  decomposition_b_absolu:
        b_absolu = b_absolu * facteur
    # on choisit le signe possible pour a et b
    a_possible = [-a_absolu , a_absolu]
    b_possible = [-b_absolu , b_absolu]

    if a_possible[1] < nombre_max:
        if nombre_min < a_possible[0]:
            a = a_possible[random.randrange(2)]
        else:
            a = a_possible[1]
    else:
        a = a_possible[0]

    if b_possible[1] < nombre_max:
        if nombre_min < b_possible[0]:
            b = b_possible[random.randrange(2)]
        else:
            b = b_possible[1]
    else:
        b = b_possible[0]

    return (a, b)
def div_dec(nombre_min, nombre_max):
    a = 2
    while Arithmetique.premier(a):
        a = Arithmetique.valeur_alea(nombre_min*10, nombre_max*10)

    decomposition_a = Arithmetique.factor(a)
    nbre_facteur_a = len(decomposition_a)
    
    decomposition_b = random.sample(decomposition_a,random.randrange(1,len(decomposition_a)))
    b = 1
    for facteur in  decomposition_b:
        b = b * facteur
    return (a/10.0, b/10.0)
def valeurs_produit(nombre_min, nombre_max):
    iteration = 0
    while True:
        # generation de 2 nombres entre nombre_min et nombre_max
        nombre1 = random.randrange(nombre_min, nombre_max)
        nombre2 = random.randrange(nombre_min, nombre_max)
        # decomposition en facteur premier du produit des 2 nombres
        decomposition = Arithmetique.factor(nombre1*nombre2)
        compte = [(k, decomposition.count(k)) for k in set( decomposition)]
        # les facteurs qui apparaissent 2 fois forment le carré, les autres sont le coefficient   
        (coefficient, carre) = (1, 1)
        for i in range(len(compte)):
            coefficient = coefficient * compte[i][0] ** (compte[i][1] % 2)
            carre = carre * compte[i][0] ** (compte[i][1] / 2)
        #Choix
        if coefficient != 1 and carre != 1:
            break  
        # Controle du bouclage si l'utilisateur fait un choix de valeur min et max absurde
        if iteration > 10000:
            (nombre1, nombre2, coefficient, carre, decomposition) = (0, 0, 0, 0, 0)
            break 
    return nombre1, nombre2, coefficient, carre, decomposition