Генерация случайного элемента в $GF(2^x)$ в NTL

Я пытаюсь изучить часть функциональности NTL, связанной с конечной полевой арифметикой, но происходит нечто странное. Я пытаюсь сгенерировать 2 случайных элемента в поле $GF(2^8)$ и делать с ними сложение и вычитание. Но кажется, что два "случайных" элемента, которые я получаю, равны при каждом выполнении тестовой программы. Вы даете какую-нибудь идею?

Мой тестовый код:

void test3(long n) {
    NTL::GF2X P;
    NTL::BuildIrred(P, n);
    // P is now x^2+x+1, this is irreducable since P(1)=1 and P(0)=1
    NTL::GF2E::init(P);

    NTL::GF2E xx = NTL::random_GF2E();
    NTL::GF2E yy = NTL::random_GF2E();

    std::cout << "xx: " << xx << std::endl; // Prints something like "[0 1]"
    std::cout << "yy: " << yy << std::endl; // Prints something like "[0 1]"

    xx += yy;
    std::cout << "xx: " << xx << std::endl; // Prints something like "[0 1]"
    xx -= yy;
    std::cout << "xx: " << xx << std::endl; // Prints something like "[0 1]"
    xx -= yy;
    std::cout << "xx: " << xx << std::endl; // Prints something like "[0 1]"
}

Вывод тестовой программы при запуске несколько раз:

~\Release>test.exe
xx: [0 1 0 0 1 0 0 1]
yy: [0 1 0 0 1]
xx: [0 0 0 0 0 0 0 1]
xx: [0 1 0 0 1 0 0 1]
xx: [0 0 0 0 0 0 0 1]

~\Release>test.exe
xx: [0 1 0 0 1 0 0 1]
yy: [0 1 0 0 1]
xx: [0 0 0 0 0 0 0 1]
xx: [0 1 0 0 1 0 0 1]
xx: [0 0 0 0 0 0 0 1]

~\Release>test.exe
xx: [0 1 0 0 1 0 0 1]
yy: [0 1 0 0 1]
xx: [0 0 0 0 0 0 0 1]
xx: [0 1 0 0 1 0 0 1]
xx: [0 0 0 0 0 0 0 1]

~\Release>test.exe
xx: [0 1 0 0 1 0 0 1]
yy: [0 1 0 0 1]
xx: [0 0 0 0 0 0 0 1]
xx: [0 1 0 0 1 0 0 1]
xx: [0 0 0 0 0 0 0 1]

1 ответ

Решение

Функции в NTL, которые используют случайность, используют гернераторы случайных чисел, которые вы можете найти в NTL/ZZ (Псевдослучайные числа).

Поэтому, если вы хотите, чтобы случайные элементы отличались от поля расширения, вы должны сначала установить начальное число для генератора случайных чисел. Если вы этого не сделаете, семя всегда одинаково, и поэтому вы всегда получаете одинаковую последовательность элементов.

Вы можете установить семена следующим образом:

NTL::SetSeed(conv<ZZ>((long) time(0)));

Обратите внимание: для этого вы должны #include <time.h>,

Это всего лишь предложение. Вы также можете использовать rand() или любой другой номер в качестве семени.

Другие вопросы по тегам