Поле в математике представляет собой набор чисел, с операциями сложения и умножения , определенных на ней, таким образом, что они удовлетворяют определенные аксиомы (описанные в Википедии, см также ниже).
Конечное поле может иметь p n элементов, где p
простое число и n
натуральное число. В этом задании давайте возьмем p = 2
и n = 8
, поэтому, давайте создадим поле с 256 элементами.
Элементы поля должны быть последовательными целыми числами в диапазоне, который содержит 0
и 1
:
- -128 ... 127
- 0 ... 255
- или любой другой такой диапазон
Определите две функции (или программы, если это проще) a(x,y)
для абстрактного «сложения» и m(x,y)
абстрактного «умножения», чтобы они удовлетворяли аксиомам поля:
- Согласованность:
a(x,y)
иm(x,y)
выдает одинаковый результат при вызове с одинаковыми аргументами - Закрытость: результат
a
иm
является целым числом в соответствующем диапазоне - Ассоциативность: для любого
x
,y
иz
в диапазоне,a(a(x,y),z)
равнаa(x,a(y,z))
; то же самое дляm
- Коммутативность: для любого
x
иy
в пределах,a(x,y)
равнаa(y,x)
; то же самое дляm
- Дистрибутивность: для любого
x
,y
иz
в пределах,m(x,a(y,z))
равноa(m(x,y),m(x,z))
- Нейтральные элементы: для любого
x
в диапазоне,a(0,x)
равноx
иm(1,x)
равноx
- Отрицание: для любого
x
в диапазоне, существует такое ,y
чтоa(x,y)
является0
- Inverse: для любого
x≠0
в диапазоне, существует такого ,y
чтоm(x,y)
является1
Имена a
и m
только примеры; Вы можете использовать другие имена или безымянные функции. Оценка вашего ответа является суммой байтов для a
и m
.
Если вы используете встроенную функцию, пожалуйста, опишите также словами, какой результат она дает (например, предоставьте таблицу умножения).
источник
a(2,1) = 3
, вы могли бы иметьa(2,1) = 5
до тех пор, пока вышеуказанные аксиомы выполнены.a
не нужно ничего делать с обычным сложением, к которому вы привыкли, например, из поля рациональных чисел.a=+
m=×
?m=×
Ответы:
Intel x86-64 + AVX-512 + GFNI, 11 байт
Использует новую
GF2P8MULB
инструкцию по процессорам Ice Lake.источник
Python 2, 11 + 45 = 56 байт
Дополнение (11 байт):
Умножение (45 байт):
Принимает входные числа в диапазоне
[0 ... 255]
. Сложение только поразрядное XOR, умножение это умножение полиномов с коэффициентами в GF2 на русского крестьянина .И для проверки:
источник
m(2,128)
что дает 27 = 283 - 256, так что вы правы, а полином -x^8 + x^4 + x^3 + x + 1
.JavaScript (ES6), 10 + 49 = 59 байт
Домен 0 ... 255. Источник .
источник
Хун , 22 байта
У Hoon уже есть функция,
++ga
которая создает поля Галуа для использования в реализации AES. Это возвращает кортеж из двух функций вместо использования двух программ.Работает в домене
[0...255]
Тестирование:
Размещение таблицы умножения было бы гигантским, так что вот несколько случайных тестовых случаев:
источник
Машинный код IA-32, 22 байта
«Умножение», 18 байт:
«Сложение», 4 байта:
Это немного растягивает правила: в коде «умножения» отсутствует код завершения функции; он полагается на то, что «дополнительный» код находится в памяти сразу после этого, поэтому он может «провалиться». Я сделал это, чтобы уменьшить размер кода на 1 байт.
Исходный код (может быть собран
ml
MS Visual Studio):Алгоритм является стандартным, включающим обычный многочлен
x^8 + x^4 + x^3 + x + 1
, представленный шестнадцатеричным числом1b
. Код «умножения» накапливает результат вedx
. Когда это сделано, он переходит к коду добавления, который перемещает его вeax
(обычный регистр для хранения возвращаемого значения);xor
сecx
является не-оп, потому что в этот моментecx
очищается.Одна особенность - это петля. Вместо проверки на ноль
он использует специальную
loop
инструкцию. Но эта инструкция уменьшает «счетчик» цикла перед сравнением его с 0. Чтобы компенсировать это, код увеличивает его перед использованиемloop
инструкции.источник
Mathematica 155 байтов
Реализация
проверка дополнения:
Больше:
NB Должен быть в состоянии использовать любой
{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}
вместо283
.источник
±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]
(предполагается, что источник закодирован в ISO 8859-1)±
вместоf
иp
вместоo
(конечно, вы можете оставить это какo
, я просто использовал,p
чтобы я мог проверить их оба), а затем сохранить еще несколько байтов со стандартным синтаксические сахарные трюки.±
работать так же, как иf
, но неp
... не знаю, где я иду не такBrainfuck, 28 символов
К счастью, стандартный Brainfuck делает все по модулю 256.
Дополнение:,
[->+<]
предполагает, что входы находятся в первых двух позициях ленты, помещает вывод в положение 0Умножение:
[->[->+>+<<]>[-<+>]<<]
предполагает, что входы находятся в первых двух позициях ленты, помещает вывод в положение 3источник