You are on page 1of 21

INSTITUTO POLITCNICO

NACIONAL
ESCUELA SUPERIOR DE CMPUTO
LGEBRA LINEAL
PRACTICA 1: SISTEMAS DE ECUACIONES
LINEALES
INTEGRANTES:
MORA GUARDADO DANIEL
SORIA ZIGA BRIAN ISAAC
SANTOYO LPEZ OSCAR SAID
GRUPO: 1CM2
PROFESOR: IVN GIOVANNY MOSSO GARCA

CLCULO DEL INVERSO MULTIPLICATIVO MODULAR


El campo finito de orden p es un conjunto de elementos = {0, 1, 2,
1} y dos
operaciones

la

+ =
+ y

suma

el

producto

modular

definidas

como:

=
. En esta introduccin nos concentraremos en

explicar cmo se obtiene el inverso multiplicativo tal que al hacer la operacin:

1 = 1( ).
El multiplicador modular inverso de un entero n mdulo p es un entero m tal que
n-1 m (mod p)
Esto significa que es el inverso multiplicativo en el anillo de los enteros mdulo p.
Es equivalente a
mn 1 (mod p)
El multiplicador inverso de n mdulo p existe si y slo si n y p son coprimos.
Si existe el multiplicador modular inverso de n mdulo p, se puede definir la
operacin de divisin entre n mdulo p mediante la multiplicacin por el inverso.
Para realizar el calculo del inverso multiplicativo se utiliza un algoritmo llamado:
ALGORITMO DE EUCLIDES O ALGORITMO EUCLIDIANO.
A continuacin explicare en que consiste este algoritmo.
El multiplicador modular inverso de n mdulo p se puede obtener mediante
el Algoritmo de Euclides. En particular, invocando el algoritmo extendido de Euclides
con n y p como argumentos se obtiene una tripla (x,y,mcd(n,p)) tal que

Si MCD(n, p)=1 entonces

de donde

es el inverso modular de n mdulo p. Si el MCD(n,p) 1 entonces no

existe el modular inverso. Este algoritmo se ejecuta en un tiempo O(log(p)2)


(asumiendo que |n|<p).

Por ejemplo, supongamos que queremos calcular el inverso de 117 mdulo 244.
Por tanto con nuestra nomenclatura p=117 y n=244 Lo primero que hacemos es
aplicar el algoritmo de Euclides para verificar que mcd(n,p)=1. Posteriormente
aprovechamos los pasos intermedios para hallar el mcd(n,p) en trminos de n y p y
as obtener el inverso de n que notaremos por n-1.

Paso 1: Como n > p entonces podemos expresar n como n=qp+r. Es decir


244=2*117+10

Paso 2: Como 117>10 entonces 117=11*10+7

Paso 3: Como 10>7 entonces 10=1*7+3

Paso 4: Como 7>3 entonces 7=2*3+1

Paso 5: Como 3>1 entonces 3=1*3+0

De esta forma demostramos que mcd(244,117)=1

Paso 6: Del paso 4 despejo el resto (el nmero que queda a la derecha de la
suma), quedando 1=7-3*2

Paso 7: Del paso 3 despejo el resto quedando 3=10-1*7. Si sustituimos en la


ecuacin del paso 6 tenemos 1=7-(10-1*7)*2=-2*10+3*7

Paso 8: Del paso 2 despejo el resto quedando 7=117-11*10. Si sustituimos en


la ecuacin del paso 7 tenemos 1=-2*10+3(117-11*10)=3*117-35*10

Paso 9: Del paso 1 despejo el resto quedando 10=244-2*117. Si sustituimos en


la ecuacin del paso 8 obtenemos 1=3*117-35*(244-2*117)=-35*244+73*117.
De esta ecuacin podemos decir que n-1=73 que es lo que queramos calcular.

Paso 10: Si n-1 es negativo, el inverso n-1 se recalcula como n-1 + p.

EL DISEO
Para empezar el diseo del algoritmo empezamos programando el algoritmo de
Gauss-Jordan con base decimal en donde explicaremos algunas partes del cdigo.
El cdigo se encargaba de revisar si el pivote era diferente de cero ya que si s lo
era debamos cambiar las filas.
if (A[i][i]==0)
{
for(s=i+1;s<=n+1;s++)
{
if (A[s][i]!=0)
{
aux=A[i][s-1];
A[i][s-1]=A[i+1][s-1];
A[i+1][s-1]=aux;
aux=B[i];
B[i]=B[i+1];
B[i+1]=aux;
}
}
}
Y en caso que no fuera 0 entonces hacamos que el pivote fuera 1 para poder usar
el algoritmo y el cdigo quedo as.
cte=A[i][i];

for(j=0;j<n;j++)
{
A[i][j]=A[i][j]/cte;
}
B[i]=B[i]/cte;
Ya que tenamos el pivote de alguna fila, se las restbamos a las dems, para que
en la columna del pivote, el pivote fuera el nico con valor a 1 y los dems a 0.
for(j=i+1;j<n;j++)
{
cte=A[j][i];
for(k=0;k<n;k++)
{
A[j][k]=A[j][k]-cte*A[i][k];
}
B[j]=B[j]-cte*B[i];
}
}
Pero despus de hacer eso y encontrar los pivotes nos quedaba una matriz
triangular superior y debamos hacer que quedara la identidad as que ahora
restamos de abajo hacia arriba para poder llegar a la identidad.
for(i=n;i>=1;i--)
{
for(j=i-1;j>=0;j--)
{

cte=A[j][i];
A[j][i]=A[j][i]-cte*A[i][i];
B[j]=B[j]-cte*B[i];
}
}
Y entonces el cdigo de gauss-Jordan quedo de la siguiente manera.
#include<stdio.h>
#include<stdlib.h>
#include<math.h>
main()
{
int n,a,b;
float A[10][10],B[10],cte,aux;
//Se piden las incgnitas y trminos indp.
printf("\n\t\tMETODO DE GAUSS-JORDAN\n");
printf("\nIngrese el numero de ecuaciones del sistema: ");
scanf("%i",&n);
printf("Ingrese los coeficientes\n");
for(a=0;a<n;a++)
{
for(b=0;b<n;b++)
{
printf("Coef. (%i,%i) ",a+1,b+1);

scanf("%f",&A[a][b]);
}
printf("Termino independiente Ec. %i: ",a+1);
scanf("%f",&B[a]);
}
//Metodo Gauss-Jordan
int i,s,j,k;
for(i=0; i<n; i++);
{
//Se Comprueba que el pivote se dif. de 0
if (A[i][i]==0)
{
for(s=i+1;s<=n+1;s++)
{
if (A[s][i]!=0)
{//Intercambio de renglon
aux=A[i][s-1];
A[i][s-1]=A[i+1][s-1];
A[i+1][s-1]=aux;

aux=B[i];
B[i]=B[i+1];
B[i+1]=aux;

}
}
}
//Se normaliza Renglon pivote
cte=A[i][i];
for(j=0;j<n;j++)
{
A[i][j]=A[i][j]/cte;
}
B[i]=B[i]/cte;

//Continua el algoritmo de eliminacin gaussiana


for(j=i+1;j<n;j++)
{
cte=A[j][i];
for(k=0;k<n;k++)
{
A[j][k]=A[j][k]-cte*A[i][k];
}
B[j]=B[j]-cte*B[i];
}
}
//se realiza la eliminacin inversa

for(i=n;i>=1;i--)
{
for(j=i-1;j>=0;j--)
{
cte=A[j][i];
A[j][i]=A[j][i]-cte*A[i][i];
B[j]=B[j]-cte*B[i];
}
}

//Impresin de resultados
printf("\n\n SOLUCION DEL SISTEMA\n ");
for(k=0;k<n;k++)
{
printf("\n x[%d] = %1.4f",k+1,B[k]);
}
printf("\n");
system("pause");
}

IMPLEMENTACIN
Usando el diseo de Gauss Jordan, necesitbamos implementarlo en campos
finitos y tuvimos que hacer algunas modificaciones.
Ahora el neutro multiplicativo tuvimos que apoyarnos con el algoritmo extendido de
Euclides el cual quedo de la siguiente manera:
scanf("%ld %ld",&a,&b) != EOF
inv(a,b,&d,&x,&y);
printf("x= %ld y= %ld d= %ld \n",x,y,d);
if(x<0)
x=b+x;
printf("El inverso multiplicativo de %ld en modulo %ld es: %ld",a,b,x);

return 0;
}

void inv(long a,long b,long *d,long *x,long *y)


{

long x1,y1;
if(b==0)
{

*d=a;
*x=1;
*y=0;
}
else
{
inv(b,a%b,d,x,y);
x1=*x;
y1=*y;
*x=y1;
*y=x1-(a/b)*y1;
}
}
El cual nos arrojaba el neutro aditivo y ahora tenamos que implementarlo en el
cdigo que ya tenamos de manera que para obtener el pivote quedo de la siguiente
manera:
inv_mul(A[i][i],p,&d,&x,&y);
if(x<0)
x=b+x;
cte=x;
for(j=0;j<n;j++)
{
A[i][j]=(A[i][j]*cte)%p;

// printf("%i",A[i][j]);
}
B[i]=(B[i]*cte)%p;
En el llamamos la funcin para obtener el neutro multiplicativo y as multiplicarlo por
toda la fila.
Despus tuvimos que modificar la resta de filas para obtener la identidad, pero en
este caso fue ms sencillo y quedo de la siguiente manera:

for(j=i+1;j<n;j++)
{
cte=A[j][i];
for(k=0;k<n;k++)
{
if (A[j][k] - (cte*A[i][k])%p < 0)
aux= p + (A[j][k] - (cte*A[i][k])%p);
else
aux = A[j][k] - (cte*A[i][k])%p;

A[j][k]=( aux )%p;


}
if (B[j]-(cte*B[i])%p < 0)
aux = p + B[j]-(cte*B[i])%p;
else

aux= B[j]-(cte*B[i])%p;
B[j]=(aux)%p;
}
}
for(i=n;i>=1;i--)
{
for(j=i-1;j>=0;j--)
{
cte=A[j][i];
if (A[j][i]-(cte*A[i][i])%p < 0)
aux= p + (A[j][i]-(cte*A[i][i])%p);
else
aux=A[j][i]-(cte*A[i][i])%p ;
A[j][i]=(aux)%p;
if (B[j]-(cte*B[i])%p < 0)
aux= p + (B[j]-(cte*B[i])%p);
else
aux = B[j]-(cte*B[i])%p ;

B[j]=(aux)%p;
}
}

Como vemos, solo fue cuestin de obtener los mdulos pero como en C no se
obtiene el mdulo de numero negativos, pusimos unas condiciones y as poder
obtener el modulo.
Entonces el cdigo quedo de la siguiente manera.

CDIGO
#include<stdio.h>
#include<stdlib.h>
#include<math.h>

long a,p,d,x,y; // variables globales para algoritmo Euclides


void inv_mul(long a,long b,long *d,long *x,long *y);
main()
{
int n,a,b,p;
int A[10][10],B[10],cte,aux;
//Se piden las incgnitas
printf("\n\t\tMETODO DE GAUSS-JORDAN\n");
printf("\nIngrese el numero de ecuaciones del sistema: ");
scanf("%i",&n);
printf("\nIngrese la base del dominio: ");
scanf("%i",&p);
printf("Ingrese los coeficientes\n");

for(a=0;a<n;a++)
{
for(b=0;b<n;b++)
{
printf("Coef. (%i,%i) ",a+1,b+1);
scanf("%i",&A[a][b]);
}
printf("Termino independiente Ec. %i: ",a+1);
scanf("%i",&B[a]);
}
//Metodo Gauss-Jordan
int i,s,j,k;
for(i=0; i<n; i++);
{

//Se Comprueba que el pivote se dif. de 0


if (A[i][i]==0)
{
for(s=i+1;s<=n+1;s++)
{
if (A[s][i]!=0)
{//Intercambio de fila
aux=A[i][s-1];

A[i][s-1]=A[i+1][s-1];
A[i+1][s-1]=aux;

aux=B[i];
B[i]=B[i+1];
B[i+1]=aux;
}
}
}
//se hace 1 el pivote
inv_mul(A[i][i],p,&d,&x,&y);
if(x<0)
x=b+x;
cte=x;
for(j=0;j<n;j++)
{
A[i][j]=(A[i][j]*cte)%p;
// printf("%i",A[i][j]);
}
B[i]=(B[i]*cte)%p;
//Continua el algoritmo de eliminacion gaussiana
for(j=i+1;j<n;j++)
{

cte=A[j][i];
for(k=0;k<n;k++)
{
if (A[j][k] - (cte*A[i][k])%p < 0)
aux= p + (A[j][k] - (cte*A[i][k])%p);
else
aux = A[j][k] - (cte*A[i][k])%p;
A[j][k]=( aux )%p;
}
if (B[j]-(cte*B[i])%p < 0)
aux = p + B[j]-(cte*B[i])%p;
else
aux= B[j]-(cte*B[i])%p;
B[j]=(aux)%p;
}
}
//se realiza la eliminacion de la matris superior
for(i=n;i>=1;i--)
{
for(j=i-1;j>=0;j--)
{
cte=A[j][i];
if (A[j][i]-(cte*A[i][i])%p < 0)

aux= p + (A[j][i]-(cte*A[i][i])%p);
else
aux=A[j][i]-(cte*A[i][i])%p ;
A[j][i]=(aux)%p;
if (B[j]-(cte*B[i])%p < 0)
aux= p + (B[j]-(cte*B[i])%p);
else
aux = B[j]-(cte*B[i])%p ;
B[j]=(aux)%p;
}
}

//Impresion de resultados
printf("\n\n SOLUCION DEL SISTEMA\n ");
for(k=0;k<n;k++)
{
printf("\n x[%d] = %i",k+1,B[k]);
printf("\n");
system("pause");
}

void inv_mul(long a,long p,long *d,long *x,long *y)


{

long x1,y1;
if(p==0)
{
*d=a;
*x=1;
*y=0;
}
else
{
inv_mul(p,a%p,d,x,y);
x1=*x;
y1=*y;
*x=y1;
*y=x1-(a/p)*y1;
}
}

PRUEBAS

CONCLUSIONES
La codificacin del algoritmo de Euclides e lenguaje de descripcin de hardware
requiere de mayor cuidado que la correspondiente al algoritmo binario.
La arquitectura del algoritmo es similar, ambos utilizan divisores, multiplicadores,
registros, restadores, comparadores. La divisin es la operacin aritmtica que
mayor hardware requiere, siendo ste un factor limitante en el desempeo de las
arquitecturas.
Gracias a gente como Euclides y los grandes matemticos, las enseanzas que han
dejado a travs de los aos han hecho que hoy en da se hayan hecho muchos
avances en la ciencia como son las computadoras, pero no solo las computadoras
sino tambin, el hombre no hubiera podido llegar al espacio sin ellas o tener la
tecnologa que tenemos hoy en da.
Creemos que todo los que nos rodea tiene una razn de ser y todo se puede
responder gracias a las matemticas.

You might also like