Enteros, congruencias, polinomios y cuerpos finitos
Enteros
Los enteros en SAGE se escriben normalmente (en base 10):
Algunas funciones que hemos visto en clase sobre los enteros:
El Teorema Chino del resto para los enteros:
Obsérvese que SAGE implementa el Teorema Chino del Resto generalizado, incluyendo los casos en que los módulos no son coprimos pero existe solución:
---------------------------------------------------------------------------
ValueError Traceback (most recent call last)
<ipython-input-10-7da7130c144e> in <module>()
1 # No existe solución:
----> 2 s=crt([Integer(4),Integer(0),Integer(1),Integer(5)], [Integer(5),Integer(12),Integer(2),Integer(19)])
/projects/sage/sage-7.5/local/lib/python2.7/site-packages/sage/arith/misc.pyc in crt(a, b, m, n)
2950 """
2951 if isinstance(a, list):
-> 2952 return CRT_list(a, b)
2953 if isinstance(a, (int, long)):
2954 a = Integer(a) # otherwise we get an error at (b-a).quo_rem(g)
/projects/sage/sage-7.5/local/lib/python2.7/site-packages/sage/arith/misc.pyc in CRT_list(v, moduli)
3033 m = moduli[0]
3034 for i in range(1, len(v)):
-> 3035 x = CRT(x,v[i],m,moduli[i])
3036 m = lcm(m,moduli[i])
3037 return x%m
/projects/sage/sage-7.5/local/lib/python2.7/site-packages/sage/arith/misc.pyc in crt(a, b, m, n)
2956 q, r = (b - a).quo_rem(g)
2957 if r != 0:
-> 2958 raise ValueError("No solution to crt problem since gcd(%s,%s) does not divide %s-%s" % (m, n, a, b))
2959 return (a + q*alpha*m) % lcm(m, n)
2960
ValueError: No solution to crt problem since gcd(60,2) does not divide 24-1
Algunas otras funciones que usaremos pronto:
Se pueden escribir enteros en otras bases, usando el anillo de los enteros (ZZ).
Un problema que tendremos que resolver varias veces: ¿Cuántos dígitos tiene un entero a en base b?
O bien...
## Congruencias: .
Vamos ahora a definir el anillo de congruencias . Empecemos por el caso .
¿Cómo se distingue entre un entero y un entero módulo 28?
Esta diferencia puede tener su importancia:
---------------------------------------------------------------------------
MemoryError Traceback (most recent call last)
<ipython-input-36-cacf5ef8a786> in <module>()
----> 1 a**(Integer(2432902008176640001))
/projects/sage/sage-7.5/src/sage/rings/integer.pyx in sage.rings.integer.Integer.__pow__ (/projects/sage/sage-7.5/src/build/cythonized/sage/rings/integer.c:14196)()
2045 cdef Integer x = PY_NEW(Integer)
2046
-> 2047 sig_on()
2048 mpz_pow_ui(x.value, (<Integer>self).value, nn if nn > 0 else -nn)
2049 sig_off()
MemoryError: failed to allocate 1292479191843840040 bytes
Algunas funciones propias de las congruencias:
---------------------------------------------------------------------------
ZeroDivisionError Traceback (most recent call last)
<ipython-input-43-fb780ec47aa8> in <module>()
----> 1 c**(-Integer(1))
/projects/sage/sage-7.5/src/sage/rings/finite_rings/integer_mod.pyx in sage.rings.finite_rings.integer_mod.IntegerMod_int.__pow__ (/projects/sage/sage-7.5/src/build/cythonized/sage/rings/finite_rings/integer_mod.c:29676)()
2604 res = mod_pow_int(self.ivalue, long_exp, self.__modulus.int32)
2605 if invert:
-> 2606 return ~self._new_c(res)
2607 else:
2608 return self._new_c(res)
/projects/sage/sage-7.5/src/sage/rings/finite_rings/integer_mod.pyx in sage.rings.finite_rings.integer_mod.IntegerMod_int.__invert__ (/projects/sage/sage-7.5/src/build/cythonized/sage/rings/finite_rings/integer_mod.c:29810)()
2622 x = self.__modulus.inverses[self.ivalue]
2623 if x is None:
-> 2624 raise ZeroDivisionError("Inverse does not exist.")
2625 else:
2626 return x
ZeroDivisionError: Inverse does not exist.
Algunas funciones del anillo .
## Cuerpos finitos
### Cuerpos
---------------------------------------------------------------------------
ValueError Traceback (most recent call last)
<ipython-input-50-0b87355f379d> in <module>()
----> 1 F18 = GF(Integer(18)) # ja, ja
/projects/sage/sage-7.5/src/sage/structure/factory.pyx in sage.structure.factory.UniqueFactory.__call__ (/projects/sage/sage-7.5/src/build/cythonized/sage/structure/factory.c:1856)()
360 False
361 """
--> 362 key, kwds = self.create_key_and_extra_args(*args, **kwds)
363 version = self.get_version(sage_version)
364 return self.get_object(version, key, kwds)
/projects/sage/sage-7.5/local/lib/python2.7/site-packages/sage/rings/finite_rings/finite_field_constructor.pyc in create_key_and_extra_args(self, order, name, modulus, names, impl, proof, check_irreducible, **kwds)
517 impl = 'pari_ffelt'
518 else:
--> 519 raise ValueError("the order of a finite field must be a prime power")
520
521 # Determine modulus.
ValueError: the order of a finite field must be a prime power
### Cuerpos finitos no primos:
Veamos cómo se define el cuerpo F como una extensión algebraica , donde verifica un cierto polinomio irreducible f.
Anillos de polinomios
Dado un anillo , la función PolynomialRing construye un anillo de polinomios sobre . Hay que darle los nombres de la variables como antes.
Los dominios euclídeos tienen Bezout y TCR:
Ejercicios
Todos los ejercicios siguientes son de tests de SAGE de años anteriores.
Ejercicio
Usando el Teorema Chino del Resto en , calcule el polinomio interpolador de los puntos
Usando el Teorema Chino del Resto en , calcule el polinomio interpolador de los puntos
Se recuerda que
Ejercicio Defina en SAGE y dé el polinomio mínimo de un generador de la extensión. Sabiendo que list(F) es una lista de los elementos del cuerpo finito (¡incluyendo el cero!), calcule una lista con las parejas de cada elemento no nulo y su inverso.
Ejercicio Defina una función fi(n) (sin usar euler_phi) que calcule por el procedimiento de contar los números menores que coprimos con . Calcule fi(10).
Ejercicio Sabemos que la ecuación tiene solución si y sólo si divide a~, y en este caso, las soluciones son $$ x=x_{0}+k \frac{m}{d}, \quad k=0,\dots, d,\quad x_{0}=\frac{b}{d}\alpha, \quad\text{con $d=\alpha a+\beta mParseError: KaTeX parse error: Expected 'EOF', got '}' at position 1: }̲. $
Calcule todas las soluciones de la ecuación .
Escriba el algoritmo en forma de función SAGE.