11. Números naturales y enteros. Divisibilidad

Ejemplos con Mathematica

1. Divisibilidad en números enteros

Ejemplo 11.1.

Utilizando un bucle, escribir un programa usando la definición de número primo que haga lo mismo que PrimeQ[]

n = NÚMERO;
primo = True;
n = Abs[n];
If[n == 0 || n == 1, 
        primo = False,  
Do[
            If[Mod[n, i] == 0, primo = False], {i, 2, 
              n - 1}];
];
primo

Aplicarlo al número 541

n = 541;
primo = True;
n = Abs[n];
If[n == 0 || n == 1, 
        primo = False,  
Do[
            If[Mod[n, i] == 0, primo = False], {i, 2, 
              n - 1}];
];
primo

Ejemplo 11.2.

Calcular el cociente y el resto de los siguientes números enteros

Quotient[7, 4]
Mod[7, 4]

Quotient[-7, 4]
Mod[-7, 4]

Sin embargo, observemos que

Quotient[7, -4]
Mod[7, -4]

y

Quotient[-7, -4]
Mod[-7, -4]

no son los cocientes y restos que verifican el algoritmo de la división pues los restos son negativos. Así el programa falla al calcular cocientes y restos con divisores negativos.

2. Algoritmo de Euclides

Ejemplo 11.3.

Calcular, usando el algoritmo de Euclides, el máximo común divisor y el mínimo común múltiplo de 34 y -218

n1 = 34;
n2 = -218;
a = Abs[n1];
b = Abs[n2];
If[a < b, a = b; b = Abs[n1];];
m = 1;
While[m > 0, 
        m = Mod[a, b]; 
a = b; 
b = 
          m;
];
Print["m.c.d.(", n1, ",", n2, ")=", a]
Print["m.c.m.(", n1, ",", n2, ")=", 
      Abs[(n1*n2)/a]]

3. Identidad de Bezout

Ejemplo 11.4.

Calcular la identlidad de Bezout para 270 y -3120

Aplicando el programa 11.2., obtenemos

Clear[valor1,valor2];
n1=270;
n2=-3120;
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,")."]

4. Resolución de ecuaciones diofánticas

Ejemplo 11.5.

Resolver, si es posible, la ecuación diofántica
					270 x - 3120 y = - 60

Paso 1: Aplicamos el programa 11.2. y obtenemos

Clear[valor1,valor2];
n1=270;
n2=-3120;
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,")."]

Paso 2: Calculamos k = (c/d) y vemos si es entero.

k = -60/30

Paso 3: Multiplicamos la Identidad de Bezout por el k obtenido en el paso anterior y una solución para la ecuación es:

x = (-23)*k
y = (-2)*k

Paso 4: Todas la soluciones enteras para la ecuación serán, para cada t ∈ ℤ:

x = 46 + t ((-3120)/30)

y =  4  - t  (270/30)

Ejemplo 11.6.

Resolver, si es posible, la ecuación diofántica
						- 27 x - 312 y = 25

Paso 1: Aplicamos el programa 11.2. y obtenemos

Clear[valor1, 
        valor2];
n1 = -27;
n2 = -312;
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.{"270",\
"-3120"}="30
"m.c.m.{"270",\
"-3120"}="28080
\("Identidad de Bezout: "30" = "\(-3120\)"·("\(-2\)") + "270"·("\(-23\)")."\)

Paso 2: Calculamos k = (c/d) y vemos si es entero.

k = 25/30

como k no es entero, d no divide a c y la ecuación no admite solución entera.

5. Ejercicios

Ejercicio 11.15.

Número de segundo totales

segundos[años_, meses_, dias_, horas_, minutos_, segundos_] := 
      Module[{seg}, 
        seg = ((((((años*12 + meses)*30 + 
                                  dias)*24) + horas)*60) + 
                  minutos)*60 + 
            segundos; 
seg]

segundos[2, 7, 12, 11, 32, 45]