Je suis un grand fan de la théorie des nombres. Une grande chose dans la théorie des nombres est l'arithmétique modulaire; la définition étant si et seulement si . Une chose amusante à faire est d'augmenter les pouvoirs: surtout lorsque le module est un nombre premier. En particulier, il a été prouvé que si et sont relativement premiers (ne partagent aucun facteur commun à part ) alors il existe un nombre tel que .
Je vais expliquer ce qu'est l'exercice par un exemple. Prenons un module . Une sortie possible du programme ou de la fonction serait:
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
Chaque ligne est une liste des puissances du premier nombre de cette ligne: la première ligne est , ce qui équivaut à module . La deuxième rangée du carré ci-dessus correspond aux puissances de , etc., jusqu'à la dernière rangée, qui ne sont que des puissances de .
C'est un carré modulo magique car:
- Le carré est symétrique; c'est-à-dire que la ème colonne est la même que la ème ligne.
- Toutes les valeurs à apparaissent au moins une fois.
Voici la seule autre sortie valide pour , en commençant par des puissances 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
Le défi
Créez une fonction ou un programme qui donne un nombre premier p
un carré modulo magique, c'est-à-dire un carré avec des longueurs latérales p-1
, de sorte que chaque ligne est une liste des puissances consécutives du premier élément de la ligne, et la même chose pour les colonnes. Tous les nombres entre 0
et p
doivent apparaître, et le carré ne peut contenir que des nombres dans cette plage.
L'entrée est un nombre ou une chaîne, et la sortie peut être ascii, une matrice, un tableau de tableaux (tout format raisonnable).
C'est le code-golf, donc le code le plus court l'emporte.
la source
Réponses:
Gelée ,
1310 octets-3 merci à Nick Kennedy
Feels commele code répétédevrait êtreest en mesure de golf, maisj'ontne sont pas parvenusdelle ...Essayez-le en ligne! (joli pied de page sous forme de grille)
Comment?
la source
Fusain , 36 octets
Essayez-le en ligne! Le lien est vers la version détaillée du code. Remarque: Espace de fin. Explication:
Créez un
p-1
parp-1
tableau de puissances d'1..p-1
indices1..p-1
(modulop
).Mappez sur l'une des lignes qui en a exactement une
1
.Réorganisez les lignes dans l'ordre donné par la ligne sélectionnée et formatez la sortie.
la source
J ,
353231 octetsEssayez-le en ligne!
la source
Wolfram Language (Mathematica) ,
4643 octetsEssayez-le en ligne!
-3 grâce à alephalpha
la source
JavaScript (ES7),
9186 octetsCette version tente de calculer les puissances avant d'appliquer le modulo et échouera pourp≥11 cause d'une perte de précision. Il utilise par ailleurs la même logique que la version commentée ci-dessous.
Essayez-le en ligne!
JavaScript (ES6),
9287 octetsCette version utilise l'exponentiation modulaire pour prendre en charge des valeurs d'entrée (beaucoup) plus élevées.
Essayez-le en ligne!
Comment?
Trouver la première ligne
Étant donné1≤k<p , nous utilisons la fonction d'aide g pour calculer ak(n)=knmodp pour 1≤n<p .
Nous cherchonsk tel qu'il n'y a qu'une seule valeur n telle que ak(n)=1 . Nous faisons cela en triant le tableau et en testant si le 2eélément est supérieur à1 .
Cela fonctionne même dans l'ordre lexicographique - qui est le comportement par défaut de
sort()
- car:Exemple:
Pourp=17
Construire la matrice
Cette partie peut simplement s'écrire:
la source
.indexOf(1)>p-3
économise plus de 3 octets.every
.Zsh ,
11790 octetsEssayez-le en ligne!Essayez-le en ligne!Que Dieu ait pitié de mon âme. Il y a beaucoup de mauvaises pratiques ici, permettez-moi d'expliquer au moins le plus gros délinquant:
Exemple pour
b=4
:Enfin, là où
$c
apparaît dans le reste du programme, les éléments du tableau sont évalués commeeval set -- ....
.Enfin,
${#${(u)@}}
compte les éléments uniques dans les paramètres positionnels (ie: y a-t-il un cycle / y en a-t-il1
?)Commentaires relatifs à la réponse de 117 octets ci-dessous.
Les défis que nous devons surmonter:
${#${(M)a:#1}
::#
supprime la correspondance et(M)
inverse la correspondance. Donc, cela va s'étendre au nombre (${# }
) de1
s dans le tableau. Malheureusement, cette extension ne fonctionne pas bien avec l'arithmétique de boucle que nous utilisons ici. Si c'était le cas, cela pourrait potentiellement sauver un octet.${${:-1}:*a}
: Il s'agit de l'intersection de l'ensemble entre le singleton1
et l'ensemblea
. Cela s'étendra au single1
s'il est trouvé dans le tableau. En utilisant cette option, nous enregistrons un caractère ici, mais perdons 1 dans l'ensemble en retardant l'ajout des1
s dans la dernière ligne et colonne jusqu'à la fin.la source
Perl 6 ,
6557 octetsEssayez-le en ligne!
Il y a probablement un moyen de simplement sortir le carré lui-même, mais cela fait le même processus que celui décrit dans la question, en triant les listes par leurs positions dans la première liste qui n'est qu'une permutation de 1 à input-1. Renvoie sous forme de liste de listes.
BTW, il y a beaucoup de jockey autour, essayant de contourner certaines limitations ennuyeuses de Perl 6 impliquant des séquences vs des tableaux et des variables anonymes.
Explication:
la source
Python 2 , 108 octets
Essayez-le en ligne!
la source
print
au lieu de revenir?05AB1E ,
1916 octets-3 octets grâce à @Emigna .
Essayez-le en ligne (le pied de page consiste à imprimer la liste 2D).
Explication:
la source
LεI<LmI%}ÐΘOÏн<è
pour 16 octets.<è
cela aurait suffi au lieu de ceUΣXyk
que j'avais.Wolfram Language (Mathematica) , 67 octets
Essayez-le en ligne!
la source
Pari / GP , 48 octets
Essayez-le en ligne!
la source
APL (NARS), 29 caractères, 58 octets
tester:
la source