Um campo em matemática é um conjunto de números, com operações de adição e multiplicação definidas, de modo a satisfazer certos axiomas (descritos na Wikipedia; veja também abaixo).
Um campo finito pode ter elementos p n , onde p
é um número primo e n
é um número natural. Neste desafio, vamos pegar p = 2
e n = 8
, então vamos criar um campo com 256 elementos.
Os elementos do campo devem ser números inteiros consecutivos em um intervalo que contém 0
e 1
:
- -128 ... 127
- 0 ... 255
- ou qualquer outro intervalo
Defina duas funções (ou programas, se isso for mais fácil), a(x,y)
para "adição" m(x,y)
abstrata e "multiplicação" abstrata, de modo a satisfazer os axiomas do campo:
- Consistência:
a(x,y)
em(x,y)
produz o mesmo resultado quando chamado com os mesmos argumentos - Fechamento: o resultado de
a
em
é um número inteiro no intervalo relevante - Associatividade: para qualquer
x
,y
ez
no intervalo,a(a(x,y),z)
é igual aa(x,a(y,z))
; o mesmo param
- Comutatividade: para qualquer
x
ey
na faixa,a(x,y)
é igual aa(y,x)
; o mesmo param
- Distributividade: para qualquer
x
,y
ez
dentro da faixa,m(x,a(y,z))
é igual aa(m(x,y),m(x,z))
- Elementos neutros: para qualquer um
x
no intervalo,a(0,x)
é igual ax
, em(1,x)
é igual ax
- Negação: para qualquer pessoa
x
no intervalo, existe umay
quea(x,y)
seja0
- Inverso: para qualquer pessoa
x≠0
no intervalo, existe umay
quem(x,y)
seja1
Os nomes a
e m
são apenas exemplos; você pode usar outros nomes ou funções sem nome. A pontuação da sua resposta é a soma dos comprimentos de bytes para a
e m
.
Se você usar uma função interna, descreva também em palavras o resultado que ela produz (por exemplo, forneça uma tabela de multiplicação).
fonte
a(2,1) = 3
, você pode tera(2,1) = 5
enquanto os axiomas acima forem satisfeitos.a
não precisa fazer nada com a adição usual a que você está acostumado, por exemplo, no campo dos números racionais.a=+
m=×
?m=×
Respostas:
Intel x86-64 + AVX-512 + GFNI, 11 bytes
Usa a nova
GF2P8MULB
instrução nas CPUs Ice Lake.fonte
Python 2, 11 + 45 = 56 bytes
Adição (11 bytes):
Multiplicação (45 bytes):
Toma números de entrada no intervalo
[0 ... 255]
. A adição é apenas XOR bit a bit, multiplicação é multiplicação de polinômios com coeficientes em GF2 com camponeses russos .E para verificar:
fonte
m(2,128)
que resulta em 27 = 283 - 256, para que você esteja correto e o polinômio sejax^8 + x^4 + x^3 + x + 1
.JavaScript (ES6), 10 + 49 = 59 bytes
O domínio é 0 ... 255. Origem .
fonte
Hoon , 22 bytes
Hoon já tem uma função
++ga
que cria Galois Fields, para uso na implementação do AES. Isso retorna uma tupla de duas funções, em vez de usar dois programas.Opera no domínio
[0...255]
Suíte de teste:
A publicação de uma tabela de multiplicação seria gigantesca, então, aqui estão alguns casos de teste aleatórios:
fonte
Código de máquina IA-32, 22 bytes
"Multiplicação", 18 bytes:
"Adição", 4 bytes:
Isso estende as regras um pouco: o código "multiplicação" não possui o código de saída da função; ele conta com o código de "adição" que está na memória logo depois, para que possa "cair". Fiz isso para diminuir o tamanho do código em 1 byte.
Código fonte (pode ser montado pelo
ml
MS Visual Studio):O algoritmo é o padrão, envolvendo o polinômio usual
x^8 + x^4 + x^3 + x + 1
, representado pelo número hexadecimal1b
. O código "multiplicação" acumula o resultado emedx
. Quando concluído, ele passa para o código de adição, que o move paraeax
(registro convencional para manter o valor de retorno); oxor
withecx
é um no-op, porque nesse pontoecx
está limpo.Uma característica peculiar é o loop. Em vez de verificar zero
Ele usa a
loop
instrução dedicada . Mas esta instrução diminui o "contador" do loop antes de compará-lo a 0. Para compensar isso, o código aumenta antes de usar aloop
instrução.fonte
Mathematica 155 bytes
Implementação
verificação adicional:
Mais:
NB Deve ser capaz de usar qualquer um dos
{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}
em lugar de283
.fonte
±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]
(assume que a fonte é codificado em ISO 8859-1)±
vez def
e emp
vez deo
(é claro que você pode manter isso comoo
, eu apenas useip
para testar os dois) e, em seguida, salvei mais alguns bytes com o padrão truques de açúcar sintáticos.±
a trabalhar mesmo quef
, mas nãop
... não sei para onde estou indo erradoBrainfuck, 28 caracteres
Felizmente, o Brainfuck padrão faz tudo no módulo 256.
Adição
[->+<]
:, assume que as entradas estão nas duas primeiras posições da fita, coloca a saída na posição 0Multiplicação:,
[->[->+>+<<]>[-<+>]<<]
assume que as entradas estão nas duas primeiras posições da fita, coloca a saída na posição 3fonte