Temukan XOR Primes

16

Dalam tantangan yang diajukan oleh xnor, kami diminta untuk mengimplementasikan perkalian XOR. Dalam tantangan ini tujuannya adalah untuk menemukan nbilangan prima XOR pertama . Bilangan prima XOR sangat mirip dengan bilangan prima biasa seperti yang Anda lihat dengan definisi berikut:

Definisi Angka Utama: Angka positif lebih besar dari 1 yang tidak dapat dibentuk melalui perkalian dua angka kecuali melalui perkalian dari 1 dan itu sendiri.

Definisi XOR Prime: Angka positif lebih besar dari 1 yang tidak dapat dibentuk melalui perkalian XOR dari dua angka kecuali melalui perkalian XOR dari 1 dan itu sendiri. Perhatikan bahwa bilangan prima XOR menyusun urutan oeis A014580 .

Perkalian XOR didefinisikan sebagai perkalian panjang biner tanpa membawa. Anda dapat menemukan informasi lebih lanjut tentang perkalian XOR dalam tantangan xnor .

Memasukkan:

Bilangan bulat n.

Keluaran:

nPrimer XOR pertama .

Berikut adalah bilangan prima XOR di bawah 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
TheNumberOne
sumber
7
FWIW ini adalah elemen utama dari domain factorisation yang unik F_2[x].
Peter Taylor
Uhm apa sebenarnya tantangannya? Kode terpendek? Kode tercepat?
Eumel
2
@Eumel Tag ini adalah kode-golf, jadi kode terpendek dalam byte adalah default.
Mego
4
Oei A014580
xnor

Jawaban:

5

Pyth, 26 byte

.fq2/muxyG*Hhdjed2 0^SZ2ZQ

Demonstrasi

Untuk menguji apakah suatu bilangan merupakan XOR-prime, kami menghasilkan tabel perkalian lengkap hingga angka tersebut menggunakan algoritma dari sini , dan kemudian menghitung berapa kali angka itu muncul. Jika tepat 2, jumlahnya prima.

Kemudian, .fkembalikan n primer pertama.

isaacg
sumber
2

Mathematica, 100 99 byte

Sebagaimana dicatat oleh xnor, perkalian XOR hanyalah perkalian dalam cincin polinomial F2[x].

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

Pari / GP , 74 byte

Disimpan 4 byte berkat Charles .

Sebagaimana dicatat oleh xnor, perkalian XOR hanyalah perkalian dalam cincin polinomial F2[x].

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

Cobalah online!

Pada dasarnya sama dengan jawaban Mathematica saya , tetapi PARI / GP memiliki nama fungsi yang lebih pendek.

alephalpha
sumber
1
Bagus, peningkatan pada versi di A014580 . Anda dapat mencukur 4 byte jika Anda pengurangan sebagai gantinya: n->p=0;while(n,if(polisirreducible(Mod(Pol(binary(p++)),2)),print(p);n--)).
Charles
1

Ceylon, 166 byte

Tentu saja ini tidak dapat bersaing dengan 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);

Diformat:

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

Ini menciptakan iterable integer tak terbatas (dimulai dengan 2), memfilternya dengan memeriksa apakah suatu bilangan adalah XOR-prime, dan mengambil nelemen pertama dari itu.

Pemfilteran ini bekerja dengan mengulang semua elemen dari 2 ke m-1 (yang merupakan m-2), dan memeriksa setiap pasangan jika produk xor memberikan m . Jika iterable yang dibuat oleh itu kosong, madalah xor-prime, dan karenanya disertakan.

Produk-xor itu sendiri dihitung menggunakan algoritma yang sama (dan hampir kode yang sama) seperti dalam jawaban saya untuk perhitungan produk XOR .

Paŭlo Ebermann
sumber
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])

Fungsi utama adalah fungsi anonim di baris kedua. Itu memanggil fungsi pembantu f(yang kebetulan adalah kiriman saya untuk tantangan xnor).

Tidak Terkumpul:

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
Alex A.
sumber