XORプライムを見つける


16

では、この課題 XNORによってもたらされる、我々はXOR乗算を実装するように求めていました。この課題の目標は、最初のnXORプライムを見つけることです。XORプライムは、次の定義からわかるように、通常のプライムに非常に似ています。

素数の定義: 1とそれ自体の乗算を除き、2つの数値の乗算では形成できない1より大きい正の数。

XOR Primeの定義: 1とそれ自体のXOR乗算を除き、2つの数値のXOR乗算では形成できない1より大きい正の数。XORプライムはoeisシーケンスA014580を構成することに注意してください。

XOR乗算は、キャリーなしのバイナリロング乗算として定義されます。xnorの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
FWIWこれらは、ユニークな因数分解ドメインの主要な要素ですF_2[x]
ピーターテイラー

ええと、まさに挑戦とは何ですか?最短コード?最速のコード?
ユーメル

2
@Eumelタグはcode-golfであるため、バイト単位の最短コードがデフォルトです。
Mego

回答:


5

Pyth、26バイト

.fq2/muxyG*Hhdjed2 0^SZ2ZQ

デモンストレーション

数値がXOR素数であるかどうかをテストするために、ここからのアルゴリズムを使用してその数値までの完全な乗算テーブルを生成し、その数値が出現する回数をカウントします。正確に2の場合、数値は素数です。

次に、.f最初のn個の素数を返します。


2

Mathematica、100 99バイト

xnorで述べたように、XOR乗算は、多項式リングF2[x]乗算です。

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

2

パリ/ GP、74バイト

Charlesのおかげで4バイト節約されました。

xnorで述べたように、XOR乗算は、多項式リングF 2 [ x ]での乗算ですF2[バツ]

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

セイロン、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);

これは、整数の無限反復可能n要素(2から始まる)を作成し、数値がXOR素数であるかどうかをチェックしてフィルタリングし、その最初の要素を取得します。

このフィルタリングは、2からm-1(m-2の要素)までのすべての要素をループし、xor-productが与える場合に各ペアをチェックすることで機能しmます。それによって作成された反復可能オブジェクトが空の場合m、xor-primeであるため、含まれます。

XOR積自体は、XOR積の計算に対する答えと同じアルゴリズム(およびほぼ同じコード)を使用して計算されます。


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

主な機能は、2行目の匿名関数です。ヘルパー関数を呼び出します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.