def valeurs_apbamb(nombre_min, nombre_max):  # renvoie un tuple contenant ((3,-5),(3,+5))
    a = valeur_alea(nombre_min, nombre_max)
    b = valeur_alea(nombre_min, nombre_max)
    if random.randrange(2):
        return ((a, -b), (a, b))
    else:
        return ((a, b), (a, -b))
def valeurs_type5(nombre_min, nombre_max):  # renvoie les valeurs pour obtenir a²-(bx+c)²
    a = (0, valeur_alea(nombre_min, nombre_max))
    b = (valeur_alea(nombre_min, nombre_max), valeur_alea(nombre_min, nombre_max))
    if random.randrange(2) == 0:  #  le nombre est en premier
        return (a, b)
    else:
        return (b, a)
def valeurs_apbamb(pyromax):  # renvoie un tuple contenant ((3,-5),(3,+5))
    a = valeur_alea(-pyromax, pyromax)
    b = valeur_alea(-pyromax, pyromax)
    if randrange(2) == 0:
        return ((a, b), (-a, b))
    else:
        return ((a, b), (a, -b))
def Fraction(parametre):
    question = u"Compléter :"
    exo = []
    cor = []
    #Génération des nombres
    n = d = 1
    while n == d:
        n = valeur_alea(parametre[0], parametre[1])
        d = valeur_alea(parametre[0], parametre[1])
    c = random.randrange(2, 11)
    #Construction
    cas = random.randrange(2)
    if cas:
        enonce = [n, d, n * c, d * c]
        solution = [n, d, n * c, d * c]
    else:
        enonce = [n * c, d * c, n, d]
        solution = [n * c, d * c, n, d]
    trou = random.randrange(4)
    enonce[trou] = "\\ldots"
    solution[trou] = "\\boxed{%s}" % solution[trou]
    if cas:
        solution.insert(2, c)
        solution.insert(1, c)
    else:
        solution.insert(4, c)
        solution.insert(3, c)
    #Affichage
    exo.append("$$\\dfrac{%s}{%s}=\\dfrac{%s}{%s}$$" % tuple(enonce))
    if cas:
        cor.append("$$\\dfrac{%s_{(\\times %s)}}{%s_{(\\times %s)}}=\\dfrac{%s}{%s}$$" % tuple(solution))
    else:
        cor.append("$$\\dfrac{%s}{%s}=\\dfrac{%s_{(\\times %s)}}{%s_{(\\times %s)}}$$" % tuple(solution))
    return (exo, cor, question)
def valeur_fraction(nombre_min, nombre_max):
    n = valeur_alea( nombre_min, nombre_max)
    d = valeur_alea( nombre_min, nombre_max)
    while pgcd( n , d ) == 1:
        n = valeur_alea( nombre_min, nombre_max)
        d = valeur_alea( nombre_min, nombre_max)
    fr = Fractions(n, d)
    return fr
def valeurs_facto(nombre_min, nombre_max):
    while True:
        a = valeur_alea(nombre_min, nombre_max)
        b = valeur_alea(nombre_min, nombre_max)
        c = valeur_alea(nombre_min, nombre_max)
        l = [0, a, b, c]
        if abs(l[1]) != 1:
            break  #Pour qu'il y ait quelque chose à développer.
    return ((l[0], l[1]), (l[2], l[3]))
def valeurs_distr(nombre_min, nombre_max):  # renvoie in tuple contenant ((a,b),(c,d)) avec a != c ou b != d (en valeur absolue) et a, b, c ou d nul.
    while True:
        a = valeur_alea(nombre_min, nombre_max)
        b = valeur_alea(nombre_min, nombre_max)
        c = valeur_alea(nombre_min, nombre_max)
        l = [a, b, c]
        l.insert(random.randrange(4), 0)
        if abs(l[1]) != 1 and abs(l[3]) != 1:
            break  #Pour qu'il y ait quelque chose à développer.
    return ((l[0], l[1]), (l[2], l[3]))
def valeur_decimal(nombre_min, nombre_max):
    n = valeur_alea( nombre_min, nombre_max)
    longueur_n = len(str(n))
    d = 10 ** random.randrange(longueur_n-1, longueur_n+3)
    while pgcd( n , d ) == 1:
        n = valeur_alea( nombre_min, nombre_max)
        longueur_n = len(str(n))
        d = 10 ** random.randrange(longueur_n-1, longueur_n+3)
    fr = Fractions(n, d)
    return float(n)/d, fr
def valeurs_distr(nombre_min, nombre_max):
    while True:
        a = valeur_alea(nombre_min, nombre_max)
        b = valeur_alea(nombre_min, nombre_max)
        c = valeur_alea(nombre_min, nombre_max)
        l = [a, b, c]
        l.insert(random.randrange(0, 4, 2), 0)
        if abs(l[1]) != 1 and abs(l[3]) != 1:
            break  #Pour qu'il y ait quelque chose à développer.
    return ((l[0], l[1]), (l[2], l[3]))
def valeurs_type0(nombre_min, nombre_max):  # renvoie les valeurs pour obtenir un facteur commun et un facteur 1
    a = ((valeur_alea(nombre_min, nombre_max), valeur_alea(nombre_min, nombre_max)), (valeur_alea(nombre_min, nombre_max), valeur_alea(nombre_min, nombre_max)))
    while a[0] == a[1]:  # on refuse un carre
       a = ((valeur_alea(nombre_min, nombre_max), valeur_alea(nombre_min, nombre_max)), (valeur_alea(nombre_min, nombre_max), valeur_alea(nombre_min, nombre_max)))

    b = (a[random.randrange(2)], (0, 1))
    if random.randrange(2) == 1:  # le 1 est dans le deuxieme terme
        return (a, b, random.randrange(2), random.randrange(2))
    else:
        return (b, a, random.randrange(2), random.randrange(2))
def valeurs_type3(nombre_min, nombre_max):  # renvoie les valeurs pour obtenir un facteur commun au carre
    a = ((valeur_alea(nombre_min, nombre_max), valeur_alea(nombre_min, nombre_max)), (valeur_alea(nombre_min, nombre_max), valeur_alea(nombre_min, nombre_max)))
    while a[0] == a[1]:  # on refuse un carre
        a = ((valeur_alea(nombre_min, nombre_max), valeur_alea(nombre_min, nombre_max)), (valeur_alea(nombre_min, nombre_max), valeur_alea(nombre_min, nombre_max)))
    if random.randrange(2) == 0:
        b = (a[0], a[0])
    else:
        b = (a[1], a[1])
    if random.randrange(2) == 0:  # le carre est en premier
        return (b, a, 0, random.randrange(2))
    else:
        return (a, b, random.randrange(2), 0)
def valeurs_somme_prod():  # cree 3 fractions et un tuple de signes (+,*)
    while True:
        (base1, base2) = (valeur_alea(-13, 13), valeur_alea(-13, 13))
        lepgcd = pgcd(base1, base2)
        (base1, base2) = (base1 // lepgcd, base2 // lepgcd)
        if base1 != 1 and base2 != 1:
            break
    (n2, d2) = (base1 * valeur_alea(-10, 10), abs(base2 * valeur_alea(2, 10)))
    lepgcd = pgcd(n2, d2)
    (n2, d2) = (n2 // lepgcd, d2 // lepgcd)
    (n3, d3) = (base2 * valeur_alea(-10, 10), abs(base1 * valeur_alea(2, 10)))
    lepgcd = pgcd(n3, d3)
    (n3, d3) = (n3 // lepgcd, d3 // lepgcd)
    (n1, d1) = (base1 * valeur_alea(-10, 10), abs(pgcd(d2, base2 * valeur_alea(2, 10))))
    lepgcd = pgcd(n1, d1)
    (n1, d1) = (n1 // lepgcd, d1 // lepgcd)
    if randrange(2) == 0:
        s1 = "+"
    else:
        s1 = "-"
    if randrange(2) == 0:
        s2 = "*"
    else:
        s2 = ":"
    if s2 == "*":
        return ((n1, d1), (n2, d2), (n3, d3), (s1, s2))
    else:
        return ((n1, d1), (n2, d2), (d3, n3), (s1, s2))
def def_vals():
    lexp = [0, 1, 2, 0, 1, 2]
    expr = []
    for i in range(6):
        a = valeur_alea(-10, 10)
        e = lexp.pop(randrange(len(lexp)))
        expr.append([a, "x", e])
    return expr
def def_vals2():
    expr = []
    loper = ["+", "-", "\\times", "+", "-", "\\times", "+", "-"]
    for i in range(8):
        a = valeur_alea(-10, 10)
        e = randrange(3)
        o = loper.pop(randrange(len(loper)))
        expr.append([a, "x", e, o])
    return expr
def def_vals3():
    expr = []
    lsgn = ["+", "-", "+", "-"]
    for i in range(9):
        if i % 3 == 0:
            sgn = lsgn.pop(randrange(len(lsgn)))
            if i > 0 or sgn == "-":
                expr.append(sgn)
            expr.append(" (")
        elif i % 3 == 1:
            a = valeur_alea(-10, 10)
            e = randrange(3)
            expr.append([a, "x", e])
        else:
            a = valeur_alea(-10, 10)
            e = randrange(3)
            while e == expr[-1][2]:
                e = randrange(3)
            expr.append([a, "x", e])
            expr.append(") ")
    return expr
def valeurs_prod_parenth():  # cree 3 fractions et un tuple de signes (*,+)
    while True:
        (base1, base2) = (valeur_alea(2, 13), valeur_alea(2, 13))
        lepgcd = pgcd(base1, base2)
        (base1, base2) = (base1 // lepgcd, base2 // lepgcd)
        if base1 != 1 and base2 != 1:
            break
    while True:
        n2 = valeur_alea(-13, 13)
        lepgcd = pgcd(n2, base1)
        if lepgcd == 1:
            break
    while True:
        n3 = valeur_alea(-13, 13)
        lepgcd = pgcd(n3, base2)
        if lepgcd == 1:
            break
    while True:
        (n1, d1) = (valeur_alea(-10, 10), valeur_alea(2, 10))
        lepgcd = pgcd(n1, d1)
        if lepgcd != n1 and lepgcd != d1:
            break
    (n1, d1) = (n1 // lepgcd, d1 // lepgcd)
    if randrange(2) == 0:
        s1 = "*"
    else:
        s1 = ":"
    if randrange(2) == 0:
        s2 = "+"
    else:
        s2 = "-"
    return ((n1, d1), (n2, base1), (n3, base2), (s1, s2))
def valeurs_calcul_distr(nombre_min, nombre_max): 
    cpt = 0
    while True:
        cpt += 1
        # generation de 2 nombres
        nombre1 = valeur_alea(nombre_min, nombre_max)
        nombre2 = valeur_alea(nombre_min, nombre_max)
        # arrondi au premier chiffre et distance à cet arrondi  
        nombre1_arrondi = int(round( nombre1 , min( 1 - len(str(abs(nombre1))), -1) ))
        nombre1_distance = nombre1 - nombre1_arrondi
        nombre2_arrondi = int(round( nombre2 , min( 1 - len(str(abs(nombre2))), -1) ))
        nombre2_distance = nombre2 - nombre2_arrondi
        # on choisit de décomposer le nombre qui à la plus petite distance non nulle 
        if abs(nombre1_distance) <= abs(nombre2_distance) and abs(nombre1_distance)!= 0 and abs(nombre1)>=10 and abs(nombre2)!= 1:
            l = [ nombre1_arrondi, nombre1_distance, 0, nombre2 ]
            break
        elif abs(nombre1_distance) > abs(nombre2_distance) and abs(nombre2_distance)!= 0 and abs(nombre2)>=10 and abs(nombre1)!= 1:
            l = [ 0, nombre1, nombre2_arrondi, nombre2_distance ]
            break
        elif cpt > 50:
            l = [ 0, nombre1, 0, nombre2 ]
            break
    return ((l[0], l[1]), (l[2], l[3]))
def valeurs_type2(nombre_min, nombre_max):  # renvoie les valeurs pour obtenir un facteur commun.
    a = ((valeur_alea(nombre_min, nombre_max), valeur_alea(nombre_min, nombre_max)), (valeur_alea(nombre_min, nombre_max), valeur_alea(nombre_min, nombre_max)))
    while a[0] == a[1]:  # on refuse un carre
        a = ((valeur_alea(nombre_min, nombre_max), valeur_alea(nombre_min, nombre_max)), (valeur_alea(nombre_min, nombre_max), valeur_alea(nombre_min, nombre_max)))
    if random.randrange(2) == 0:
        while True:
            b = (a[random.randrange(2)], (valeur_alea(nombre_min, nombre_max), valeur_alea(nombre_min, nombre_max)))
            if b[0] != b[1]:
                break
    else:
        while True:
            b = ((valeur_alea(nombre_min, nombre_max), valeur_alea(nombre_min, nombre_max)), a[random.randrange(2)])
            if b[0] != b[1]:
                break
    (nega, negb) = (random.randrange(2), random.randrange(2))
    return (a, b, nega, negb)
def valeurs_equation(nombre_min, nombre_max):  # renvoie in tuple contenant ((a,b),(c,d)) avec a != c ou b != d (en valeur absolue)
    a = valeur_alea(nombre_min, nombre_max)
    b = valeur_alea(nombre_min, nombre_max)
    c = valeur_alea(nombre_min, nombre_max)
    d = valeur_alea(nombre_min, nombre_max)
    while abs(a) == abs(c) and abs(b) == abs(d):
        c = valeur_alea(nombre_min, nombre_max)
        d = valeur_alea(nombre_min, nombre_max)
    return ((a, b), (c, d))
def valeurs_dbldistr(pyromax):  # renvoie in tuple contenant ((a,b),(c,d)) avec a != c ou b != d (en valeur absolue)
    a = valeur_alea(-pyromax, pyromax)
    b = valeur_alea(-pyromax, pyromax)
    c = valeur_alea(-pyromax, pyromax)
    d = valeur_alea(-pyromax, pyromax)
    while abs(a) == abs(c) and abs(b) == abs(d):
        c = valeur_alea(-pyromax, pyromax)
        d = valeur_alea(-pyromax, pyromax)
    return ((a, b), (c, d))
def def_vals4():
    expr = []
    for i in range(9):
        a = valeur_alea(-10, 10)
        e = randrange(3)
        if i % 3 == 0:
            expr.append([a, "x", e])
            expr.append(" \,(")
        elif i % 3 == 1:
            expr.append([a, "x", e])
        else:
            while e == expr[-1][2]:
                e = randrange(3)
            expr.append([a, "x", e])
            expr.append(") ")
    return expr
def def_vals5():
    expr = []
    for i in range(8):
        a = valeur_alea(-10, 10)
        e = randrange(3)
        if i % 2 == 0:
            if i % 4 == 0:
                expr.append(" (")
            else:
                expr.append(" \,(")
            expr.append([a, "x", e])
        else:
            while e == expr[-1][2]:
                e = randrange(3)
            expr.append([a, "x", e])
            expr.append(") ")
            if i == 3:
                expr.append(["+", "+", "-"].pop(randrange(3)))
    return expr
def valeurs_quotient_frac():  # cree 4 fractions et un tuple de signes (+,+)
    while True:
        (n1, d1) = (valeur_alea(-10, 10), valeur_alea(2, 10))
        lepgcd = pgcd(n1, d1)
        if lepgcd != n1 and lepgcd != d1:
            break
    (n1, d1) = (n1 // lepgcd, d1 // lepgcd)
    while True:
        (n3, d3) = (valeur_alea(-10, 10), valeur_alea(2, 10))
        lepgcd = pgcd(n3, d3)
        if lepgcd != n3 and lepgcd != d3:
            break
    (n3, d3) = (n3 // lepgcd, d3 // lepgcd)
    (n2, n4) = (valeur_alea(1, 10), valeur_alea(1, 10))
    if randrange(2) == 0:
        s1 = "+"
    else:
        s1 = "-"
    if randrange(2) == 0:
        s2 = "+"
    else:
        s2 = "-"
    return ((n1, d1), (n2, 1), (n3, d3), (n4, 1), (s1, s2))
def valeurs_apb2(pyromax):  # renvoie un tuple contenant ((3,5),(3,5))
    a = valeur_alea(1, pyromax)
    b = valeur_alea(1, pyromax)
    return ((a, b), (a, b))
def valeur_quotient(nombre_min, nombre_max):
    (a, b) = (valeur_alea(nombre_min, nombre_max), valeur_alea(nombre_min, nombre_max))
    while pgcd(a, b) == b:
        (a, b) = (valeur_alea(nombre_min, nombre_max), valeur_alea(nombre_min, nombre_max))
    return (a // pgcd(a, b), b // pgcd(a, b))
def valeur_relatif(nombre_min, nombre_max):
    (a, b) = (valeur_alea(nombre_min, nombre_max), 1 )
    return (a, b)
def valeur_expression_trinome(nombre_min, nombre_max): 
    (a, b, c) = (valeur_alea(nombre_min, nombre_max), valeur_alea(nombre_min, nombre_max), valeur_alea(nombre_min, nombre_max))
    return ((a, b, c))
def valeurs_amb2(nombre_min, nombre_max):  # renvoie un tuple contenant ((3,-5),(3,-5))
    a = valeur_alea(nombre_min, nombre_max)
    b = valeur_alea(-nombre_max, -nombre_min)
    return ((a, b), (a, b))
def valeurs_puissances():  # renvoie un tuple contenant les valeurs pour les deux exercices sur les puissances
    from math import floor, log10
    (max, emax) = (10, 2)
    while True:
        (b1, b2) = (valeur_alea(2, max), valeur_alea(2, max))
        (b1, b2) = (b1 / pgcd(b1, b2), b2 / pgcd(b1, b2))
        if b1 != 1 and b2 != 1:
            break
    while True:
        (n1, n2) = ((b1 * valeur_alea(2, max)) * 10 ** randrange(-emax,
                    emax), (b2 * valeur_alea(2, max)) * 10 ** randrange(-emax,
                    emax))
        n3 = ((b1 * b2) * choice((2, 4, 5, 8))) * 10 ** randrange(-emax,
                emax)
        if int(floor(log10(((n1 * n2) * 1.) / n3))) != 0 and n1 != 1 and \
            n2 != 1 and n3 != 1:
            break
    (e1, e2, e3, e4) = (valeur_alea(-10, 10), valeur_alea(-10, 10),
                        valeur_alea(2, 10), valeur_alea(2, 5))
    a = verifie_type((n1, n2, n3, e1, e2, e3, e4))
    while True:
        (b1, b2) = (valeur_alea(2, max), valeur_alea(2, max))
        (b1, b2) = (b1 / pgcd(b1, b2), b2 / pgcd(b1, b2))
        if b1 != 1 and b2 != 1:
            break
    (n1, n2) = ((b1 * valeur_alea(2, max)) * 10 ** randrange(-emax, emax +
                1), (b2 * valeur_alea(2, max)) * 10 ** randrange(-emax,
                emax + 1))
    n3 = ((b1 * b2) * choice((1, 2, 4, 5, 8))) * 10 ** randrange(-emax,
            emax + 1)
    (e1, e2, e3, e4) = (valeur_alea(-10, 10), valeur_alea(-10, 10),
                        valeur_alea(-10, -2), valeur_alea(2, 5))
    b = verifie_type((n1, n2, n3, e1, e2, e3, e4))
    return (a, b)
def valeurs_amb2(pyromax):  # renvoie un tuple contenant ((3,-5),(3-5))
    a = valeur_alea(1, pyromax)
    b = valeur_alea(-pyromax, -1)
    return ((a, b), (a, b))