12. Números naturales y enteros. Congruencias y sistemas de numeración
Ejercicios resueltos
ü Ejercicio 1.
Calcular en
1001el inverso de 271 êêêêê .
Solución:
Para ello calculamos el máximo común divisor y la identidad de Bezout, a
partir del programa 11.2.
Clear[valor1,valor2];
n1=271;
n2=1001;
If[Abs[n1]>Abs[n2], temp=n1; n1=n2; n2=temp];
Signo1=n1/Abs[n1];
Signo2=n2/Abs[n2];
a=Abs[n1];
b=Abs[n2];
If [a<b,a=b;
b=Abs[n1];
n3=a;
n4=b;
];
If[Mod[n2,n1]==0,Valoru=0;Valordev=Signo1;a=b;, r=1;
cocientes={};
s=0;
While[r>0,
q=Quotient[a,b];
r=Mod[a,b];
a=b;
b=r;
s=s+1;
AppendTo[cocientes,q];
];
listam=Table[0,{i,s}];
listam[[1]]=valor1;
listam[[2]]=valor2;
For [f=3,f<s+1,f++,
listam[[f]]=listam[[f-2]]-(listam[[f-1]]*cocientes[[f-2]]) ];
Bezout:=Simplify[listam[[s-1]]-(listam[[s]]*cocientes[[s-1]])];
valor1=1;
valor2=0;
Valoru=Bezout;
valor1=0;
valor2=1;
Valordev=Bezout;
Valoru=Valoru*Signo2;
Valordev=Valordev*Signo1;
]
Print["m.c.d.{",n1,",",n2,"}=",a]
Print["m.c.m.{",n1,",",n2,"}=",(n3*n4)/a]
Print["Identidad de Bezout: ",a," = ",n2,"·(",Valoru,") + ",n1,"·(",Valordev,")."]
m.c.d.8271,1001<=1
m.c.m.8271,1001<=271271
Identidad de Bezout: 1 = 1001⋅H111L + 271⋅H−410L.
Por tanto, en inverso que nos piden es -410 êêêêêêêê
; es decir,
Mod@−410, 1001D 591
ü Ejercicio 2.
Calcular en
10000el inverso de 275 êêêêê .
Solución:
Para ello calculamos el máximo común divisor y la identidad de Bezout, a
partir del programa 11.2.
Clear[valor1,valor2];
n1=275;
n2=10000;
If[Abs[n1]>Abs[n2], temp=n1; n1=n2; n2=temp];
Signo1=n1/Abs[n1];
Signo2=n2/Abs[n2];
a=Abs[n1];
b=Abs[n2];
If [a<b,a=b;
b=Abs[n1];
n3=a;
n4=b;
];
If[Mod[n2,n1]==0,Valoru=0;Valordev=Signo1;a=b;, r=1;
cocientes={};
s=0;
While[r>0,
q=Quotient[a,b];
r=Mod[a,b];
a=b;
b=r;
s=s+1;
AppendTo[cocientes,q];
];
listam=Table[0,{i,s}];
listam[[1]]=valor1;
listam[[2]]=valor2;
For [f=3,f<s+1,f++,
listam[[f]]=listam[[f-2]]-(listam[[f-1]]*cocientes[[f-2]]) ];
Bezout:=Simplify[listam[[s-1]]-(listam[[s]]*cocientes[[s-1]])];
valor1=1;
valor2=0;
Valoru=Bezout;
valor1=0;
valor2=1;
Valordev=Bezout;
Valoru=Valoru*Signo2;
Valordev=Valordev*Signo1;
]
Print["m.c.d.{",n1,",",n2,"}=",a]
Print["m.c.m.{",n1,",",n2,"}=",(n3*n4)/a]
Print["Identidad de Bezout: ",a," = ",n2,"·(",Valoru,") + ",n1,"·(",Valordev,")."]
m.c.d.8275,10000<=25
m.c.m.8275,10000<=110000
Identidad de Bezout: 25 = 10000⋅H3L + 275⋅H−109L.
Como no son primos relativos, no existe el inverso que nos piden.
ü Ejercicio 3.
Resolver la siguiente ecuación en congruencias:
3x ª 21 mod 101
Solución:
Para ello, despejamos en
101, 3 êêêê x
= 21 êêêê
y tenemos x êê = 21 êêêê êê 3
-1Calculamos el inverso del 3 en
101Clear[valor1,valor2];
n1=3;
n2=101;
If[Abs[n1]>Abs[n2], temp=n1; n1=n2; n2=temp];
Signo1=n1/Abs[n1];
Signo2=n2/Abs[n2];
a=Abs[n1];
b=Abs[n2];
If [a<b,a=b;
b=Abs[n1];
n3=a;
n4=b;
];
If[Mod[n2,n1]==0,Valoru=0;Valordev=Signo1;a=b;, r=1;
cocientes={};
s=0;
While[r>0,
q=Quotient[a,b];
r=Mod[a,b];
a=b;
b=r;
s=s+1;
AppendTo[cocientes,q];
];
listam=Table[0,{i,s}];
listam[[1]]=valor1;
listam[[2]]=valor2;
For [f=3,f<s+1,f++,
listam[[f]]=listam[[f-2]]-(listam[[f-1]]*cocientes[[f-2]]) ];
Bezout:=Simplify[listam[[s-1]]-(listam[[s]]*cocientes[[s-1]])];
valor1=1;
valor2=0;
Valoru=Bezout;
valor1=0;
valor2=1;
Valordev=Bezout;
Valoru=Valoru*Signo2;
Valordev=Valordev*Signo1;
]
Print["m.c.d.{",n1,",",n2,"}=",a]
Print["m.c.m.{",n1,",",n2,"}=",(n3*n4)/a]
Print["Identidad de Bezout: ",a," = ",n2,"·(",Valoru,") + ",n1,"·(",Valordev,")."]
m.c.d.83,101<=1
m.c.m.83,101<=303
Identidad de Bezout: 1 = 101⋅H−1L + 3⋅H34L.
Así el inverso del 3 es el 34.
Por tanto, x êê = 21 êêêê êê 3
-1= 21 êêêê 34 êêêê
Mod@21∗34, 101D 7
luego la ecuación es equivalente a x ª 7 mod 101 y una solución es x = 7.
ü Ejercicio 4.
Resolver el siguiente sistema de congruencias:
x ª 2 mod 3 x -2 ª 3 mod 7
x ª -27 mod 10
Solución:
En primer lugar simplificamos el sistema de congruencias:
Mod@3+2, 7D 5
Mod@−27, 10D 3
x ª 0 mod 3 x ª 5 mod 7 x ª 3 mod 10
Una vez que comprobamos que se verifican las condiciones del teorema
chino del resto, aplicamos el algoritmo que hemos implementado en el
programa 12.1.
n=3;
a=Table@0, 8i, n<D;
m=Table@0, 8i, n<D;
a@@1DD =0;
a@@2DD =5;
a@@3DD =3;
m@@1DD =3;
m@@2DD =7;
m@@3DD =10;
M=Table@0, 8i, n<D;
M@@1DD =1;
For@f=2, f<n+1, f++, M@@fDD =M@@f−1DD ∗m@@f−1DD;D;
u=Table@0, 8i, n<D;
For@k=1, k<n+1, k++, cont=1;
While@Mod@cont∗M@@kDD, m@@kDDD >1, cont=cont+1;D;
u@@kDD =cont;
D;
b=Table@0, 8i, n<D;
w=Table@0, 8i, n<D;
b@@1DD =Mod@a@@1DD, m@@1DDD;
For@f=2, f<n+1, f++,
w@@fDD = Mod@Ha@@fDD −b@@f−1DDL ∗u@@fDD, m@@fDDD;
b@@fDD =b@@f−1DD +w@@fDD ∗M@@fDD;D;
Print@"Sistema de congruencias:"D;
For@f=1, f<n+1, f++, Print@"x ≡ ", a@@fDD, " mod ", m@@fDDD;D;
Print@"Solución: \!\Hx\_0\L = ", b@@nDDD;
Print@"Solución general: x = ", b@@nDD, " + t ", M@@nDD ∗m@@nDD D;
Sistema de congruencias:
x ≡ 0 mod 3
x ≡ 5 mod 7
x ≡ 3 mod 10
Solución: x0 = 33
Solución general: x = 33 + t 210
ü Ejercicio 5.
Calcular la tabla del algoritmo chino del resto para el sistema de congruen-
cias del ejercicio anterior:
Solución:
Para ello usaremos el procedimiento 12.1. Lo cargamos en el núcleo:
CHINO@a_, m_D:=Module@8<, n=Length@aD;
tabla=Table@0,8i, n+1<,8j, 7<D;
tabla@@1DD = 8"i", "\!\Ha\_i\L", "\!\Hm\_i\L", "\!\HM\_i\L",
"\!\Hu\_i\L", "\!\Hw\_i\L", "\!\Hb\_i\L"<; For@k=2,
k≤n+1, k++, tabla@@k, 1DD =k−1; tabla@@k, 2DD =a@@k−1DD;
tabla@@k, 3DD =m@@k−1DDD;
M=Table@0, 8i, n<D;
M@@1DD =1;
tabla@@2, 4DD =1;
For@f=2, f<n+1, f++, M@@fDD =M@@f−1DD ∗m@@f−1DD;
tabla@@f+1, 4DD =M@@fDD;D;
u=Table@0, 8i, n<D;
For@k=1, k<n+1, k++, cont=1;
While@Mod@cont∗M@@kDD, m@@kDDD >1, cont=cont+1;D;
u@@kDD =cont;
tabla@@k+1, 5DD =u@@kDDD;
b=Table@0, 8i, n<D;
w=Table@0, 8i, n<D;
b@@1DD =Mod@a@@1DD, m@@1DDD;
tabla@@2, 7DD =b@@1DD;
tabla@@2, 6DD ="−";
For@f=2, f<n+1, f++,
w@@fDD = Mod@Ha@@fDD −b@@f−1DDL ∗u@@fDD, m@@fDDD;
tabla@@f+1, 6DD =w@@fDD;
b@@fDD =b@@f−1DD +w@@fDD ∗M@@fDD;
tabla@@f+1, 7DD =b@@fDD;D;
Print@"Sistema de congruencias:"D;
For@f=1, f<n+1, f++, Print@"x ≡ ", a@@fDD, " mod ", m@@fDDD;D;
Print@"Solución: \!\Hx\_0\L = ", b@@nDDD;
Print@"Solución general: x = ", b@@nDD, " + t ", M@@nDD ∗m@@nDDD;
Print@"Tabla de cálculos:"D;
Print@TableForm@tablaDD;D
Ahora lo utilizamos con los datos de nuestro problema
CHINO@80, 5, 3<,83, 7, 10<D
Sistema de congruencias:
x ≡ 0 mod 3
x ≡ 5 mod 7
x ≡ 3 mod 10
Solución: x0 = 33
Solución general: x = 33 + t 210
Tabla de cálculos:
i ai mi Mi ui wi bi
1 0 3 1 1 − 0
2 5 7 3 5 4 12
3 3 10 21 1 1 33
ü Ejercicio 6.
En una olimpida de invierno se quiere conocer el número de atletas que participan. En la villa olímpica hay apartamentos de 5 personas. Después de ser ocupados por los atletas quedan algunos apartamentos libres y uno de ellos ocupado tan sólo por dos personas. El primer día de competición en el comedor desayunan los atletas y los jueces juntos, entrando 81 perso- nas en cada turno y se sabe que para el último turno sólo quedan 54 perso- nas. Para trasladar a los atletas al estadio olímpico se utilizan vehículos monovolumen de 9 plazas cuyo conductor es una persona contratada por la organización. Se sabe que en el último de los coches hay 3 plazas libres.
Sabiendo que hay un juez por cada cuatro atletas y que participan menos de
1000, ¿cuántos atletas participan?
Solución:
Consideremos x = nº de atletas e y = nº de jueces,
los datos del problema se traducen en el siguiente sistema de congruencias:
x ª 2 mod 5
x + y ª 54 mod 81
x ª -3 mod 8
Sabiendo que hay un juez por cada cuatro atletas y que participan menos de 1000 atletas:
4 y = x ï y = 4
-1x x < 1000
Sustituyendo el valor de y quedaría
x + 4
-1x ª 54 mod 81; o bien x ª H1 + 4
-1)
-154 mod 81
Calculamos primero el inverso del 4 en
81:
Clear[valor1,valor2];
n1=4;
n2=81;
If[Abs[n1]>Abs[n2], temp=n1; n1=n2; n2=temp];
Signo1=n1/Abs[n1];
Signo2=n2/Abs[n2];
a=Abs[n1];
b=Abs[n2];
If [a<b,a=b;
b=Abs[n1];
n3=a;
n4=b;
];
If[Mod[n2,n1]==0,Valoru=0;Valordev=Signo1;a=b;, r=1;
cocientes={};
s=0;
While[r>0,
q=Quotient[a,b];
r=Mod[a,b];
a=b;
b=r;
s=s+1;
AppendTo[cocientes,q];
];
listam=Table[0,{i,s}];
listam[[1]]=valor1;
listam[[2]]=valor2;
For [f=3,f<s+1,f++,
listam[[f]]=listam[[f-2]]-(listam[[f-1]]*cocientes[[f-2]]) ];
Bezout:=Simplify[listam[[s-1]]-(listam[[s]]*cocientes[[s-1]])];
valor1=1;
valor2=0;
Valoru=Bezout;
valor1=0;
valor2=1;
Valordev=Bezout;
Valoru=Valoru*Signo2;
Valordev=Valordev*Signo1;
]
Print["m.c.d.{",n1,",",n2,"}=",a]
Print["m.c.m.{",n1,",",n2,"}=",(n3*n4)/a]
Print["Identidad de Bezout: ",a," = ",n2,"·(",Valoru,") + ",n1,"·(",Valordev,")."]
m.c.d.84,81<=1
m.c.m.84,81<=324
Identidad de Bezout: 1 = 81⋅H1L + 4⋅H−20L.
El inverso del 4 es el -20, así
x ª (1 +
4
-1)
-154 mod 81 ª H 1 - 20)
-154 mod 81 ª H -19)
-154 mod 81.
Por tanto necesitamos ahora calcular el inverso del -19 en
81:
Clear[valor1,valor2];
n1=-19;
n2=81;
If[Abs[n1]>Abs[n2], temp=n1; n1=n2; n2=temp];
Signo1=n1/Abs[n1];
Signo2=n2/Abs[n2];
a=Abs[n1];
b=Abs[n2];
If [a<b,a=b;
b=Abs[n1];
n3=a;
n4=b;
];
If[Mod[n2,n1]==0,Valoru=0;Valordev=Signo1;a=b;, r=1;
cocientes={};
s=0;
While[r>0,
q=Quotient[a,b];
r=Mod[a,b];
a=b;
b=r;
s=s+1;
AppendTo[cocientes,q];
];
listam=Table[0,{i,s}];
listam[[1]]=valor1;
listam[[2]]=valor2;
For [f=3,f<s+1,f++,
listam[[f]]=listam[[f-2]]-(listam[[f-1]]*cocientes[[f-2]]) ];
Bezout:=Simplify[listam[[s-1]]-(listam[[s]]*cocientes[[s-1]])];
valor1=1;
valor2=0;
Valoru=Bezout;
valor1=0;
valor2=1;
Valordev=Bezout;
Valoru=Valoru*Signo2;
Valordev=Valordev*Signo1;
]
Print["m.c.d.{",n1,",",n2,"}=",a]
Print["m.c.m.{",n1,",",n2,"}=",(n3*n4)/a]
Print["Identidad de Bezout: ",a," = ",n2,"·(",Valoru,") + ",n1,"·(",Valordev,")."]
m.c.d.8−19,81<=1
m.c.m.8−19,81<=1539
Identidad de Bezout: 1 = 81⋅H4L + −19⋅H17L.
El inverso de -19 es 17 y, por tanto
x ª H -19)
-154 mod 81 ª H 17 L 54 mod 81ª 27 mod 81 pues
Mod@17∗54, 81D 27
Además podemos simplificar la tercera congruencia pues:
Mod@−3, 8D 5
El sistema queda:
x ª 2 mod 5 x ª 27 mod 81
x ª 5 mod 8
Sabiendo que x < 1000
n=3;
a=Table@0, 8i, n<D;
m=Table@0, 8i, n<D;
a@@1DD =2;
a@@2DD =27;
a@@3DD =5;
m@@1DD =5;
m@@2DD =81;
m@@3DD =8;
M=Table@0, 8i, n<D;
M@@1DD =1;
For@f=2, f<n+1, f++, M@@fDD =M@@f−1DD ∗m@@f−1DD;D;
u=Table@0, 8i, n<D;
For@k=1, k<n+1, k++, cont=1;
While@Mod@cont∗M@@kDD, m@@kDDD >1, cont=cont+1;D;
u@@kDD =cont;
D;
b=Table@0, 8i, n<D;
w=Table@0, 8i, n<D;
b@@1DD =Mod@a@@1DD, m@@1DDD;
For@f=2, f<n+1, f++,
w@@fDD = Mod@Ha@@fDD −b@@f−1DDL ∗u@@fDD, m@@fDDD;
b@@fDD =b@@f−1DD +w@@fDD ∗M@@fDD;D;
Print@"Sistema de congruencias:"D;
For@f=1, f<n+1, f++, Print@"x ≡ ", a@@fDD, " mod ", m@@fDDD;D;
Print@"Solución: \!\Hx\_0\L = ", b@@nDDD;
Print@"Solución general: x = ", b@@nDD, " + t ", M@@nDD ∗m@@nDD D;
Sistema de congruencias:
x ≡ 2 mod 5
x ≡ 27 mod 81
x ≡ 5 mod 8
Solución: x0 = 837
Solución general: x = 837 + t 3240
Como la cota para x es: x < 1000, damos a t el valor 0 y obtenemos:
837+0∗3240
837
Por tanto, el número de atletas participantes es 837.
ü Ejercicio 7.
Expresar 189 en base 7.
Solución:
Aplicamos el programa 12.2. de la forma:
n=189;
b=7;
n1=n;
numb="";
While@n>0,
If@Mod@n, bD <10, numb=StringJoin@ToString@Mod@n, bDD, numbD;
n=Quotient@n, bD;, If@Mod@n, bD ≥10,
numb=StringJoin@FromCharacterCode@55+Mod@n, bD, numbDD;
n=Quotient@n, bD;
D;
D;D
Print@n1, " = ", "H", numb, \!\H"L" \_b\LD;
189 = H360L7
ü Ejercicio 8.
Expresar 12345 en base 2,4,8 y16.
Solución:
En base 2:
n=12345;
b=2;
n1=n;
numb="";
While@n>0,
If@Mod@n, bD <10, numb=StringJoin@ToString@Mod@n, bDD, numbD;
n=Quotient@n, bD;, If@Mod@n, bD ≥10,
numb=StringJoin@FromCharacterCode@55+Mod@n, bDD, numbDD;
n=Quotient@n, bD;
D;
D;
Print@n1, " = ", "H", numb, \!\H"L" \_b\LD;
12345 = H11000000111001L2
En base 4:
n=12345;
b=4;
n1=n;
numb="";
While@n>0,
If@Mod@n, bD <10, numb=StringJoin@ToString@Mod@n, bDD, numbD;
n=Quotient@n, bD;, If@Mod@n, bD ≥10,
numb=StringJoin@FromCharacterCode@55+Mod@n, bDD, numbDD;
n=Quotient@n, bD;
D;
D;
Print@n1, " = ", "H", numb, \!\H"L" \_b\LD;
12345 = H3000321L4
En base 8:
n=12345;
b=8;
n1=n;
numb="";
While@n>0,
If@Mod@n, bD <10, numb=StringJoin@ToString@Mod@n, bDD, numbD;
n=Quotient@n, bD;, If@Mod@n, bD ≥10,
numb=StringJoin@FromCharacterCode@55+Mod@n, bDD, numbDD;
n=Quotient@n, bD;
D;
D;
Print@n1, " = ", "H", numb, \!\H"L" \_b\LD;
12345 = H30071L8
En base 16:
n=12345;
b=16;
n1=n;
numb="";
While@n>0,
If@Mod@n, bD <10, numb=StringJoin@ToString@Mod@n, bDD, numbD;
n=Quotient@n, bD;, If@Mod@n, bD ≥10,
numb=StringJoin@FromCharacterCode@55+Mod@n, bDD, numbDD;
n=Quotient@n, bD;
D;
D;
Print@n1, " = ", "H", numb, \!\H"L" \_b\LD;
12345 = H3039L16
ü Ejercicio 9.
Escribir los siguientes números en base 10:
I. (ade)
16II. (10203)
4Solución:
I. (ade)
16numero="ade";
base=16;
numero=ToUpperCase@numeroD;
num=Characters@numeroD;
cont=0; numdec=0; n=Length@numD;
For@j=n, j>0, j−−, If@ToCharacterCode@num@@jDDD@@1DD >57,
numdec= HHToCharacterCode@num@@jDDD −55L ∗ Hbase ^ contLL +numdec;
cont=cont+1;,
numdec= HHToCharacterCode@num@@jDDD −48L ∗ Hbase ^ contLL +numdec;
cont=cont+1;D;D;
Print@"H", numero, \!\H"L" \_base\L, " = ", numdec@@1DDD;
HADEL16 = 2782
II. (10203)
4numero="10203";
base=4;
numero=ToUpperCase@numeroD;
num=Characters@numeroD;
cont=0; numdec=0; n=Length@numD;
For@j=n, j>0, j−−, If@ToCharacterCode@num@@jDDD@@1DD >57,
numdec= HHToCharacterCode@num@@jDDD −55L ∗ Hbase ^ contLL +numdec;
cont=cont+1;,
numdec= HHToCharacterCode@num@@jDDD −48L ∗ Hbase ^ contLL +numdec;
cont=cont+1;D;D;
Print@"H", numero, \!\H"L" \_base\L, " = ", numdec@@1DDD;
H10203L4 = 291
ü Ejercicio 10.
Utilizar el procedimiento 12.2. para expresar el número 259a9 dado en base 12, en base 7.
Solución:
Introducimos la función/procedimiento 12.2 en el núcleo
CAMBIOBASE@numero_, base1_, base2_D:=
Module@8num, cont, n, numdec, numero2<, numero2=ToUpperCase@numeroD;
num=Characters@numero2D;
cont=0;
numdec=0;
n=Length@numD;
For@j=n, j>0, j−−, If@ToCharacterCode@num@@jDDD@@1DD >57,
numdec= HHToCharacterCode@num@@jDDD −55L ∗ Hbase1 ^ contLL +numdec;
cont=cont+1;
,
numdec= HHToCharacterCode@num@@jDDD −48L ∗ Hbase1 ^ contLL +numdec;
cont=cont+1;
D;
D;
n=numdec@@1DD;
numbase2="";
While@n>0,
If@Mod@n, base2D <10,
numbase2=StringJoin@ToString@Mod@n, base2DD, numbase2D;
n=Quotient@n, base2D;
,
If@Mod@n, base2D ≥10, numbase2=
StringJoin@FromCharacterCode@55+Mod@n, base2DD, numbase2DD;
n=Quotient@n, base2D;D;
D;
Print@"H", numero2, \!\H"L" \_base1\L, " = ",
numdec@@1DD, " = ", "H", numbase2, \!\H"L" \_base2\LD;D;
A continuación, cargamos los datos del problema
CAMBIOBASE@"259a9", 12, 7D
H259A9L12 = 51537 = H303153L7