ค้นหา XOR Primes


16

ในความท้าทายนี้เกิดจาก xnor เราถูกขอให้ใช้การคูณด้วย XOR ในการท้าทายนี้เป้าหมายคือการค้นหาnช่วงเวลา XOR แรก ช่วงเวลา XOR คล้ายกับช่วงเวลาปกติอย่างที่คุณเห็นตามคำจำกัดความต่อไปนี้:

คำจำกัดความของจำนวนเฉพาะ: จำนวนบวกที่มากกว่า 1 ซึ่งไม่สามารถเกิดขึ้นได้จากการคูณสองจำนวนยกเว้นผ่านการคูณ 1 และตัวของมันเอง

คำจำกัดความของ XOR Prime:จำนวนบวกมากกว่า 1 ซึ่งไม่สามารถเกิดขึ้นได้จากการคูณด้วย XOR ของตัวเลขสองตัวยกเว้นผ่านการคูณ XOR ที่ 1 และตัวของมันเอง โปรดทราบว่าแฮคเกอร์ช่วงเวลาที่เขียน OEIS ลำดับA014580

การคูณ XOR หมายถึงการคูณแบบยาวไบนารีโดยไม่ต้องดำเนินการ คุณสามารถค้นหาข้อมูลเพิ่มเติมเกี่ยวกับแฮคเกอร์คูณในความท้าทายของ XNOR

การป้อนข้อมูล:

nจำนวนเต็ม

เอาท์พุท:

ครั้งแรกที่nแฮคเกอร์

นี่คือช่วงเวลา XOR ต่ำกว่า 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 F_2[x]เหล่านี้เป็นองค์ประกอบที่สำคัญของโดเมน
Peter Taylor

เอ่อสิ่งที่ท้าทายคืออะไร? รหัสสั้นที่สุด? รหัสเร็วที่สุด?
Eumel

2
@Eumel แท็กคือ code-golf ดังนั้นโค้ดที่สั้นที่สุดในหน่วยไบต์จึงเป็นค่าเริ่มต้น
Mego

คำตอบ:


5

Pyth, 26 ไบต์

.fq2/muxyG*Hhdjed2 0^SZ2ZQ

สาธิต

เพื่อทดสอบว่าตัวเลขเป็น XOR-prime หรือไม่เราสร้างตารางการคูณที่สมบูรณ์จนถึงจำนวนนั้นโดยใช้อัลกอริทึมจากที่นี่และนับจำนวนครั้งที่ปรากฏขึ้น ถ้ามันเท่ากับ 2 จำนวนนั้นจะเป็นจำนวนเฉพาะ

จากนั้น.fส่งคืนค่า primes แรก


2

Mathematica, 100 99 ไบต์

เท่าที่สังเกตจาก XNOR, แฮคเกอร์คูณเป็นเพียงการคูณในชื่อแหวนF2[x] ]

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

2

Pari / GP , 74 ไบต์

ที่บันทึกไว้ 4 ไบต์ขอบคุณที่ชาร์ลส์

เท่าที่สังเกตจาก XNOR, แฮคเกอร์คูณเป็นเพียงการคูณในชื่อแหวนF2[x] ]

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

ลองออนไลน์!

โดยพื้นฐานแล้วเหมือนกับMathematica ของฉันแต่ PARI / GP มีชื่อฟังก์ชั่นที่สั้นกว่า


1
นีซ, การปรับปรุงในรุ่นที่A014580 คุณสามารถโกน 4 n->p=0;while(n,if(polisirreducible(Mod(Pol(binary(p++)),2)),print(p);n--))ไบต์ถ้าคุณพร่องแทน:
ชาร์ลส์

1

Ceylon, 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 ให้ mและการตรวจสอบแต่ละคู่ถ้าให้ หาก iterable ที่สร้างโดยที่ว่างเปล่าmจะเป็น xor-prime และรวมอยู่ด้วย

ผลิตภัณฑ์ xor นั้นคำนวณโดยใช้อัลกอริทึมเดียวกัน (และเกือบจะเป็นรหัสเดียวกัน) เหมือนใน คำตอบของฉันสำหรับการคำนวณผลิตภัณฑ์การ XOR


1

Julia, 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)

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
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.