XOR Asallarını Bulun


16

Gelen bu meydan XNOR yarattığı, biz XOR çarpma uygulamak istendi. Bu meydan okumada amaç ilk nXOR primerini bulmaktır . XOR asalları, aşağıdaki tanımlarla görebileceğiniz gibi normal asallara çok benzer:

Asal Sayının Tanımı: 1 ve kendisinin çarpımı dışında iki sayının çarpımı ile oluşturulamayan, 1'den büyük pozitif bir sayı.

XOR Prime'ın Tanımı: 1 ve kendisinin XOR çarpımı dışında iki sayının XOR çarpımı ile oluşturulamayan, 1'den büyük pozitif bir sayı. XOR primerlerinin oeis sekansı A014580'i oluşturduğuna dikkat edin .

XOR çarpımı, taşımadan ikili uzun çarpma olarak tanımlanır. XOR'un zorluklarında XOR çarpımı hakkında daha fazla bilgi bulabilirsiniz .

Giriş:

Bir tamsayı n.

Çıktı:

İlk nXOR asalları.

İşte 500'ün altındaki XOR primerleri:

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 bunlar, benzersiz çarpanlara ayırma alanının temel unsurlarıdır F_2[x].
Peter Taylor

Uhm meydan okuma tam olarak nedir? En kısa kod? En hızlı kod?
Eumel

2
@Eumel Etiket kod golfü olduğundan, bayt cinsinden en kısa kod varsayılan değerdir.
Mego

Yanıtlar:


5

Pyth, 26 bayt

.fq2/muxyG*Hhdjed2 0^SZ2ZQ

gösteri

Bir sayının XOR-prime olup olmadığını test etmek için, buradan algoritmayı kullanarak o sayıya kadar tam çarpım tablosunu oluştururuz ve sonra bu sayının kaç kez göründüğünü sayarız. Tam olarak 2 ise, sayı asaldır.

Ardından, .filk n asal değerini döndürür.


2

Mathematica, 100 99 bayt

F2[x]

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

2

Pari / GP , 74 bayt

Charles sayesinde 4 bayt kurtardı .

F2[x]

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

Çevrimiçi deneyin!

Temel olarak Mathematica yanıtımla aynı , ancak PARI / GP'nin daha kısa işlev adları var.


1
Güzel, A014580 versiyonunda bir gelişme . Yerine azaltma eğer 4 bayt kapalı tıraş edebilirsiniz: n->p=0;while(n,if(polisirreducible(Mod(Pol(binary(p++)),2)),print(p);n--)).
Charles

1

Seylan, 166 bayt

Tabii ki bu Pyth & Co. ile rekabet edemez ...

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

biçimlendirilmiş:

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

Bu, sonsuz bir tamsayı (2 ile başlayan) oluşturur, bir sayının XOR-prime olup olmadığını kontrol ederek filtreler ve bunun ilk nöğelerini alır .

Bu filtreleme, 2'den m-1'e (m-2 olanlar) tüm elemanlar üzerinde döngü yaparak ve xor-ürününün verilip verilmediğini her çifti kontrol ederek çalışır m . Bunun tarafından oluşturulan yinelenebilir boşsa, mbir xor- prime'dır ve bu nedenle dahil edilir.

Xor-ürününün kendisi, XOR ürün hesaplamasındaki cevabımdakiyle aynı algoritma (ve neredeyse aynı kod) kullanılarak hesaplanır .


1

Julia, 116 bayt

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

Birincil işlev, ikinci satırdaki anonim işlevdir. Bir yardımcı işlevi çağırır f(bu arada xnor'un meydan okuması için benim teslimimdir).

Ungolfed:

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
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.