Tìm các số nguyên tố XOR


16

Trong thử thách này do xnor đặt ra, chúng tôi đã được yêu cầu thực hiện phép nhân XOR. Trong thử thách này, mục tiêu là tìm ra các nsố nguyên tố XOR đầu tiên . Các số nguyên tố XOR rất giống với các số nguyên tố thông thường như bạn có thể thấy theo các định nghĩa sau:

Định nghĩa số nguyên tố: Một số dương lớn hơn 1 không thể được hình thành thông qua phép nhân của hai số ngoại trừ thông qua phép nhân của 1 và chính nó.

Định nghĩa XOR Prime: Một số dương lớn hơn 1 không thể được hình thành thông qua phép nhân XOR của hai số ngoại trừ thông qua phép nhân XOR của 1 và chính nó. Lưu ý rằng các số nguyên tố XOR soạn chuỗi oeis A014580 .

Phép nhân XOR được định nghĩa là phép nhân dài nhị phân mà không mang theo. Bạn có thể tìm thêm thông tin về phép nhân XOR trong thử thách của xnor .

Đầu vào:

Một số nguyên n.

Đầu ra:

Các nsố nguyên tố XOR đầu tiên .

Dưới đây là các số nguyên tố XOR dưới 500:

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
FWIW đây là các yếu tố chính của miền nhân tố duy nhất F_2[x].
Peter Taylor

Uhm chính xác thì thử thách là gì? Mã ngắn nhất? Mã nhanh nhất?
Eumel

2
@Eumel Thẻ là code-golf, vì vậy mã ngắn nhất tính theo byte là mặc định.
Mego

Câu trả lời:


5

Bình thường, 26 byte

.fq2/muxyG*Hhdjed2 0^SZ2ZQ

Trình diễn

Để kiểm tra xem một số có phải là số nguyên tố XOR hay không, chúng tôi tạo bảng nhân hoàn chỉnh cho đến số đó bằng thuật toán từ đây và sau đó đếm xem số đó xuất hiện bao nhiêu lần. Nếu nó chính xác là 2, số đó là số nguyên tố.

Sau đó, .ftrả về n số nguyên tố đầu tiên.


2

Toán học, 100 99 byte

F2[x]

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

2

Pari / GP , 74 byte

Lưu được 4 byte nhờ Charles .

Theo ghi nhận của xnor, phép nhân XOR chỉ là phép nhân trong vòng đa thức F2[x]

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

Hãy thử trực tuyến!

Về cơ bản giống như câu trả lời Mathicala của tôi , nhưng PARI / GP có tên hàm ngắn hơn.


1
Đẹp, một cải tiến trên phiên bản tại A014580 . Bạn có thể tắt 4 byte nếu bạn giảm dần : n->p=0;while(n,if(polisirreducible(Mod(Pol(binary(p++)),2)),print(p);n--)).
Charles

1

Ceylon, 166 byte

Tất nhiên điều này không thể cạnh tranh với 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);

Định dạng:

{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);

Điều này tạo ra một số nguyên vô hạn (bắt đầu bằng 2), lọc nó bằng cách kiểm tra xem một số có phải là số nguyên tố XOR hay không và lấy các nphần tử đầu tiên của số đó.

Quá trình lọc này hoạt động bằng cách lặp qua tất cả các phần tử từ 2 đến m-1 (là các phần tử m-2) và kiểm tra từng cặp nếu sản phẩm xor đưa ra m . Nếu iterable được tạo bởi đó là rỗng, mlà một xor-Prime và do đó được bao gồm.

Bản thân sản phẩm xor được tính toán bằng cùng một thuật toán (và gần như cùng mã) như trong câu trả lời của tôi để tính toán sản phẩm XOR .


1

Julia, 116 byte

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])

Hàm chính là hàm ẩn danh trên dòng thứ hai. Nó gọi một hàm trợ giúpf (đây là sự phục tùng của tôi cho thử thách của xnor).

Ung dung:

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
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.