Exemplo n.º 1
0
def suma_punktow(A, B, p, x1, y1, x2, y2):
    # P + 0 = P
    if x1 == 'e' and y1 == 'e':
        return x2, y2
    elif x2 == 'e' and y2 == 'e':
        return x1, y1

    # P + Q = R
    if x1 != x2:
        l = (((y2 - y1) % p) * lab1.odwrotnosc((x2 - x1) % p, p)) % p
        x3 = (lab1.efektywne_potegowanie(l, 2, p) - (x1 % p) - (x2 % p)) % p
        y3 = (l * (x1 - x3) - y1) % p
        return x3, y3

    # P + P = 2P
    if x1 == x2 and y1 == y2:
        l = ((((3 * lab1.efektywne_potegowanie(x1, 2, p) % p) + A) % p) *
             (lab1.odwrotnosc(2 * y1, p))) % p
        x3 = (lab1.efektywne_potegowanie(l, 2, p) - (x1 % p) - (x2 % p)) % p
        y3 = (l * (x1 - x3) - y1) % p
        return x3, y3

    # P + -Q = 0
    if x1 == x2 and y1 == -y2:
        return 'e', 'e'
Exemplo n.º 2
0
def czy_punkt_nalzey(A, B, p, x, y):
    y_kwadrat = rownanie_krzywej(A, B, p, x)

    if y_kwadrat == lab1.efektywne_potegowanie(y, 2, p):
        return True
    else:
        return False
Exemplo n.º 3
0
def punkt_na_krzywej(A, B, p):
    delta = deltaE(A, B, p)

    if delta != 0 and p % 4 == 3:
        while True:
            x = random.randint(0, p - 1)
            y_kwadrat = rownanie_krzywej(A, B, p, x)

            if czy_pierwiastek_kwadratowy(y_kwadrat, p):
                y = lab1.efektywne_potegowanie(y_kwadrat, (p + 1) // 4, p)
                break

        return x, y
Exemplo n.º 4
0
def deltaE(A, B, p):
    return (4 * lab1.efektywne_potegowanie(A, 3, p) +
            27 * lab1.efektywne_potegowanie(B, 2, p)) % p
Exemplo n.º 5
0
def czy_pierwiastek_kwadratowy(x, p):
    if lab1.efektywne_potegowanie(x,
                                  (p - 1) // 2, p) and lab1.pierwsza_Fermat(p):
        return True
    else:
        return False
Exemplo n.º 6
0
def rownanie_krzywej(A, B, p, x):
    return (lab1.efektywne_potegowanie(x, 3, p) + (A * x) + B) % p