Antes de hablar acerca del símbolo de jacobi es necesario hablar acerca del símbolo de Legendre , ya que esta es una generalización de este.
Símbolo de Legendre:
Sean «p» un número primo e impar, «a» un número entero positivo menor que «p». Entonces el símbolo de Legendre (a/p) se define por:
De acuerdo con la definición anterior podemos notar que es posible tener un conjunto de residuos cuadráticos , denotados por Qp,cuyo valor es 1.
Ejemplo:
Como ya mencione antes Jacobi es una generalización de Legendre.
Jacobi se define como:
Existe un algoritmo de tiempo polinomial que computa el símbolo de Jacobi (a/n) , siempre que “n” es un número impar grande mayor que l y «a» es un numero que va desde cero hasta «n-1».
Algoritmo:
Función Exponencial , necesario para hallar el Símbolo de Jacobi
Func_exp(x) cont=0 Mientras (x mod 2 == 0) hacer x=x/2 cont=cont+1 Fin mientras retornar (cont)
Función Jacobi:
IMPLEMENTACIÓN:
Función Exponencial:
public int funcion_exponencial(int a) { int c=0; while(a%2==0) { a=a/2; c++; } return c; }
Función para calcular el símbolo de jacobi:
public int Opjacobi(int a , int n) { int a1,e,s = 0,n1; if(a==0) { return 0; } if(a==1) { return 1; } e=funcion_exponencial(a); a1=(int) (a/Math.pow(2,e)); // Asignando valores if(e%2==0) { s=1; } else { if(((n-1)%8==0)||((n-7)%8==0)) { s=1; } else { if(((n-3)%8==0)||((n-5)%8==0)) { s=-1; } } } //Cambiando Signo if(((n-3)%4==0)&&((a1-3)%4==0)) { s=-1*s; } n1=n%a1; if(a1==1) { return s; } else { return s*Opjacobi(n1,a1); } }
0 comentarios: