Каков стандартный способ построения полинома в NTL? - PullRequest
0 голосов
/ 30 июня 2018

В частности, я пытаюсь построить многочлен в Z_p [x] по модулю другого многочлена P, который требует использования ZZ_pE. Из библиотеки NTL конструкторы для ZZ_pE:

ZZ_pE(); // initial value 0
ZZ_pE(const ZZ_pE& a); // copy constructor
explicit ZZ_pE(const ZZ_p& a); // promotion
explicit ZZ_pE(long a); // promotion
ZZ_pE& operator=(const ZZ_pE& a); // assignment
ZZ_pE& operator=(const ZZ_p& a); // assignment
ZZ_pE& operator=(long a); // assignment

Как видите, вы можете построить ZZ_pE только из числа (ZZ_p или long) или из другого ZZ_pE. Поэтому единственные полиномы, которые я смог построить, имеют степень 0. Следующий код устанавливает модули p = 100001 и P = x ^ 4 - 1 и создает a ZZ_pE g = 5.

// Declare polynomial and coefficient moduli
ZZ_p::init(ZZ(100001));
ZZ_pX cyclo = ZZ_pX(INIT_MONO, 4) - 1;
ZZ_pE::init(cyclo);

// Construct g
ZZ_pE g = ZZ_pE(5);

Моя цель - сделать g полиномом высшей степени по моему выбору. Как мне это сделать?

Следующий вопрос: каков стандартный (наиболее эффективный) способ инициализации полинома (например, в ZZX)? Если бы я хотел построить f = x ^ 2 - 3x + 4, это мой текущий метод:

ZZ list[3] ={ZZ(4), ZZ(-3), ZZ(1)};
ZZX f;
for(int i=0; i<4; i++)
    f += ZZX(INIT_MONO, i, list[i]);

, т. Е. Путем добавления каждого члена полинома отдельно в цикл for. Кажется, что библиотека NTL могла бы выиграть от такого конструктора, как ZZX([4 -3 1]). Я что-то упускаю?

1 Ответ

0 голосов
/ 03 июля 2018

Для ZZX официальным способом является установка каждого коэффициента отдельно. Для этого есть функция

void SetCoeff(ZZX& x, long i, const ZZ& a)

Подробнее см. http://www.shoup.net/ntl/doc/ZZX.cpp.html.

Я не уверен, что это также работает для ZZ_pX.

...