Un champ en mathématiques est un ensemble de nombres, avec des opérations d'addition et de multiplication définies dessus, de sorte qu'ils satisfont certains axiomes (décrits dans Wikipedia; voir aussi ci-dessous).
Un champ fini peut avoir p n éléments, où p
est un nombre premier et n
un nombre naturel. Dans ce défi, prenons p = 2
et n = 8
, créons donc un champ avec 256 éléments.
Les éléments du champ doivent être des entiers consécutifs dans une plage qui contient 0
et 1
:
- -128 ... 127
- 0 ... 255
- ou toute autre plage de ce type
Définissez deux fonctions (ou programmes, si c'est plus facile), a(x,y)
pour "l'addition" m(x,y)
abstraite , et pour la "multiplication" abstraite, de telle sorte qu'elles satisfassent les axiomes de champ:
- Cohérence:
a(x,y)
etm(x,y)
produit le même résultat lorsqu'il est appelé avec les mêmes arguments - Fermeture: Le résultat de
a
etm
est un entier dans la plage pertinente - Associativité: pour tout
x
,y
etz
dans la plage,a(a(x,y),z)
est égal àa(x,a(y,z))
; pareil pourm
- Commutativité: pour tout
x
ety
dans la plage,a(x,y)
est égal àa(y,x)
; pareil pourm
- Distributivité: pour tout
x
,y
etz
dans la plage,m(x,a(y,z))
est égal àa(m(x,y),m(x,z))
- Éléments neutres: pour tout élément
x
de la plage,a(0,x)
est égal àx
etm(1,x)
est égal àx
- Négation: pour toute
x
la gamme, il existe cey
quia(x,y)
est0
- Inverse: pour toute
x≠0
la gamme, il existe cey
quim(x,y)
est1
Les noms a
et ne m
sont que des exemples; vous pouvez utiliser d'autres noms ou fonctions sans nom. Le score de votre réponse est la somme des longueurs d'octets pour a
et m
.
Si vous utilisez une fonction intégrée, veuillez également décrire en mots le résultat qu'elle produit (par exemple, fournir une table de multiplication).
la source
a(2,1) = 3
, vous pourriez en avoira(2,1) = 5
tant que les axiomes ci-dessus sont satisfaits.a
n'a rien à faire avec l'ajout habituel auquel vous êtes habitué, par exemple dans le domaine des nombres rationnels.a=+
m=×
?m=×
Réponses:
Intel x86-64 + AVX-512 + GFNI, 11 octets
Utilise la nouvelle
GF2P8MULB
instruction sur les processeurs Ice Lake.la source
Python 2, 11 + 45 = 56 octets
Addition (11 octets):
Multiplication (45 octets):
Prend les numéros d'entrée dans la plage
[0 ... 255]
. L'addition est juste XOR au niveau du bit, la multiplication est la multiplication des polynômes avec des coefficients dans GF2 avec le paysan russe .Et pour vérifier:
la source
m(2,128)
ce qui donne 27 = 283 - 256, donc vous avez raison et le polynôme l'estx^8 + x^4 + x^3 + x + 1
.JavaScript (ES6), 10 + 49 = 59 octets
Le domaine est compris entre 0 et 255. Source .
la source
Hoon , 22 octets
Hoon a déjà une fonction
++ga
qui crée des champs de Galois, à utiliser dans l'implémentation AES. Cela renvoie un tuple de deux fonctions, au lieu d'utiliser deux programmes.Fonctionne dans le domaine
[0...255]
Suite de tests:
Publier une table de multiplication serait gigantesque, voici donc quelques tests aléatoires:
la source
Code machine IA-32, 22 octets
"Multiplication", 18 octets:
"Addition", 4 octets:
Cela étire un peu les règles: le code de "multiplication" manque de code de sortie de fonction; il repose sur le code "addition" qui est en mémoire juste après, afin qu'il puisse "tomber". Je l'ai fait pour diminuer la taille du code d'un octet.
Code source (peut être assemblé par
ml
MS Visual Studio):L'algorithme est le standard, impliquant le polynôme habituel
x^8 + x^4 + x^3 + x + 1
, représenté par le nombre hexadécimal1b
. Le code "multiplication" accumule le résultat dansedx
. Une fois terminé, il passe au code d'addition, qui le déplace verseax
(registre conventionnel pour conserver la valeur de retour); lexor
avececx
est un no-op, car à ce pointecx
est effacé.Une caractéristique particulière est la boucle. Au lieu de vérifier zéro
il utilise l'
loop
instruction dédiée . Mais cette instruction diminue le "compteur" de boucle avant de le comparer à 0. Pour compenser cela, le code l'augmente avant d'utiliser l'loop
instruction.la source
Mathematica 155 octets
la mise en oeuvre
vérification d'addition:
Plus:
NB Doit être capable d'utiliser n'importe lequel
{283, 285, 299, 301, 313, 319, 333, 351, 355, 357, 361, 369, 375, 379, 391, 395, 397, 415, 419, 425, 433, 445, 451, 463, 471, 477, 487, 499, 501, 505}
à la place de283
.la source
±y_:=Total[#&@@y~RealDigits~2x^Reverse@Range[0,2~Log~y]];p[q_,c_,d_]:=Fold[#+##&,Reverse@CoefficientList[q[±c,±d]~PolynomialMod~±283,x]~Mod~2]
(suppose que la source est encodée en ISO 8859-1)±
place def
etp
au lieu deo
(bien sûr, vous pouvez le garder commeo
, je viens de l'utiliserp
pour pouvoir les tester tous les deux), puis j'ai enregistré quelques octets supplémentaires avec la norme astuces de sucre syntaxique.±
au travail de la même manièref
, mais pasp
... je ne sais pas où je me trompeBrainfuck, 28 personnages
Heureusement, Brainfuck standard fait tout le module 256.
Addition
[->+<]
:, suppose que les entrées sont dans les deux premières positions de la bande, place la sortie en position 0Multiplication:,
[->[->+>+<<]>[-<+>]<<]
suppose que les entrées sont dans les deux premières positions de la bande, place la sortie en position 3la source