def tex_den_com1(a, sgn):  # renvoie l'ecriture au format tex de la somme des fractions au meme denominateur
    if not isinstance(a, tuple):  # les deux fractions ont deja le meme denominateur
        return ""
    else:
        (sgn1, sgn2) = (signe(a[0][1]), signe(a[1][1]))
        b = (a[0][0] * sgn1, a[0][1] * sgn1, sgn, a[1][0] * sgn2, a[1][1] * sgn2)
        return "\dfrac{%s}{%s}%s\\dfrac{%s}{%s}" % b
def decomp_prod(a, b):  #renvoie un tuple contenant les deux fractions apres simplification et un tuple contenant les nb par lesquels on simplifie le produit de fractions
    c = pgcd(a[0], b[1])
    d = pgcd(a[1], b[0])
    sgn1 = signe(a[1])
    sgn2 = signe(b[1])
    if c == d == 1:
        return (((sgn1 * a[0]) // c, (sgn1 * a[1]) // d), ((sgn2 * b[0]) // d, (sgn2 * b[1]) // c), '')
    else:
        return (((sgn1 * a[0]) // c, (sgn1 * a[1]) // d), ((sgn2 * b[0]) // d, (sgn2 * b[1]) // c), (c, d))
def tex_den_com0(a, b, c, sgn):  # renvoie l'ecriture au format tex de la mise au meme denominateur des fraction a et b
    if not isinstance(c, tuple):  # les deux fractions ont deja le meme denominateur
        return ""
    else:
        (sgn1, sgn2) = (signe(a[1]), signe(b[1]))
        if c[0] == 1:
            if c[1] == 1:
                d = (a[0] * sgn1, a[1] * sgn1, b[0] * sgn2, b[1] * sgn2)
                return ""
            else:
                d = (a[0] * sgn1, a[1] * sgn1, sgn, b[0] * sgn2, c[1], b[1] * sgn2, c[1])
                return "\dfrac{%s}{%s}%s\\dfrac{%s_{\\times %s}}{%s_{\\times %s}}" % d
        elif c[1] == 1:
            d = (a[0] * sgn1, c[0], a[1] * sgn1, c[0], sgn, b[0] * sgn2, b[1] * sgn2)
            return "\dfrac{%s_{\\times %s}}{%s_{\\times %s}}%s\\dfrac{%s}{%s}" % d
        else:
            d = (a[0] * sgn1, c[0], a[1] * sgn1, c[0], sgn, b[0] * sgn2, c[1], b[1] * sgn2, c[1])
            return "\dfrac{%s_{\\times %s}}{%s_{\\times %s}}%s\\dfrac{%s_{\\times %s}}{%s_{\\times %s}}" % d
def produit(a, b):  #renvoie un tuple contenant le produit des fractions a et b
    sgn1 = signe(a[1] * b[1])
    return ((sgn1 * a[0]) * b[0], (sgn1 * a[1]) * b[1])
def tex_dev1(
    a, bplus=0, bpar=0, bpn=0
):  # renvoi le developpement (a)²+2*a*b+(b)², (a)²-2*a*b+(b)², (a)²-(b)² ou a*c+a*d+b*c+b*d

    # a est de la forme ((3, 2)(3, 2)) pour (3x+2)(3x+2)

    (ca, cb, cc, cd) = (a[0][0], a[0][1], a[1][0], a[1][1])  # coefficients a, b, c et d
    if a[0] == a[1]:  # (a+b)² ou (a-b)²
        if signe(ca) == signe(cb):  # (a+b)²
            (ca, cb) = (abs(ca), abs(cb))
            texte = "%s^2+2\\times %s\\times %s+%s^2" % (
                tex_coef(ca, "x", bpc=1),
                tex_coef(ca, "x", bpn=1),
                tex_coef(cb, "", bpn=1),
                tex_coef(cb, "", bpn=1, bpc=1),
            )
            if bpar:
                return "(" + texte + ")"
            else:
                return texte
        else:

            # (a-b)²

            (ca, cb) = (abs(ca), abs(cb))
            texte = "%s^2-2\\times %s\\times %s+%s^2" % (
                tex_coef(ca, "x", bpc=1),
                tex_coef(ca, "x", bpn=1),
                tex_coef(cb, "", bpn=1),
                tex_coef(cb, "", bpn=1, bpc=1),
            )
            if bpar:
                return "(" + texte + ")"
            else:
                return texte
    if abs(ca) == abs(cc) and abs(cb) == abs(cd):  # (a+b)(a-b) ou (a+b)(-a+b)
        if ca == cc:  # (a+b)(a-b)
            texte = "%s^2-%s^2" % (tex_coef(ca, "x", bpc=1), tex_coef(abs(cb), ""))
            if bpar:
                return "(" + texte + ")"
            else:
                return texte
        else:

            # (a+b)(-a+b)

            texte = "%s^2-%s^2" % (tex_coef(cb, "", bpn=1), tex_coef(abs(ca), "x", bpc=1))
            if bpar:
                return "(" + texte + ")"
            else:
                return texte
    else:

        # (a+b)(c+d)

        if cc == 0 and cd == 1:
            texte = "%s%s" % (tex_coef(ca, "x", bplus=bplus), tex_coef(cb, "", bplus=ca != 0))
            if bpar:
                return "(" + texte + ")"
            else:
                return texte
        elif ca == 0 or cb == 0 or cc == 0 or cd == 0:
            if ca == 0:
                texte = "%s\\times %s+%s\\times %s" % (
                    tex_coef(cb, "", bpn=bpn),
                    tex_coef(cc, "x", bpn=1),
                    tex_coef(cb, "", bpn=1),
                    tex_coef(cd, "", bpn=1),
                )
            elif cb == 0:
                texte = "%s\\times %s+%s\\times %s" % (
                    tex_coef(ca, "x", bpn=bpn),
                    tex_coef(cc, "x", bpn=1),
                    tex_coef(ca, "x", bpn=1),
                    tex_coef(cd, "", bpn=1),
                )
            elif cc == 0:
                texte = "%s\\times %s+%s\\times %s" % (
                    tex_coef(cd, "", bpn=bpn),
                    tex_coef(ca, "x", bpn=1),
                    tex_coef(cd, "", bpn=1),
                    tex_coef(cb, "", bpn=1),
                )
            else:
                texte = "%s\\times %s+%s\\times %s" % (
                    tex_coef(cc, "x", bpn=bpn),
                    tex_coef(ca, "x", bpn=1),
                    tex_coef(cc, "x", bpn=1),
                    tex_coef(cb, "", bpn=1),
                )
            return texte
        else:
            texte = "%s+%s+%s+%s" % (
                tex_coef(ca * cc, "x^2", bpn=bpn),
                tex_coef(ca * cd, "x", bpn=1),
                tex_coef(cb * cc, "x", bpn=1),
                tex_coef(cb * cd, "", bpn=1),
            )
            if bpar:
                return "(" + texte + ")"
            else:
                return texte
def inverse(a):  # renvoie l'inverse de la fraction a
    sgn1 = signe(a[0])
    return (sgn1 * a[1], sgn1 * a[0])
def den_com1(a, b):  # renvoie un tuple contenant les fractions a et b avec le meme denominateur
    c = den_com0(a, b)
    sgn1 = signe(a[1])
    sgn2 = signe(b[1])
    return (((a[0] * c[0]) * sgn1, (a[1] * c[0]) * sgn1), ((b[0] * c[1]) * sgn2, (b[1] * c[1]) * sgn2))