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)
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
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
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 []
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
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