Eu sou um grande fã da teoria dos números. Uma grande coisa na teoria dos números é a aritmética modular; a definição sendo se e somente se . Uma coisa divertida a se fazer é aumentar os poderes: especialmente quando o módulo é um número primo. Em particular, ficou provado que se e são relativamente primos (não compartilham fatores comuns além de ), existe um número tal que .
Vou explicar o que é o exercício por um exemplo. Vamos dar um módulo . Uma saída possível do programa ou função seria:
3 2 6 4 5 1
2 4 1 2 4 1
6 1 6 1 6 1
4 2 1 4 2 1
5 4 6 2 3 1
1 1 1 1 1 1
Cada linha é uma lista dos poderes do primeiro número nessa linha: a primeira linha é , o que equivale a módulo . A segunda linha do quadrado acima são as potências de , etc., até a última linha, que são apenas potências de 1 .
Este é um quadrado de módulo mágico porque:
- O quadrado é simétrico; isto é, a ésima coluna é a ésima linha.
- Todos os valores de a aparecem pelo menos uma vez.
Abaixo está a única outra saída válida para , começando com potências de :
5 4 6 2 3 1
4 2 1 4 2 1
6 1 6 1 6 1
2 4 1 2 4 1
3 2 6 4 5 1
1 1 1 1 1 1
O desafio
Crie uma função ou programa que, dado um número primo, p
produza um quadrado de módulo mágico, ou seja, um quadrado com comprimentos laterais p-1
, de modo que cada linha seja uma lista dos poderes consecutivos do primeiro elemento na linha e o mesmo para as colunas. Todos os números entre 0
e p
devem ocorrer, e o quadrado pode conter apenas números nesse intervalo.
A entrada é um número ou uma string e a saída pode ser ascii, uma matriz, uma matriz de matrizes (qualquer formato razoável).
Isso é código-golfe, então o código mais curto vence.