Practica 2
Practica 2
Practica 2
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.
i=1
j=2
Comparación de igualdad:
i==j
False
Comparación de inferioridad:
i<j
True
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
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
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):
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
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
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.
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.
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