from euclides import *

def inverso(a,n):
    """Calcula a forma reduzida
    dor inverso de a modulo n,
    se existir, ou retorna False
    caso contrario"""
    mdc, alfa, beta= euclides_estendido(a,n)
    if mdc != 1:
        return False
    if alfa < 0:
        return alfa + n
    return alfa

def teorema_chinês(lista_de_pares):
    """ ... """
    #calculando P
    P = 1

    for a,n in lista_de_pares:
        P *= n
    lista_dos_M = []
    lista_dos_b = []

    for a,n in lista_de_pares:
        M_atual = P//n
        list.append(lista_dos_M, M_atual)
        list.append(lista_dos_b, inverso(M_atual,n))

    soma = 0
    for índice in range(len(lista_de_pares)):
        a_atual = lista_de_pares[índice][0]
        M_atual = lista_dos_M[índice]
        b_atual = lista_dos_b[índice]
        soma += a_atual * M_atual * b_atual
        soma %= P
    return soma
