algoritmo gauss-jordan en c

March 24, 2018 | Author: Ik Ben Slos | Category: Numbers, Mathematical Objects, Abstract Algebra, Number Theory, Mathematical Concepts


Comments



Description

INSTITUTO POLITÉCNICONACIONAL ESCUELA SUPERIOR DE CÓMPUTO ÁLGEBRA LINEAL PRACTICA 1: SISTEMAS DE ECUACIONES LINEALES INTEGRANTES: MORA GUARDADO DANIEL SORIA ZÚÑIGA BRIAN ISAAC SANTOYO LÓPEZ OSCAR SAID GRUPO: 1CM2 PROFESOR: IVÁN GIOVANNY MOSSO GARCÍA CÁLCULO 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 y el producto modular” definidas como: 𝑎̅ × 𝑏̅ = ̅̅̅̅̅̅̅ 𝑎 × 𝑏 . En esta introducción nos concentraremos en explicar cómo se obtiene el inverso multiplicativo tal que al hacer la operación: ̅̅̅̅̅̅̅̅̅̅ 𝑎 × 𝑎−1 = 1(𝑚𝑜𝑑 𝒑). El multiplicador modular inverso de un entero n módulo 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 módulo p. Es equivalente a mn ≡ 1 (mod p) El multiplicador inverso de n módulo p existe si y sólo si n y p son coprimos. Si existe el multiplicador modular inverso de n módulo p, se puede definir la operación de división entre n módulo p mediante la multiplicación por el inverso. Para realizar el calculo del inverso multiplicativo se utiliza un algoritmo llamado: “ALGORITMO DE EUCLIDES O ALGORITMO EUCLIDIANO”. A continuación explicare en que consiste este algoritmo. El multiplicador modular inverso de n módulo 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 módulo 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). 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. De esta ecuación podemos decir que n-1=73 que es lo que queríamos calcular.p)=1. supongamos que queremos calcular el inverso de 117 módulo 244.  Paso 10: Si n-1 es negativo. Si sustituimos en la ecuación 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.117)=1  Paso 6: Del paso 4 despejo el resto (el número que queda a la derecha de la suma). el inverso n-1 se recalcula como n-1 + p. 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. Si sustituimos en la ecuación del paso 8 obtenemos 1=3*117-35*(244-2*117)=-35*244+73*117.p) en términos de n y p y así obtener el inverso de n que notaremos por n-1. Si sustituimos en la ecuación 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. quedando 1=7-3*2  Paso 7: Del paso 3 despejo el resto quedando 3=10-1*7. .  Paso 1: Como n > p entonces podemos expresar n como n=qp+r.Por ejemplo. Posteriormente aprovechamos los pasos intermedios para hallar el mcd(n. B[i+1]=aux. . aux=B[i].s++) { if (A[s][i]!=0) { aux=A[i][s-1]. if (A[i][i]==0) { for(s=i+1. A[i+1][s-1]=aux. El código se encargaba de revisar si el pivote era diferente de cero ya que si sí lo era debíamos cambiar las filas. B[i]=B[i+1]. A[i][s-1]=A[i+1][s-1]. cte=A[i][i].EL DISEÑO Para empezar el diseño del algoritmo empezamos programando el algoritmo de Gauss-Jordan con base decimal en donde explicaremos algunas partes del código. } } } Y en caso que no fuera 0 entonces hacíamos que el pivote fuera 1 para poder usar el algoritmo y el código quedo así.s<=n+1. j++) { cte=A[j][i].j<n. se las restábamos a las demás.i--) { for(j=i-1. Ya que teníamos el pivote de alguna fila. for(i=n. for(k=0.j--) { . } } Pero después de hacer eso y encontrar los pivotes nos quedaba una matriz triangular superior y debíamos hacer que quedara la identidad así que ahora restamos de abajo hacia arriba para poder llegar a la identidad.k<n. el pivote fuera el único con valor a 1 y los demás a 0.j++) { A[i][j]=A[i][j]/cte. } B[j]=B[j]-cte*B[i].k++) { A[j][k]=A[j][k]-cte*A[i][k].for(j=0.i>=1. for(j=i+1. para que en la columna del pivote. } B[i]=B[i]/cte.j<n.j>=0. .b++) { printf("Coef. for(a=0.b.&n).a<n. A[j][i]=A[j][i]-cte*A[i][i].aux. (%i.cte. printf("Ingrese los coeficientes\n"). float A[10][10].a++) { for(b=0. B[j]=B[j]-cte*B[i]. printf("\n\t\tMETODO DE GAUSS-JORDAN\n").B[10].a+1. #include<stdio. printf("\nIngrese el numero de ecuaciones del sistema: ").h> main() { int n. //Se piden las incógnitas y términos indp.a.h> #include<stdlib.b+1).h> #include<math.cte=A[j][i].b<n. scanf("%i".%i) ". } } Y entonces el código de gauss-Jordan quedo de la siguiente manera. &B[a]). de 0 if (A[i][i]==0) { for(s=i+1. } printf("Termino independiente Ec. A[i+1][s-1]=aux. i<n. aux=B[i]. B[i+1]=aux.scanf("%f". .a+1).s.&A[a][b]).j. { //Se Comprueba que el pivote se dif. scanf("%f". %i: ".k. i++). B[i]=B[i+1].s<=n+1.s++) { if (A[s][i]!=0) {//Intercambio de renglon aux=A[i][s-1]. } //Metodo Gauss-Jordan int i. A[i][s-1]=A[i+1][s-1]. for(i=0. } } } //Se normaliza Renglon pivote cte=A[i][i]. } B[i]=B[i]/cte.j<n.k++) { A[j][k]=A[j][k]-cte*A[i][k]. for(j=0. } } //se realiza la eliminación inversa . //Continua el algoritmo de eliminación gaussiana for(j=i+1.k<n.j++) { cte=A[j][i]. for(k=0. } B[j]=B[j]-cte*B[i].j<n.j++) { A[i][j]=A[i][j]/cte. k++) { printf("\n x[%d] = %1.j--) { cte=A[j][i]. A[j][i]=A[j][i]-cte*A[i][i]. } .k<n.4f". for(k=0.k+1.for(i=n. system("pause"). } printf("\n"). B[j]=B[j]-cte*B[i]. } } //Impresión de resultados printf("\n\n SOLUCION DEL SISTEMA\n ").i>=1.B[k]).i--) { for(j=i-1.j>=0. b.&b) != EOF inv(a.a.x.&d.y1.b.IMPLEMENTACIÓN Usando el diseño de Gauss Jordan.y.long *y) { long x1.long b.x).long *x. if(b==0) { . return 0.&y). } void inv(long a.long *d. printf("x= %ld y= %ld d= %ld \n". printf("El inverso multiplicativo de %ld en modulo %ld es: %ld". Ahora el neutro multiplicativo tuvimos que apoyarnos con el algoritmo extendido de Euclides el cual quedo de la siguiente manera: scanf("%ld %ld".d).&x. if(x<0) x=b+x.&a. necesitábamos implementarlo en campos finitos y tuvimos que hacer algunas modificaciones. a%b. if(x<0) x=b+x.&y). } } El cual nos arrojaba el neutro aditivo y ahora teníamos que implementarlo en el código que ya teníamos de manera que para obtener el pivote quedo de la siguiente manera: inv_mul(A[i][i].&d. for(j=0.d.j++) { A[i][j]=(A[i][j]*cte)%p.j<n. *y=0.x.&x. } else { inv(b. *y=x1-(a/b)*y1. y1=*y. x1=*x.p. . *x=y1. cte=x.*d=a.y). *x=1. A[i][j]). A[j][k]=( aux )%p. else . En el llamamos la función para obtener el neutro multiplicativo y así multiplicarlo por toda la fila.// printf("%i".j++) { cte=A[j][i]. else aux = A[j][k] . Después tuvimos que modificar la resta de filas para obtener la identidad. } if (B[j]-(cte*B[i])%p < 0) aux = p + B[j]-(cte*B[i])%p.(cte*A[i][k])%p < 0) aux= p + (A[j][k] .k++) { if (A[j][k] . for(k=0.(cte*A[i][k])%p).k<n.j<n. pero en este caso fue más sencillo y quedo de la siguiente manera: for(j=i+1. } B[i]=(B[i]*cte)%p.(cte*A[i][k])%p. else aux=A[j][i]-(cte*A[i][i])%p .i>=1.i--) { for(j=i-1.j>=0.j--) { cte=A[j][i]. else aux = B[j]-(cte*B[i])%p . } } for(i=n. B[j]=(aux)%p. if (A[j][i]-(cte*A[i][i])%p < 0) aux= p + (A[j][i]-(cte*A[i][i])%p). } } . B[j]=(aux)%p. if (B[j]-(cte*B[i])%p < 0) aux= p + (B[j]-(cte*B[i])%p). A[j][i]=(aux)%p.aux= B[j]-(cte*B[i])%p. h> long a. //Se piden las incógnitas printf("\n\t\tMETODO DE GAUSS-JORDAN\n").h> #include<stdlib.a. printf("\nIngrese el numero de ecuaciones del sistema: ").Como vemos. main() { int n.&n).long b.B[10].p. scanf("%i".x. // variables globales para algoritmo Euclides void inv_mul(long a. printf("\nIngrese la base del dominio: ").h> #include<math. int A[10][10].d.long *y).long *d.b.p. printf("Ingrese los coeficientes\n").cte. Entonces el código quedo de la siguiente manera.y. pusimos unas condiciones y así poder obtener el modulo.aux.&p).long *x. . solo fue cuestión de obtener los módulos pero como en C no se obtiene el módulo de numero negativos. scanf("%i". CÓDIGO #include<stdio. } printf("Termino independiente Ec.a++) { for(b=0.a+1). for(i=0.b+1).&B[a]).b++) { printf("Coef. i<n.a+1. scanf("%i". } //Metodo Gauss-Jordan int i. { //Se Comprueba que el pivote se dif.k.j.&A[a][b]).s. scanf("%i".a<n.%i) ". . (%i.s<=n+1. de 0 if (A[i][i]==0) { for(s=i+1.for(a=0.s++) { if (A[s][i]!=0) {//Intercambio de fila aux=A[i][s-1]. %i: ".b<n. i++). j<n. cte=x. aux=B[i].j<n.j++) { A[i][j]=(A[i][j]*cte)%p. } B[i]=(B[i]*cte)%p.A[i][j]). if(x<0) x=b+x. for(j=0.&y). } } } //se hace 1 el pivote inv_mul(A[i][i].&d.&x.j++) { . // printf("%i". B[i]=B[i+1]. A[i+1][s-1]=aux. B[i+1]=aux.A[i][s-1]=A[i+1][s-1]. //Continua el algoritmo de eliminacion gaussiana for(j=i+1.p. else aux= B[j]-(cte*B[i])%p. for(k=0.j>=0. else aux = A[j][k] . } } //se realiza la eliminacion de la matris superior for(i=n.cte=A[j][i].i>=1.k<n.(cte*A[i][k])%p).(cte*A[i][k])%p. B[j]=(aux)%p.j--) { cte=A[j][i].k++) { if (A[j][k] .(cte*A[i][k])%p < 0) aux= p + (A[j][k] . if (A[j][i]-(cte*A[i][i])%p < 0) . A[j][k]=( aux )%p. } if (B[j]-(cte*B[i])%p < 0) aux = p + B[j]-(cte*B[i])%p.i--) { for(j=i-1. k<n. printf("\n"). if (B[j]-(cte*B[i])%p < 0) aux= p + (B[j]-(cte*B[i])%p).long *d.long p.k+1.k++) { printf("\n x[%d] = %i". A[j][i]=(aux)%p. system("pause").aux= p + (A[j][i]-(cte*A[i][i])%p). for(k=0. } } //Impresion de resultados printf("\n\n SOLUCION DEL SISTEMA\n "). } void inv_mul(long a. B[j]=(aux)%p.long *x. else aux = B[j]-(cte*B[i])%p .B[k]). else aux=A[j][i]-(cte*A[i][i])%p .long *y) { . a%p. } else { inv_mul(p. } } .y1. *y=0.long x1.d. if(p==0) { *d=a. y1=*y. *y=x1-(a/p)*y1. *x=y1.x.y). *x=1. x1=*x. PRUEBAS . La división es la operación aritmética que mayor hardware requiere. Creemos que todo los que nos rodea tiene una razón de ser y todo se puede responder gracias a las matemáticas. comparadores. multiplicadores. el hombre no hubiera podido llegar al espacio sin ellas o tener la tecnología que tenemos hoy en día. .CONCLUSIONES La codificación del algoritmo de Euclides e lenguaje de descripción de hardware requiere de mayor cuidado que la correspondiente al algoritmo binario. restadores. pero no solo las computadoras sino también. siendo éste un factor limitante en el desempeño de las arquitecturas. Gracias a gente como Euclides y los grandes matemáticos. La arquitectura del algoritmo es similar. ambos utilizan divisores. registros. las enseñanzas que han dejado a través de los años han hecho que hoy en día se hayan hecho muchos avances en la ciencia como son las computadoras.
Copyright © 2024 DOKUMEN.SITE Inc.