Pola w matematyce zbiór cyfr, z dodatkiem i namnażanie operacji zdefiniowanych na niego, tak że spełniają one pewne axioms (opisane w Wikipedia; patrz poniżej).
Skończony pole może mieć s n elementów, gdzie p
jest liczbą pierwszą, a n
jest liczbą naturalną. W tym wyzwaniu weźmy, p = 2
a n = 8
więc stwórzmy pole z 256 elementami.
Elementami pola powinny być kolejne liczby całkowite w zakresie, który zawiera 0
i 1
:
- -128 ... 127
- 0 ... 255
- lub jakikolwiek inny taki zakres
Zdefiniuj dwie funkcje (lub programy, jeśli jest to łatwiejsze), a(x,y)
dla abstrakcyjnego „dodawania” i m(x,y)
dla abstrakcyjnego „mnożenia”, tak aby spełniały aksjomaty pola:
- Spójność:
a(x,y)
im(x,y)
dają ten sam wynik, gdy wywoływany z tymi samymi argumentami - Zamknięcie: Wynikiem
a
im
jest liczbą całkowitą w odpowiednim zakresie - Łączność: Dla każdego
x
,y
az
w tym zakresie,a(a(x,y),z)
wynosia(x,a(y,z))
; to samo dlam
- Przemienność: dla dowolnego
x
iy
w zakresiea(x,y)
jest równaa(y,x)
; to samo dlam
- Rozdzielność: dla każdego
x
,y
iz
w zakresie,m(x,a(y,z))
jest równaa(m(x,y),m(x,z))
- Elementy neutralne: dla dowolnego
x
z zakresua(0,x)
jest równex
im(1,x)
równex
- Negacja: dla każdego
x
z tego zakresu istnieje taki,y
którya(x,y)
jest0
- Odwrotny: dla każdego
x≠0
z tego zakresu istnieje taki,y
którym(x,y)
jest1
Nazwy a
i m
są tylko przykładami; możesz użyć innych nazw lub funkcji bez nazw. Wynik Twojej odpowiedzi to suma długości bajtów dla a
i m
.
Jeśli korzystasz z wbudowanej funkcji, opisz ją również słowami, które z niej wynikają (np. Podaj tabliczkę mnożenia).
źródło
a(2,1) = 3
, możesz mieća(2,1) = 5
tyle czasu, ile powyższe aksjomaty są spełnione.a
nie musi nic robić ze zwykłym dodatkiem, do którego jesteś przyzwyczajony, np. z zakresu liczb wymiernych.a=+
m=×
?m=×
Odpowiedzi:
Intel x86-64 + AVX-512 + GFNI, 11 bajtów
Wykorzystuje nową
GF2P8MULB
instrukcję dotyczącą procesorów Ice Lake.źródło
Python 2, 11 + 45 = 56 bajtów
Dodawanie (11 bajtów):
Mnożenie (45 bajtów):
Przyjmuje liczby wejściowe z zakresu
[0 ... 255]
. Dodawanie jest tylko bitowe XOR, mnożenie to mnożenie wielomianów o współczynnikach w GF2 z chłopem rosyjskim .I do sprawdzenia:
źródło
m(2,128)
co daje wynik 27 = 283 - 256, więc masz rację, a wielomian jestx^8 + x^4 + x^3 + x + 1
.JavaScript (ES6), 10 + 49 = 59 bajtów
Domena to 0 ... 255. Źródło .
źródło
Hoon , 22 bajtów
Hoon ma już funkcję,
++ga
która tworzy Pola Galois, do wykorzystania w implementacji AES. Zwraca krotkę dwóch funkcji zamiast używania dwóch programów.Działa w domenie
[0...255]
Testsuite:
Zamieszczanie tabeli mnożenia byłoby gigantyczne, więc oto kilka przypadkowych przypadków testowych:
źródło
Kod maszynowy IA-32, 22 bajty
„Mnożenie”, 18 bajtów:
„Dodawanie”, 4 bajty:
Rozciąga to nieco reguły: w kodzie „mnożenia” brakuje kodu wyjścia funkcji; polega na tym, że kod „dodatkowy” jest w pamięci natychmiast, więc może „przewrócić się”. Zrobiłem to, aby zmniejszyć rozmiar kodu o 1 bajt.
Kod źródłowy (może być złożony przez
ml
MS Visual Studio):Algorytm jest standardowy, obejmujący zwykły wielomian
x^8 + x^4 + x^3 + x + 1
reprezentowany przez liczbę szesnastkową1b
. Kod „mnożenia” akumuluje wynikedx
. Po zakończeniu przechodzi do kodu dodatkowego, który przenosi go doeax
(rejestr konwencjonalny do przechowywania wartości zwracanej);xor
zecx
oznacza brak operacji , ponieważ w tym momencieecx
jest wyczyszczone.Jedną ze szczególnych cech jest pętla. Zamiast sprawdzać zero
korzysta z dedykowanej
loop
instrukcji. Ale ta instrukcja zmniejsza „licznik” pętli przed porównaniem jej do 0. Aby to zrekompensować, kod zwiększa ją przed użyciemloop
instrukcji.źródło
Mathematica 155 bajtów
Realizacja
kontrola dodania:
Więcej:
NB Powinny być w stanie korzystać z dowolnego
{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}
zamiast283
.źródło
±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]
(zakłada, że źródło jest zakodowane w ISO 8859-1)±
zamiastf
ip
zamiasto
(oczywiście możesz to zachować, ponieważo
właśnie użyłem,p
aby móc przetestować oba), a następnie zapisałem kilka dodatkowych bajtów ze standardowym cukry syntaktyczne.±
pracować tak samo jakf
, ale niep
... nie jestem pewien, gdzie się mylęBrainfuck, 28 znaków
Na szczęście standardowy Brainfuck robi wszystko modulo 256.
Dodanie:
[->+<]
zakłada, że wejścia znajdują się w pierwszych dwóch pozycjach taśmy, umieszcza wyjście w pozycji 0Mnożenie:
[->[->+>+<<]>[-<+>]<<]
zakłada, że wejścia znajdują się w pierwszych dwóch pozycjach taśmy, umieszcza wyjście w pozycji 3źródło