Exemple #1
0
def sqrt_mod(a,p):
    """
    Calcula la raiz cuadrada modular de a módulo p
    
    Args:
        a(int): Entero
        p(int): Entero primo
        
    Returns:
        r(int): Raiz de a modulo p        
        
    Examples:
        sqrt_mod(319,353)
        242
    """
    
    if jacobi(a,p) == -1:
        return -1
        
        
    n=1
    
    while jacobi(n,p) != -1:
        n+=1
        
    
    u=0
    s=p-1
    while s%2==0:
        u=u+1
        s=s//2
    print(u,s);
        
    if u == 1:
        r=exp_mod(a,(p+1)/4,p)
    elif u >= 2:
        r=exp_mod(a,(s+1)/2,p)
        b=exp_mod(n,s,p)
        j=0
        
        while j<= u-2:
            base = (inverso_mod(a,p)*r*r)%p
            exp = exp_mod(2,u-2-j,p)  
            if exp_mod(base,exp,p) == (-1%p):
                r=(r*b)%p
            b=(b*b)%p
            j+=1
            
      
    return r
def is_prime_Miller_Rabin(n, t=1):
    # n - 1 = t * 2^s
    s = 0
    t = n - 1
    while t % 2 == 0:
        s = s + 1
        t = t // 2
    # print("s = %d, t = %d"%(s, t))
    flag = True
    for _ in range(t):
        b = random.randint(2, n - 1)
        r = exp_mod(b, t, n)
        if r == 1:
            break
        i = 1
        while r != (n - 1):
            if i == s:     
                flag = False
                break
            else:
                r = (r * r) % n
                i += 1
    if flag:
        # print("根据Miller-Rabin素性检验,%d为素数"%n)
        return 1
    else:
        # print("根据Miller-Rabin素性检验,%d为合数"%n)
        return 0
Exemple #3
0
def es_primo(p,k=7):
    """
    Esta función comprueba si el número dado es primo o no mediante el algoritmo de Miller-Rabin.

    Args:
        p(int): Número el cual comprobaremos si es primo.
        k(int): Número de iteraciones del algoritmo. Por defecto se incializa a 7.

    Returns:
        bool: True si es primo, False si no lo es.

    Example:
        >>es_primo(123456789101119)
        True
    """
    fin_bucle=True

    if(p in [2,3,5,7,11]):
        return True
    elif(p<11):
        return False#Si no esta contenido en la lista anterior y es menor que el último, no es primo
    if(p%2 != 0):
        s=0
        d=p-1
        while d%2==0:
            s=s+1
            d=d//2

        for i in range(0,k):
            a = random.randint(2,p-1)
            x = exp_mod(a,d,p)
            if(x!=1 and x!=p-1):
                for r in range(1,s):
                    x = exp_mod(x,2,p)
                    if(x%p==1):
                        return False #Es par
                    elif(x%p==p-1):
                        fin_bucle=False
                        break
                if fin_bucle:
                    return False#No encuentra un -1
        return True #Probablemente primo
    else:
        return False #Porque es par
def ord_of_am(a, m):
    # a,m需互素
    if ext_gcd(a, m)[0] == 1:
        euler_ = euler(m)
        for _ in range(1, euler(m)):
            # 指数整除euler(m)
            if euler_ % _ == 0:
                mod = exp_mod(a, _, m)
                if mod == 1:
                    return _
        return euler(m)
def is_prime_Fermat(n, t=1):
    flag = True
    for _ in range(t):
        b = 2
        while ext_gcd(b, n)[0] != 1:
            b = random.randint(3, n - 1)
        r = exp_mod(b, n - 1, n)
        if r != 1:   
            flag = False
    if flag:
        # print("根据Fermat素性检验,%d为素数"%n)
        return 1
    else:
        # print("根据Fermat素性检验,%d为合数"%n)
        return 0
def is_prime_Solovay_Stassen(n, t=1):
    flag = True
    for _ in range(t):    
        b = random.randint(2, n - 1)
        r = exp_mod(b, (n - 1)//2, n)
        # print("b = %d,r = %d"%(b, r))
        if r == 1 or r == (n - 1):
            s = Jacob(b, n)
            # print("s = %d", s)
            if r != s and r != (s + n):
                flag = False
        else:
            flag = False
    if flag:
        # print("根据Soloway-Strassen素性检验,%d为素数"%n)
        return 1
    else:
        # print("根据Soloway-Strassen素性检验,%d为合数"%n)
        return 0
Exemple #7
0
def legendre(a,p):
    a = a % p
    exponent = 0
    if (a == 0):
        return 0
    if (p == 2):
        return 1
    if (a == 1):
        return 1
    if (a == -1):
        exponent = (p - 1) // 2
        if(exponent % 2 == 0):
            return 1
        else: 
            return -1
    exponent = (p - 1) // 2
    flag = exp_mod(a, exponent, p)
    if (flag == 1):
        return 1
    else:
        return -1
Exemple #8
0
import socket
import exp_mod

puerto = raw_input("puerto: ")
n = raw_input("n: ")
g = raw_input("g: ")
x = raw_input("x: ")

tempa = exp_mod.exp_mod(long(g),long(x),long(n) )
cat1= n+','+g+','+str(tempa)

miSocket = socket.socket( socket.AF_INET, socket.SOCK_STREAM )
miSocket.connect( ("", int(puerto) ) )

print "[ enviando: " + cat1 + "]"
miSocket.send(cat1)	

data, server = miSocket.recvfrom( 100 )

print data
clave = exp_mod.exp_mod(long(data),long(x),long(n))


print clave

	


#miSocket.close()
Exemple #9
0
b=244

print("Ejercicio 2. Inverso modular")
print("Parámetros: a=",a," b=",b)
print("Solucion: ",inverso_mod(a,b))
t = timeit.Timer(lambda: inverso_mod(a,b))
print("Tiempo de ejecución medio(",n_ejec,"ejecuciones): ",t.timeit(n_ejec)/n_ejec)
print("---------------------------------------------------------")

a=5
b=596
n=1234

print("Ejercicio 3. Exponenciación modular")
print("Parámetros: a=",a," b=",b,"n=",n)
print("Solucion: ",exp_mod(a,b,n))
t = timeit.Timer(lambda: exp_mod(a,b,n))
print("Tiempo de ejecución medio(",n_ejec,"ejecuciones): ",t.timeit(n_ejec)/n_ejec)
print("---------------------------------------------------------")

a=123456789101119

print("Ejercicio 4. Miller-Rabbin")
print("Parámetros: a=",a)
print("Solucion: ",es_primo(a))
t = timeit.Timer(lambda: es_primo(a))
print("Tiempo de ejecución medio(",n_ejec,"ejecuciones): ",t.timeit(n_ejec)/n_ejec)
print("---------------------------------------------------------")

n=113
a=3
Exemple #10
0
import socket
import exp_mod

puerto = raw_input("puerto: ")
y = raw_input("y: ")

print "[ Escuchando::::: ]"

miSocket = socket.socket( socket.AF_INET, socket.SOCK_STREAM )
miSocket.bind( ("", int(puerto) ) )
miSocket.listen( 1 )

while 1:
	channel, details = miSocket.accept()
	recibido=channel.recv(1024)
 	print "Se\ ha conectado %s" % (str(details))
	
	#0,1,2	
	#n,g,g^x mod n
	val= recibido.split(",")	
	print val

	env=exp_mod.exp_mod(long(val[1]),long(y),long(val[0]) )	
	print str(env) 	
	channel.send(str(env))
	
	clave = exp_mod.exp_mod(long(val[2]),long(y),long(val[0]))	
	print clave

	#channel.close()