Blame | Last modification | View Log | Download | RSS feed
def modular_sqrt(a, p):'''Finds the square root x^2 = a (mod p) and returns x'''''' See http://www.math.vt.edu/people/brown/class_homepages/shanks_tonelli.pdf'''if Jacobi_Symbol(a, p) != 1:return 0elif a == 0:return 0elif p == 2:return pelif p % 4 == 3:return (a**((p+1)/4)) % ps = p - 1e = 0while s % 2 == 0:s /= 2e += 1n = 2while Jacobi_Symbol(n, p) != -1:n += 1x = (a**((s+1)/2)) % pb = (a**s) % pg = (n**s) % pr = ewhile True:t = bm = 0for m in range(r):if t == 1:breakt = (t**2) % pif m == 0:return xgs = (g**(2 ** (r - m - 1))) % pg = (gs * gs) % px = (x * gs) % pb = (b * g) % pr = mdef Jacobi_Symbol(a, p):ls = (a**((p - 1) // 2)) % preturn -1 if ls == p - 1 else lsif __name__ == '__main__':print(modular_sqrt(2,113))print(modular_sqrt(19,4481))print(modular_sqrt(191,1009))