Seção 2.6 Sage
Muchas de las propiedades de los objetos algebraicos que estudiaremos se pueden determinar a partir de propiedades de los enteros asociados. Sage tiene muchas y poderosas funciones para trabajar con enteros.
Subseção 2.6.1 Algoritmo de División
La instrucción a % b
entregará el resto de la división de \(a\) entre \(b\text{.}\) En otras palabras, el resultado es el entero \(r\) (único) tal que (1) \(0\leq r\lt b\text{,}\) y (2) \(a=bq+r\) para algún entero \(q\) (el cociente), como está garantizado por el Algoritmo de la División (Teorema 2.2.1). Entonces \((a-r)/b\) será igual a \(q\text{.}\) Por ejemplo,
También es posible obtener el cociente y el resto de forma simultánea con el método .quo_rem()
(cociente y resto).
Un resto cero indica divisibilidad. Así (a % b) == 0
resulta True
(verdadero) si \(b\) divide a \(a\text{,}\) y de otro modo resultará False
(falso).
El método .divides()
es otra opción.
Subseção 2.6.2 Máximo Común Divisor
El máximo común divisor de \(a\) y \(b\) se obtiene con el comando gcd(a, b)
, donde por ahora, \(a\) y \(b\) son enteros. Más tarde, \(a\) y \(b\) podrán ser otros objetos con una noción de divisibilidad y “tamaño,” tales como los polinomios. Por ejemplo,
Podemos usar el comando gcd
para determinar si un par de enteros son relativamente primos.
El comando xgcd(a,b)
(“eXtended GCD”) entrega un trío donde el primer elemento es el máximo común divisor de \(a\) y \(b\) (como con el comando gcd(a,b)
), y los siguientes dos elementos son valores de \(r\) y \(s\) tales que \(ra+sb=\gcd(a,b)\text{.}\)
Partes del trío pueden ser extraídas usando [ ]
(“indexando”) para acceder a los elementos del trío, empezando con el primero como índice 0
. Por ejemplo, Lo siguiente siempre debiese resultar en True
, aunque usted cambie los valores de a
y b
. Intente cambiando los valores de a
y b
abajo, para ver que el resultado siempre es True
.
Estudiar este bloque de código le permitirá descubrir formas de beneficiarse de las respuestas entregadas por Sage. Note que =
es la forma de asignar un valor a una variable, mientras que en la última línea, ==
es la forma de comparar si dos objetos son iguales.
Subseção 2.6.3 Primos y Factorización
El método .is_prime()
determinará si un entero es primo o no.
El comando random_prime(a, proof=True)
generará un número primo aleatorio entre \(2\) y \(a\text{.}\) Experimente ejecutando las celdas siguientes varias veces. (Reemplazando proof=True
por proof=False
acelerará la búsqueda, pero existirá una pequeñísima probabilidad de que el resultado no sea primo.)
El comando prime_range(a, b)
entrega una lista ordenada de todos los primos entre \(a\) y \(b-1\text{,}\) incluyendo posiblemente los extremos. Por ejemplo,
Los comandos next_prime(a)
y previous_prime(a)
son otras formas de obtener un primo de un tamaño deseado. Experimente en la celda siguiente (si la hay). (El símbolo #
, se usa para indicar un “comentario”, que no será evaluado por Sage. Puede borrar esta línea o empezar en la línea siguiente.)
Además de verificar si un entero es primo, o generar números primos, Sage también puede descomponer un número entero en sus factores primos, como se decribe en el Teorema Fundamental de la Aritmética (Teorema 2.2.7).
Así \(2600 = 2^3\times 5^2\times 13\) y esta es la única forma de escribir \(2600\) como producto de números primos (aparte de reordenar los primos en el producto).
Si bien Sage muestra la factorización de una forma que entendemos fácilmente, internamente la guarda como una lista de pares de enteros, consistiendo cada par de una base (un primo) y un exponente (entero positivo). Analice detalladamente los siguientes comandos, pues es un buen ejemplo para entender los resultados de Sage en forma de listas.
La siguiente celda revela la estructura interna de la factorización pidiendo la lista como tal. y mostramos como puede determinar el número de términos en la factorización usando el comando len()
(largo).
¿Puede extraer de a
los siguientes dos primos y sus exponentes?