Hay un sentido en el que estás tratando de hacer las cosas de una manera no magma, y eso puede causarte dificultades. En cada caso estás separando el polinomio del campo de interés. En Magma, uno generalmente definiría primero el polinomio sobre ese campo y luego aplicar la función obvia. Por ejemplo, empezaré con un par de polinomios y trabajaré con algunos de esos ejemplos. Observa que las líneas que empiezan con ">" representan la entrada (el ">" es el prompt de Magma) y las otras muestran la salida de Magma del comando anterior.
> Qx<x> := PolynomialRing(Rationals());
> Ky<y> := PolynomialRing(GF(11));
> f := x^3 + x + 1;
> g := y^3 + y + 1;
Puede ser tentador pensar en f y g como el "mismo" polinomio, pero no es así; f se define sobre el campo racional (y las operaciones sobre f utilizará este campo cuando sea necesario), mientras que g se define sobre el campo finito con 11 elementos (y las operaciones sobre g será en este contexto).
1. Factorización
> Factorization(f);
[
<x^3 + x + 1, 1>
]
> Factorization(g);
[
<y + 9, 1>,
<y^2 + 2*y + 5, 1>
]
El resultado de la factorización es una secuencia de tuplas. Como se puede ver, no ha sido necesario especificar el anillo de interés para la factorización, ya que se ha deducido del anillo de definición del polinomio.
2. Campo divisorio
> SplittingField(f);
Number Field with defining polynomial x^6 + 6*x^4 + 9*x^2 + 31 over the
Rational Field
> SplittingField(g);
Finite field of size 11^2
(En realidad, he eludido algunas salidas aquí -- en el primer caso, hay un segundo valor de retorno, que es una secuencia de las raíces de f levantado en el campo de la división).
3. Grupo de Galois
> GaloisGroup(f);
Symmetric group acting on a set of cardinality 3
Order = 6 = 2 * 3
(De nuevo, he eludido algunas salidas, que consisten en p -adicas a las raíces y algunos datos de Galois asociados utilizados por el algoritmo).
4. Raíces
> Roots(f);
[]
> Roots(g);
[ <2, 1> ]
5. Correspondencias
Me temo que responder completamente a lo anterior excede mis conocimientos "de la cabeza". Pero ciertamente la red de subcampos es computable.
> L := SplittingField(f);
> Subfields(L);
[
<Number Field with defining polynomial x^6 + 6*x^4 + 9*x^2 + 31 over the
Rational Field, Mapping from: FldNum: L to FldNum: L>,
<Number Field with defining polynomial x^2 + 31 over the Rational Field,
Mapping from: Number Field with defining polynomial x^2 + 31 over the
Rational Field to FldNum: L>,
<Number Field with defining polynomial x^3 + 3*x^2 - 31 over the Rational
Field, Mapping from: Number Field with defining polynomial x^3 + 3*x^2 - 31
over the Rational Field to FldNum: L>,
<Number Field with defining polynomial x^3 + 3*x^2 - 31 over the Rational
Field, Mapping from: Number Field with defining polynomial x^3 + 3*x^2 - 31
over the Rational Field to FldNum: L>,
<Number Field with defining polynomial x^3 - 6*x^2 + 9*x - 31 over the
Rational Field, Mapping from: Number Field with defining polynomial x^3 -
6*x^2 + 9*x - 31 over the Rational Field to FldNum: L>
]
> A := SubfieldLattice(L);
> A;
Subfield Lattice of L
[1] Rational Field
[2] Subfield generated by a root of x^2 + 31
[3] Subfield generated by a root of x^3 + 3*x^2 - 31
[4] Subfield generated by a root of x^3 + 3*x^2 - 31
[5] Subfield generated by a root of x^3 - 6*x^2 + 9*x - 31
[6] Subfield generated by a root of x^6 + 6*x^4 + 9*x^2 + 31
> MaximalSubfields(A[6]);
[ 2, 3, 4, 5 ]
> MinimalOverfields(A[1]);
[ 2, 3, 4, 5 ]
Por lo tanto, se puede ver que la red es bastante simple en este caso.
Ahora, para responder a tu pregunta tal y como está escrita, necesitaríamos también poder convertir un polinomio de un anillo a otro. Eso es bastante fácil de varias maneras, utilizando varias de las herramientas de coerción de Magma. Una forma es evaluar el polinomio en el trascendental desde un anillo de polinomios apropiado, pero esto no siempre funciona si los dos anillos no están sensiblemente relacionados. Por ejemplo, no hay una superestructura sensata para Q y F11 así que esto falla:
> Evaluate(f, y);
>> Evaluate(f, y);
^
Runtime error in 'Evaluate': Arguments have incompatible coefficient rings
Pero si quisiéramos levantar f a un polinomio sobre su campo de división, eso podría funcionar:
> L := SplittingField(f);
> P<t> := PolynomialRing(L);
> Evaluate(f, t);
t^3 + t + 1
Otra opción es utilizar ChangeRing, que a veces funciona en casos en los que Evaluar no lo haría:
> ChangeRing(f, GF(11));
y^3 + y + 1
> ChangeRing(f, L);
t^3 + t + 1
Sin embargo, si Evaluate se queja, es probable que estés haciendo algo poco sensato en primer lugar.
Así que, utilizando todo lo anterior, podemos producir funciones como las que pediste para los cuatro primeros casos. Sin embargo, todas ellas son finas envolturas alrededor de funciones existentes subyacentes, y sería mejor crear los polinomios sobre los anillos deseados en primer lugar.
1. Factorización
En realidad, esto resulta estar ya presente como otra forma de llamar a la Factorización:
> Factorization(f, L);
[
<t + 1/18*(-L.1^4 - 5*L.1^2 - 9*L.1 - 4), 1>,
<t + 1/18*(-L.1^4 - 5*L.1^2 + 9*L.1 - 4), 1>,
<t + 1/9*(L.1^4 + 5*L.1^2 + 4), 1>
]
2. Campo divisorio
Aquí necesitamos la envoltura simple:
> mySplittingField := func<pol, ring | SplittingField(ChangeRing(pol, ring))>;
O, evitando la notación abreviada func:
> mySplittingField := function(pol, ring)
> return SplittingField(ChangeRing(pol, ring));
> end function;
3. Grupo de Galois
> myGaloisGroup := func<pol, ring | GaloisGroup(ChangeRing(pol, ring))>;
> myGaloisGroup(f, L);
Permutation group acting on a set of cardinality 3
Order = 1
4. Raíces
Esto también resulta estar presente como una alternativa opcional:
> Roots(f, L);
[
<1/9*(-L.1^4 - 5*L.1^2 - 4), 1>,
<1/18*(L.1^4 + 5*L.1^2 - 9*L.1 + 4), 1>,
<1/18*(L.1^4 + 5*L.1^2 + 9*L.1 + 4), 1>
]