В pari-gp есть какие-нибудь вещи, чтобы отобразить конечное поле на его некоторое расширение?

Скажем, у меня есть многочлен p(x) над GF(2) и многочлен g(x) над GF(4). Например,

gf2 = gf(2, 1);
gf4 = gf(2, 2);

p2 = Polrev(vector(5, i, random(gf2)));
p4 = Polrev(vector(7, i, random(gf4)));

p2 * p4
>> ***   at top-level: p2*p4
>> ***                   ^---
>> *** _*_: inconsistent multiplication t_FFELT * t_FFELT.

Предоставляет ли pari-gp какие-либо средства для работы в этом случае? Если нет, как я могу сделать желаемое вложение?

1 ответ

Решение

К сожалению, решение за вами. PARI/GP не предоставляет ничего для вложения конечного поля. Для моих целей я разработал следующую функцию для вложения конечного поля:

get_gf_embedding(f: t_FFELT, g: t_FFELT) =
{
    if(f.p != g.p,
        error("** get_gf_embedding: fields are of different characterisitics")
    );
    if(f.p != g.p || poldegree(g.mod) % poldegree(f.mod) != 0,
        error("** get_gf_embedding: finite fields are not embeddable")
    );

    my (smaller_field_min_poly = subst(f.mod, variable(f.mod), 'x));
    my (larger_field_min_poly = subst(g.mod, variable(g.mod), 'y));
    my (subfield_prim =
        g^0 *
        subst(
            polrootsff(smaller_field_min_poly, f.p, larger_field_min_poly)[1].pol,
            'y,
            g
        )
    );
    embedding(elt) =
        subfield_prim^0 * subst((f^0 * elt).pol, variable((f^0 * elt).pol), subfield_prim)
};

Алгоритмические подробности см. По http://johnkerl.org/doc/ffcomp.pdf (раздел 5.11). Используя приведенный выше код, вы должны переписать свой код следующим образом:

embed = get_gf_embedding(gf2, gf4);
Polrev(apply(embed, Vecrev(p2))) * p4
Другие вопросы по тегам