XOR 프라임 찾기


16

에서 이 문제 XNOR로 인한, 우리는 XOR 곱셈을 구현했다. 이 도전에서 목표는 첫 번째 nXOR 프라임 을 찾는 것입니다 . XOR 프라임은 다음 정의에서 볼 수 있듯이 일반 프라임과 매우 유사합니다.

소수의 정의 : 1보다 큰 양수는 1과 그 자체의 곱셈을 제외하고 두 숫자의 곱셈을 통해 형성 될 수 없습니다.

XOR 프라임의 정의 : 1과 그 자체의 XOR 곱셈을 제외하고 두 숫자의 XOR 곱셈을 통해 형성 할 수없는 1보다 큰 양수. XOR 프라임은 oeis 시퀀스 A014580을 구성 합니다.

XOR 곱셈은 전달하지 않고 이진 긴 곱셈으로 정의됩니다. xnor 's challenge 에서 XOR 곱셈에 대한 자세한 정보를 찾을 수 있습니다 .

입력:

정수 n.

산출:

첫 번째 nXOR 소수입니다.

500 이하의 XOR 소수는 다음과 같습니다.

2 3 7 11 13 19 25 31 37 41 47 55 59 61 67 73 87 91 97 103 109 115 117 131 137 143 145 157 167 171 185 191 193 203 211 213 229 239 241 247 253 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

7
이것들은 독특한 인수 분해 영역의 주요 요소입니다 F_2[x].
피터 테일러

음, 정확히 도전은 무엇입니까? 가장 짧은 코드? 가장 빠른 코드?
Eumel

2
@Eumel 태그는 코드 골프이므로 바이트 단위의 가장 짧은 코드가 기본값입니다.
Mego December

답변:


5

Pyth, 26 바이트

.fq2/muxyG*Hhdjed2 0^SZ2ZQ

데모

숫자가 XOR- 프라임인지 테스트하기 위해 here 의 알고리즘을 사용하여 해당 숫자까지의 완전한 곱셈표를 생성 한 다음 해당 숫자가 몇 번 나타나는지 계산합니다. 정확히 2이면 숫자가 소수입니다.

그런 다음 .f첫 n 개의 소수를 반환합니다.


2

Mathematica, 100 99 바이트

xnor에 의해 언급 된 바와 같이, XOR 곱셈은 다항식 고리 에프2[엑스] 에서의 곱셈 일 뿐이다 .

For[p=i=0,i<#,If[IrreduciblePolynomialQ[++p~IntegerDigits~2~FromDigits~x,Modulus->2],Print@p;i++]]&

2

Pari / GP , 74 바이트

Charles 덕분에 4 바이트가 절약되었습니다 .

xnor에 의해 언급 된 바와 같이, XOR 곱셈은 다항식 고리 F 2 [ x ] 에서의 곱셈 일 뿐이다 에프2[엑스]

n->p=0;while(n,if(polisirreducible(Mod(Pol(binary(p++)),2)),print(p);n--))

온라인으로 사용해보십시오!

기본적으로 Mathematica answer 와 동일 하지만 PARI / GP의 기능 이름이 더 짧습니다.


1
A014580 의 버전에서 개선되었습니다 . 대신 감소 시키면 4 바이트를 줄일 수 있습니다 n->p=0;while(n,if(polisirreducible(Mod(Pol(binary(p++)),2)),print(p);n--)).
Charles

1

실론, 166 바이트

물론 이것은 Pyth & Co와 경쟁 할 수 없습니다 ...

{Integer*}p(Integer n)=>loop(2)(1.plus).filter((m)=>{for(i in 2:m-2)for(j in 2:m-2)if(m==[for(k in 0:64)if(j.get(k))i*2^k].fold(0)((y,z)=>y.xor(z)))i}.empty).take(n);

형식화 :

{Integer*} p(Integer n) =>
        loop(2)(1.plus).filter((m) => {
            for (i in 2 : m-2)
                for (j in 2 : m-2)
                    if (m == [
                            for (k in 0:64)
                                if (j.get(k))
                                    i * 2^k
                        ].fold(0)((y, z) => y.xor(z))) i
        }.empty).take(n);

이것은 무한 반복 가능한 정수 (2로 시작)를 만들고 숫자가 XOR-prime인지 확인하여 필터링하고 첫 번째 n요소를 취합니다 .

이 필터링은 모든 요소를 ​​2에서 m-1 (m-2로)로 반복하고 xor-product가 제공하는지 각 쌍을 확인하여 작동합니다 m. 그것에 의해 작성된 iterable이 비어 있으면 mxor-prime이므로 포함됩니다.

xor-product 자체는 XOR product 계산에 대한 대답 과 동일한 알고리즘 (및 거의 동일한 코드) 을 사용하여 계산 됩니다.


1

줄리아, 116 바이트

f(a,b)=b%2*a$(b>0&&f(2a,b÷2))
n->(A=[i=2];while endof(A)<n i+=1;i∈[f(a,b)for a=2:i-1,b=2:i-1]||push!(A,i)end;A[n])

기본 기능은 두 번째 줄의 익명 기능입니다. 그것은 도우미 기능을 호출합니다 f(이것은 xnor의 도전에 대한 나의 제출입니다).

언 골프 드 :

function xor_mult(a::Integer, b::Integer)
    return b % 2 * a $ (b > 0 && f(2a, b÷2))
end

function xor_prime(n::Integer)
    # Initialize an array to hold the generated XOR primes as well as
    # an index at which to start the search
    A = [i = 2]

    # Loop while we've generated fewer than n XOR primes
    while endof(A) < n
        # Increment the prime candidate
        i += 1

        # If the number does not appear in the XOR multiplication
        # table of all numbers from 2 to n-1, it's an XOR prime
        i  [xor_mult(a, b) for a in 2:i-1, b in 2:i-1] || push!(A, i)
    end

    # Return the nth XOR prime
    return A[n]
end
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.