def __init__(self,a,b,f):
     assert elliptic_nonsingular(a,b,f), "Elliptic curves must be non-singular"
     assert is_prime(f), "f must be prime"
     self.a = a
     self.b = b
     self.f = f
     self.identity = Elliptic_Point(float('inf'),float('inf'),self)
Beispiel #2
0
def kronecker_symbol(a, n):
    """The Kronecker Symbol"""
    if n == 2:
        if a % 2 == 0:
            return 0
        if a % 8 == 1 or a % 8 == 7:
            return 1
        return -1
    elif n == 0:
        if a == 1 or a == -1:
            return 1
        return 0
    elif n == -1:
        if a < 0:
            return -1
        return 1
    elif n == 1 or a == 1:
        return 1
    elif is_prime(n):
        return legendre_symbol(a, n)
    else:
        fac = prime_factorization(n)
        if n < 0:
            out = kronecker_symbol(a, -1)
            for f in fac:
                out *= kronecker_symbol(a, f)
            return out
        else:
            out = kronecker_symbol(a, 1)
            for f in fac:
                out *= kronecker_symbol(a, f)
            return out
Beispiel #3
0
def legendre_symbol(a, p):
    """The Legendre Symbol"""
    assert is_prime(p)
    assert p != 2
    out = pow(a, (p - 1) // 2, p)
    if out == 1:
        return 1
    if out == 0:
        return 0
    else:
        return -1
Beispiel #4
0
def egyptian_form_prime(rational):
    N = rational.n
    D = rational.d
    assert N < D

    if N == 2 and is_prime(D):
        A = Rational(2, D + 1)
        B = Rational(2, D * (D + 1))
        return [A, B]
    else:
        return []
Beispiel #5
0
def shamir(S, n, k, p):
    assert p > S, "p must be strictly greater than S"
    assert p > n, "p must be strictly greater than n"
    assert is_prime(p), "p must be prime"

    A = [S] + [randint(1, p) for i in range(k - 1)]

    PA = Polynomial(A, p)

    ps = [(i, PA.evaluate(i)) for i in range(1, n + 1)]

    return ps
Beispiel #6
0
def quad_residue(q,m):
    """Check if q is a quadratic residue modulo m"""
    if is_prime(m) and gcd(q,m) == 1:
        e = q**((m-1)//2) % m
        if e == 1:
            return True
        return False
    else:
        for i in range(m):
            if i**2 % m == q:
                return True
        return False