Знайдіть число, яке генерує всі цілі числа mod q


9

Розглянемо модуль цілих чисел, qде qпростий, генератор - це будь-яке ціле число, 1 < x < qяке x^1, x^2, ..., x^(q-1)охоплює всі q-1цілі числа між 1і q-1. Наприклад, розглянемо цілий модуль 7 (який ми запишемо як Z_7). Потім 3, 3^2 mod 7 = 2, 3^3 = 27 mod 7 = 6, 3^4 = 81 mod 7 = 4, 3^5 = 243 mod 7 = 5, 3^6 = 729 mod 7 = 1охоплює всі значення, 3, 2, 6, 4, 5, 1охоплює всі цілі числа, 1..6як потрібно.

Завдання полягає в тому, щоб написати код, який приймає вхід nі виводить генератор для Z_n. Ви не можете використовувати будь-яку вбудовану бібліотеку чи бібліотеку, яка робить це для вас, звичайно.

Єдине обмеження в роботі вашого коду полягає в тому, що ви повинні його протестувати до завершення n = 4257452468389.

Зауважте, що це 2^n означає 2силу n. Тобто являє ^собою експоненцію.


Хм ... 1 < x < qробить виклик набагато простішим ІМО.
Ерік Аутгольфер

@EriktheOutgolfer Я не впевнений, що знаю, що ти маєш на увазі? Це лише усі цілі числа, які не дорівнюють 0 або 1.

Я маю на увазі, що це простіше, ніж те, що багато хто, напевно, думає ... або, можливо, якийсь неактивний момент на PPCG.
Erik the Outgolfer

3
Але я вважаю, що вимагати від людей тестування його до завершення на великій кількості непотрібно ... в основному tio буде просто помилкою пам'яті.
Erik the Outgolfer

@Lembik Чи є випадок, коли немає генератора для певної кількості? Деякі тестові випадки будуть добре.
Містер Xcoder

Відповіді:


13

Pyth, 16 15 байт

f-1m.^T/tQdQPtQ

Тестовий набір

Якщо p - вхід, ми знаємо, що g ^ (p-1) = 1 mod p, тому нам просто потрібно перевірити, що g ^ a! = 1 mod p для будь-яких менших a. Але повинен бути фактором p-1, щоб це стало можливим, і будь-який кратний a з цим властивістю також матиме це властивість, тому нам потрібно лише перевірити, що g ^ ((p-1) / q)! = 1 mod p для всіх простих факторів q p-1. Отже, ми перевіряємо всі цілі g у порядку зростання, поки не знайдемо те, що працює.

Пояснення:

f-1m.^T/tQdQPtQ
f                  Return the first value T such that the following is truthy:
            PtQ    Take the prime factorization of the input - 1.
   m               Map those prime factors to
       /tQd        Take the input - 1 divided by the factor
    .^T    Q       Raise T to that exponent mod input,
                   performed as modular exponentiation, for performance.
 -1                Check that 1 is not found among the results.

Досить дивовижно!

Чи виконує ваш код факторизацію?

@ Лембік Це ( PtQчастина).
Ерік Аутгольфер


-3
%MATLAB CODE
%Program to generate Z_n for an integer n
n = input('Enter a number to find modulo')
q = input ('Enter a prime number greater than the number you wished to find modulo')
if n>=q 
   fprintf('Error')
   exit(1)
end
for R=1:q-1
    fprintf(rem(n.^R, q))
    fprintf('\n')
end

1
Це не вирішує правильну проблему. Наприклад, ваш код повинен взяти один вхід і дати один вихід.

1
Крім того, цей код зовсім не гольф. Код для гольфу повинен бути якомога короткішим, щоб ви могли видалити вхідний текст і пробіли навколо знаків рівності тощо.
Товариш SparklePony

3
@ComradeSparklePony Я думаю, що першою проблемою, яка не вирішує правильну проблему, слід вирішити спочатку :)
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.