Soy un gran admirador de la teoría de números. Una gran cosa en la teoría de números es la aritmética modular; la definición es si y solo si . Una cosa divertida es elevar a los poderes: especialmente cuando el módulo es un número primo. En particular, se ha demostrado que si y son relativamente primos (no comparten factores comunes además de ), entonces existe un número tal que .
Explicaré cuál es el ejercicio con un ejemplo. Tomemos un módulo . Una posible salida del programa o función sería:
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 fila es una lista de las potencias del primer número en esa fila: la primera fila es , que es equivalente a módulo . La segunda fila del cuadrado de arriba son las potencias de , etcétera, hasta la última fila, que son solo potencias de .
Este es un módulo cuadrado mágico porque:
- El cuadrado es simétrico; que es, la ésima columna es el mismo que el -ésimo renglón.
- Todos los valores a aparecen al menos una vez.
A continuación se muestra la única otra salida válida para , comenzando con potencias 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
El reto
Cree una función o programa que, dado un primo, p
genere un cuadrado de módulo mágico, es decir, un cuadrado con longitudes laterales p-1
, de modo que cada fila sea una lista de las potencias consecutivas del primer elemento de la fila, y lo mismo para las columnas. Todos los números entre 0
y p
deben aparecer, y el cuadrado solo puede contener números en ese rango.
La entrada es un número o una cadena, y la salida puede ser ascii, una matriz, una matriz de matrices (cualquier formato razonable).
Este es el código de golf, por lo que gana el código más corto.
fuente
Respuestas:
Jalea ,
1310 bytes-3 gracias a Nick Kennedy
Se siente comoel código repetidodebe seres capaz de golf, pero mehanno logródque ...Pruébalo en línea! (pie de página bonitos formatos como una cuadrícula)
¿Cómo?
fuente
Carbón , 36 bytes
Pruébalo en línea! El enlace es a la versión detallada del código. Nota: espacio final. Explicación:
Crear una
p-1
porp-1
serie de potencias de1..p-1
los índices1..p-1
(módulop
).Mapa sobre una de las filas que tiene exactamente una
1
.Reorganice las filas en el orden dado por la fila seleccionada y formatee la salida.
fuente
J ,
353231 bytesPruébalo en línea!
fuente
Wolfram Language (Mathematica) ,
4643 bytesPruébalo en línea!
-3 gracias a alephalpha
fuente
JavaScript (ES7),
9186 bytesEsta versión intenta calcular los poderes antes de aplicar el módulo y fallará para debido a la pérdida de precisión. De lo contrario, utiliza la misma lógica que la versión comentada a continuación.p≥11
Pruébalo en línea!
JavaScript (ES6),
9287 bytesEsta versión utiliza exponenciación modular para admitir (mucho) valores de entrada más altos.
Pruébalo en línea!
¿Cómo?
Encontrar la primera fila
Dado , usamos la función auxiliar para calcular para .1≤k<p g ak(n)=knmodp 1≤n<p
Buscamos tal que solo haya un valor tal que . Hacemos eso ordenando la matriz y probando si el 2º elemento es mayor que .k n ak(n)=1 1
Esto funciona incluso en orden lexicográfico, que es el comportamiento predeterminado de
sort()
, porque:Ejemplo:
Para :p=17
Construyendo la matriz
Una vez que hemos encontrado , invocamos nuevamente (para recuperar la versión no ordenada de la matriz) e invocamos en cada elemento de para construir las filas de la matriz.k g(k) g g(k)
Esta parte se puede escribir simplemente como:
fuente
.indexOf(1)>p-3
ahorra 3 bytes más.every
.Zsh ,
11790 bytesPruébalo en línea!Pruébalo en línea!Que Dios tenga piedad de mi alma. Aquí hay muchas malas prácticas, déjenme explicar al menos al mayor infractor:
Ejemplo para
b=4
:Finalmente, donde
$c
aparece en el resto del programa, los elementos de la matriz se evalúan comoeval set -- ....
.Por último,
${#${(u)@}}
cuenta los elementos únicos en los parámetros posicionales (es decir, ¿hay un ciclo / hay1
s?)Comentarios relevantes a la respuesta de 117 bytes a continuación.
Retos que debemos superar:
${#${(M)a:#1}
::#
elimina la coincidencia e(M)
invierte la coincidencia. Entonces, esto se expandirá al número (${# }
) de1
s en la matriz. Desafortunadamente, esta expansión no funciona bien con la aritmética para el bucle que usamos aquí. Si lo hiciera, podría potencialmente salvar un byte.${${:-1}:*a}
: Esta es la intersección del conjunto entre el singleton1
y el conjuntoa
. Esto se expandirá al single1
si se encuentra en la matriz. Usando esta opción, guardamos un personaje aquí, pero perdemos 1 en general teniendo que posponer la adición de la1
s en la última fila y columna hasta el final.fuente
Perl 6 ,
6557 bytesPruébalo en línea!
Probablemente haya alguna forma de generar el cuadrado en sí, pero esto hace el mismo proceso descrito en la pregunta, ordenando las listas por sus posiciones en la primera lista que es solo una permutación de 1 a input-1. Devuelve como una lista de listas.
Por cierto, hay muchas maniobras, tratando de sortear algunas de las limitaciones molestas de Perl 6 que implican secuencias frente a matrices y variables anónimas.
Explicación:
fuente
Python 2 , 108 bytes
Pruébalo en línea!
fuente
print
lugar de volver?05AB1E ,
1916 bytes-3 bytes gracias a @Emigna .
Pruébelo en línea (el pie de página es imprimir una bonita lista 2D).
Explicación:
fuente
LεI<LmI%}ÐΘOÏн<è
por 16 bytes.<è
que habría sido suficiente en lugar de loUΣXyk
que tenía.Wolfram Language (Mathematica) , 67 bytes
Pruébalo en línea!
fuente
Pari / GP , 48 bytes
Pruébalo en línea!
fuente
APL (NARS), 29 caracteres, 58 bytes
prueba:
fuente