256 개의 요소로 필드 정의


15

필드 수학들은 특정 공리 만족하도록, 그 위에 추가로 정의 곱셈 연산과 숫자의 집합 (위키의 설명을, 또한 아래 참조).

유한 필드는 p n 요소를 가질 수 있으며 , 여기서 p소수 n는 자연수입니다. 이 도전에서 p = 2and를 가져 와서 n = 8256 개의 요소로 필드를 만들어 봅시다.

필드의 요소를 포함하는 범위의 연속 정수해야 0하고 1:

  • -128 ... 127
  • 0 ... 255
  • 또는 다른 범위

추상 "추가"및 추상 "곱하기"에 대해 필드 공리를 만족하도록 두 가지 기능 (또는 더 쉬운 경우 프로그램)을 정의하십시오 .a(x,y)m(x,y)

  • 일관성 : a(x,y)m(x,y)같은 인수로 호출 할 때 동일한 결과를
  • Closedness : 결과 am관련 범위의 정수이고
  • 연관성 : 모두에 대해 x, yz범위에 a(a(x,y),z)동일하다 a(x,a(y,z)); 같은m
  • 교환 법칙 : 임의 용 xy범위는 a(x,y)동일하다 a(y,x); 같은m
  • 분배 법칙 : 모두에 대해 x, yz범위에서 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
  • 역은 : 어떤에 대한 x≠0범위 등이 존재 y하는 m(x,y)것입니다1

이름 am예제 일뿐입니다. 다른 이름이나 명명되지 않은 함수를 사용할 수 있습니다. 답의 점수는 a및 의 바이트 길이의 합입니다 m.

내장 함수를 사용하는 경우 결과로 생성되는 단어도 설명하십시오 (예 : 곱셈표 제공).


3
@LeakyNun "addition"은 위의 속성을 만족하는 추상 작업입니다. 필요가 없습니다 . 위의 공리가 만족되는 한 a(2,1) = 3가질 수 있습니다 a(2,1) = 5. a예를 들어 합리적인 수의 분야에서 익숙한 일반적인 추가 방법으로 아무것도 할 필요가 없습니다.
Martin Ender

2
교환 링은 사소합니다. 들판 .. 그렇게 쉽지는 않아
Neil

문제가 a=+ m=×있습니까?
Adám

4
@ Adám 예-2의 경우 역수를 갖지 않습니다m=×
Sp3000

답변:


4

인텔 x86-64 + AVX-512 + GFNI, 11 바이트

add:
    C5 F0 57 C0     # vxorps     xmm0, xmm1, xmm0
    C3              # ret
mul:
    C4 E2 79 CF C1  # vgf2p8mulb xmm0, xmm0, xmm1
    C3              # ret

GF2P8MULBIce Lake CPU에 대한 새로운 지침을 사용합니다 .

이 명령어는 유한 필드 GF (2 8 )의 요소를 곱하여 첫 번째 소스 피연산자의 바이트 (필드 요소)와 두 번째 소스 피연산자의 해당 바이트에서 작동합니다. 필드 GF (2 8 )는 다항식 x 8 + x 4 + x 3 + x + 1 로 다항식으로 표현됩니다 .


13

파이썬 2, 11 + 45 = 56 바이트

추가 (11 바이트) :

int.__xor__

곱셈 (45 바이트) :

m=lambda x,y:y and m(x*2^x/128*283,y/2)^y%2*x

범위 내에서 입력 번호를 [0 ... 255]받습니다. 덧셈은 비트 단위 XOR이며 곱셈은 러시아 농민 과 GF2의 계수로 다항식의 곱입니다 .

그리고 확인을 위해 :

a=int.__xor__
m=lambda x,y:y and m(x*2^x/128*283,y/2)^y%2*x

for x in range(256):
    assert a(0,x) == a(x,0) == x
    assert m(1,x) == m(x,1) == x

    assert any(a(x,y) == 0 for y in range(256))

    if x != 0:
        assert any(m(x,y) == 1 for y in range(256))

    for y in range(256):
        assert 0 <= a(x,y) < 256
        assert 0 <= m(x,y) < 256
        assert a(x,y) == a(y,x)
        assert m(x,y) == m(y,x)

        for z in range(256):
            assert a(a(x,y),z) == a(x,a(y,z))
            assert m(m(x,y),z) == m(x,m(y,z))
            assert m(x,a(y,z)) == a(m(x,y), m(x,z))

우리 중 하나가 바뀌어야 할 것입니다 : P
Mego

@ Mego Hah, 글쎄 ... 나는 다른 접근법을 찾을 수 있는지 시도하고 볼 것이다. 그래도 이길 수 있습니다.
Sp3000

1
어느 다항식을 기반으로합니까?
feersum

1
@LSpice 이제 m(2,128)27 = 283-256의 결과를 실행하여 다항식을 쉽게 찾을 수 있다는 것을 알고 있으므로 정확하고 다항식은 x^8 + x^4 + x^3 + x + 1입니다.
feersum

1
@LSpice Neil의 대답에서 그는 Wikipedia 페이지를 알고리즘의 소스로 제공하므로 누구나 읽을 수 있습니다. 그러나이 표현에서 8 도의 가장 작은 돌이킬 수없는 다항식이기 때문에 어쨌든 코드 골프에 대한 가장 확실한 선택입니다.
feersum

6

자바 스크립트 (ES6), 10 + 49 = 59 바이트

a=(x,y)=>x^y
m=(x,y,p=0)=>x?m(x>>1,2*y^283*(y>>7),p^y*(x&1)):p

도메인은 0 ... 255입니다. 소스 .


2
아마도 사용중인 범위를 지정해야합니다.
마틴 엔더

4

Hoon , 22 바이트

[dif pro]:(ga 8 283 3)

Hoon은 이미 ++gaAES 구현에 사용하기 위해 Galois Field를 생성 하는 기능 을 가지고 있습니다. 두 개의 프로그램을 사용하는 대신 두 개의 함수 튜플을 반환합니다.

도메인에서 작동 [0...255]

테스트 스위트 :

=+  f=(ga 8 283 3)
=+  n=(gulf 0 255)

=+  a=dif:f
=+  m=pro:f

=+  %+  turn  n
    |=  x/@
    ?>  =((a 0 x) x)
    ?>  =((m 1 x) x)
    ~&  outer+x

    %+  turn  n
      |=  y/@
      ?>  =((a x y) (a y x))
      ?>  &((lte 0 (a x y)) (lte (a x y) 255))
      ?>  &((lte 0 (m x y)) (lte (m x y) 255))

      %+  turn  n
        |=  z/@
        ?>  =((a (a x y) z) (a x (a y z)))
        ?>  =((m x (a y z)) (a (m x y) (m x z)))
        ~
"ok"

곱셈 테이블을 게시하는 것은 거대하기 때문에 다음은 임의의 테스트 사례입니다.

20x148=229
61x189=143
111x239=181
163x36=29
193x40=1

1

IA-32 기계 코드, 22 바이트

"곱셈", 18 바이트 :

33 c0 92 d1 e9 73 02 33 d0 d0 e0 73 02 34 1b 41
e2 f1

"추가", 4 바이트 :

92 33 c1 c3

이것은 규칙을 조금 확장시킨다 : "곱하기"코드는 기능 종료 코드가 없다; 그것은 바로 메모리에있는 "추가"코드에 의존하므로 "폴 스루"할 수 있습니다. 코드 크기를 1 바이트 줄이려고했습니다.

소스 코드 ( mlMS Visual Studio로 구성 가능) :

    TITLE   x

PUBLIC @m@8
PUBLIC @a@8

_TEXT   SEGMENT USE32
@m@8    PROC
    xor eax, eax;
    xchg eax, edx;
myloop:
    shr ecx, 1
    jnc sk1
    xor edx, eax
sk1:
    shl al, 1
    jnc sk2
    xor al, 1bh
sk2:
    inc ecx
    loop myloop
@m@8 endp

@a@8 proc
    xchg eax, edx;
    xor eax, ecx
    ret
@a@8    ENDP
_text ENDS
END

알고리즘은 x^8 + x^4 + x^3 + x + 116 진수로 표현되는 일반적인 다항식을 포함하는 표준 알고리즘입니다 1b. "곱하기"코드는 결과를에 누적합니다 edx. 완료되면 덧셈 코드로 넘어 가고 eax(반환 값을 유지하기 위해 기존 레지스터로 이동 ); xor와는 ecx그 시점에 있기 때문에, 아무 조합 없습니다 ecx지워집니다.

독특한 특징 중 하나는 루프입니다. 0을 확인하는 대신

cmp ecx, 0
jne myloop

전용 loop명령을 사용합니다 . 그러나이 명령어는 루프 "카운터"를 0과 비교하기 전에 감소시킵니다.이를 보완하기 위해 코드는 loop명령어 를 사용하기 전에 루프를 증가시킵니다 .


0

Mathematica 155 바이트

f[y_]:=Total[x^Reverse@Range[0,Log[2,y]]*RealDigits[y,2][[1]]];o[q_,c_,d_]:=FromDigits[Reverse@Mod[CoefficientList[PolynomialMod[q[f@c,f@d],f@283],x],2],2]

이행

(*
  in: o[Times, 202, 83]    out: 1
  in: o[Plus, 202, 83]     out: 153
*)

추가 확인 :

(*
  in: BitXor[202, 83]      out: 153
*)

더:

(*
  in: o[Times, #, #2] & @@@ {{20, 148}, {61, 189}, {111, 239}, {163, 36}, {193, 40}}
  out: {229, 143, 181, 29, 1}
*)

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.


글쎄, 여기에 13 바이트가 적습니다 : ±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로 인코딩되었다고 가정)
Martin Ender

@MartinEnder는 제안을 구현하는 방법을 잘 모릅니다
martin

당신은 정확히 예전처럼 사용할 수 있습니다 @martin, 난 그냥 사용했습니다 ±대신 f하고 p대신 o(당신은 같은 것을 유지할 수 물론 o난 그냥 사용, p저장 한 다음 내가 그들 모두를 테스트 할 수 있도록), 몇 개는 표준 바이트 구문 설탕 트릭.
Martin Ender 2016 년

@MartinEnder ±와 같은 작업을 수행 할 수 는 f있지만 p... 내가 어디로 잘못 가고 있는지 확실 하지 않습니다 .
martin

주석에서 바로 복사하면 브라우저에서 주석에 줄 바꿈이 표시되는 곳에 인쇄 할 수없는 문자가있을 수 있습니다. 복사 후 해당 위치 주변의 문자를 삭제하고 다시 입력하십시오. 그래도 문제가 해결되지 않으면 문제가 어디에 있는지 잘 모르겠습니다.
Martin Ender 2016 년

-1

Brainfuck, 28 자

다행히 표준 Brainfuck은 모든 모듈로 256을 수행합니다.

추가 : [->+<], 입력이 테이프의 처음 두 위치에 있다고 가정하고 출력을 위치 0에 배치합니다.

곱셈 : [->[->+>+<<]>[-<+>]<<], 입력이 테이프의 처음 두 위치에 있다고 가정하고 출력을 위치 3에 배치

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.