Considere o módulo de números inteiros q
onde q
é primo, um gerador é qualquer número inteiro, de 1 < x < q
modo que x^1, x^2, ..., x^(q-1)
cubra todos q-1
os números inteiros entre 1
e q-1
. Por exemplo, considere o número inteiro do módulo 7 (que escrevemos como Z_7
). Em seguida, 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
abrange todos os valores, 3, 2, 6, 4, 5, 1
abrange todos os números inteiros, 1..6
conforme necessário.
A tarefa é escrever o código que recebe uma entrada n
e gera um gerador Z_n
. Você não pode usar nenhuma biblioteca ou biblioteca interna que faça isso para você, é claro.
A única restrição ao desempenho do seu código é que você deve testá-lo até o fim n = 4257452468389
.
Note que isso 2^n
significa 2
o poder de n
. Isso ^
representa exponenciação.
1 < x < q
facilita muito o desafio.Respostas:
Pitão,
1615 bytesSuíte de teste
Se p é a entrada, sabemos que g ^ (p-1) = 1 mod p, portanto, basta verificar se g ^ a! = 1 mod p para qualquer menor a. Mas a deve ser um fator de p-1 para que isso seja possível, e qualquer múltiplo de a com essa propriedade também terá essa propriedade, portanto, precisamos verificar apenas que g ^ ((p-1) / q)! = 1 mod p para todos os fatores primos q de p-1. Então, verificamos todos os números g em ordem crescente até encontrarmos um que funcione.
Explicação:
fonte
PtQ
parte).Mathematica, 52 bytes
Inspirado pela resposta de isaacg .
fonte
fonte