Practica 2

Descargar como pdf o txt
Descargar como pdf o txt
Está en la página 1de 4

Práctica 2 de Matemática Discreta: Aritmética.

Objetivos de la práctica
1. Conocer órdenes de SAGE para hacer bucles
2. Trabajar con el concepto de divisibilidad, sus propiedades y aplicciones.
3. Expresar un número en diferentes bases de numeración.
4. Resolver ecuaciones diofánticas.

Bucles
Como ya vimos, el comando range(ini,fin,s) crea una lista de números que empieza en ini, va a saltos de s en s y para justo antes de llegar a fin (no lo
incluye).

range(0,10,2) 
[0, 2, 4, 6, 8]

Con la ayuda del comando range, Sage permite usar bucles, que sirven para realizar una serie de instrucciones un determinado número de veces. El
cuerpo del bucle NO se encierra entre llaves: comienza tras los dos puntos y viene delimitado por la sangría. Por ejemplo, podemos usar un bucle para
recorrer los elementos de una lista.

for i in range(1,10):
print 'i=',i 
i= 1
i= 2
i= 3
i= 4
i= 5
i= 6
i= 7
i= 8
i= 9

En el ejemplo anterior la lista venía dada por un rango, por lo que sus elementos eran números enteros. Sin embargo, podemos recorrer cualquier lista,
aunque ésta no esté compuesta por enteros.

lista = ['primera línea','segunda línea','tercera línea','cuarta línea']


for i in lista:
print i 
primera línea
segunda línea
tercera línea
cuarta línea

Sage permite comparaciones:

i=1
j=2 

Comparación de igualdad:

i==j 
False

Comparación de inferioridad:

i<j 
True

Comparación de desigualdad (dos formas diferentes):

i!=j 
True
i<>j 
True

Los valores booleanos True y False se pueden operar con not (la negación), and ('y' lógico), or ('o' lógico):

1 de 4
not(i==j) 
True
True and False 
False
True or False 
True

Usando las comparaciones, Sage permite el uso de instrucciones de control:

for i in range(1,10):
if i%2 == 0: # a%b indica el resto de dividir a por b
print i, ' es par'
else:
print i, ' es impar' 
1 es impar
2 es par
3 es impar
4 es par
5 es impar
6 es par
7 es impar
8 es par
9 es impar

Sage admite el uso de bucles while:

i = 3;
while i <= 50:
if i.is_prime():
print i, ' es primo'
else:
print i, ' es compuesto'
i += 2 # el contador se puede aumentar explícitamente: i=i+2 
3 es primo
5 es primo
7 es primo
9 es compuesto
11 es primo
13 es primo
15 es compuesto
17 es primo
19 es primo
21 es compuesto
23 es primo
25 es compuesto
27 es compuesto
29 es primo
31 es primo
33 es compuesto
35 es compuesto
37 es primo
39 es compuesto
41 es primo
43 es primo
45 es compuesto
47 es primo
49 es compuesto

Ejercicios propuestos

1) Calcula una lista de números de la forma n2 + n + 17 para 0 ≤ n ≤ 60 . ¿Son todos primos? Si no es así encuentra los cuatro primeros números de
la lista que no lo sean y factorízalos.

2) Calcula una lista de números de la forma n2 + n + 41 para 0 ≤ n ≤ 60 . ¿Son todos primos? Si  no es así encuentra los cuatro primeros números
de la lista que no lo sean y factorízalos.

Funciones
Se pueden definir más funciones, además de las predefinidas en Sage. El uso de funciones definidas por el usuario aumenta la versatilidad de Sage.

La sintaxis de la definición de funciones es muy estricta y hay que respetarla, así como las tabulaciones (como en el caso de los bucles, el cuerpo de la
función está indentado o sangrado):

    def <nombre_de_la_funcion>(<lista_de_paramtros>):

        <cuerpo de la función (instrucciones)>

2 de 4
        return <valor de retorno>         ← opcional

def mcd(a,b):
return gcd(a,b) 

mcd(30,20) 
10

El número de argumentos que admite la función puede ser fijo o variable (diferente en cada llamada a la función). Los argumentos se recogen en una
tupla y se van recorriendo con un bucle.

Por ejemplo, para calcular el máximo común divisor de una lista de números:

def mcd(*args):
resultado = 0 # El mcd de un número y 0 es ese número
for i in args: # Se recorren los argumentos
resultado = gcd(resultado,i) # Se calcula el mcd con el nuevo elemento
if resultado == 1: # Si el mcd ya es 1 se para
break
return resultado 

mcd(15,63,57,123,987) 
3
mcd(2,4,6) 
2
mcd(0,2,-4,-15) 
1

Dentro de la definición las variables son locales y los argumentos también. Esto quiere decir que las variables pueden tener el mismo nombre que las
globales de la hoja de trabajo, pero los valores que tengan previamente no se tienen en cuenta. Una vez ejecutada la función, las variables locales
utilizadas se resetean y liberan de forma transparente al usuario (es como si nunca hubieran existido).

x = 0
y = 1
def f(x):
y = 'soy y'
print 'x =', x
print 'y =', y

f('soy x') 
x = soy x
y = soy y
print x, y 
0 1

Cambio de base de numeración

Sage tiene una función para obtener la expresión de un número x en una base b. Esta función es x.digits(base=b). También tiene un método que
transforma un entero en binario que se escribe como x.binary() y una función que hace esencialmente lo mismo: bin(x).

Ejercicios propuestos

1) Expresa el número 2014 en base 2, 3, 4, 5, 8 y 16.

2) Define una función que te permita obtener la expresión en base b (an , an−1 , … , a1 , a0 )b de un número x donde
x = an bn + an−1 bn−1 + ⋯ + a1 b + a0 . Por ejemplo, que al pedirle escribir 7 en base 3 se obtenga 21. Para ello te será útil saber que si tienes una
lista x, x.reverse() es la lista x con los elementos en orden inverso.

3) Encuentra, si existen, las soluciones positivas de las siguientes ecuaciones diofánticas. Puedes crear una función que dé las soluciones, para lo que
tendrás que usar la función de SAGE xgcd( ):

1. 7x+13y=147,
2. 48x+2y=40,
3. 30x+13y=3600,
4. 13x + 10y = 365,
5. 712x + 1027y = 2451.

4) Encuentra, si existen, las soluciones positivas de las ecuaciones diofánticas

1. 6x + 15y + 10z = 173,

3 de 4
2. 35x + 55y + 77z = 1.

Errores en aproximaciones
SAGE tiene muchas ventajas respecto a una calculadora. Una de ellas es que trabaja con más precisión. La función N(x, prec=, digits=) tiene  tres
argumentos. El primero, x, es el número del cual queremos saber su expresión, el segundo nos permite dar la precisión en bits de dicho número x, y el
tercero nos da la precesión con el número de dígitos. Si no ponemos ningún argumento nos dará el número x con 15 dígitos de precisión.
Evidentemente solo podemos usar a la vez dos argumentos de la función.

Así por ejemplo:

N(pi) 
3.14159265358979
N(e) 
2.71828182845905
N(200/3) 
66.6666666666667
N(e+pi) 
5.85987448204884
N(e,prec=23) 
2.71828
N(e, digits=40) 
2.718281828459045235360287471352662497757

Ejercicio propuesto

1) Comprueba que el contraejemplo de Homer Simpson sobre el último teorema de Fermat es falso: 398712 + 436512 = 447212 . Pero, ¿qué ocurre si
trabajamos solo con 8 cifras de precisión como en ciertas calculadoras?

4 de 4

También podría gustarte