負のXOR素数


9

約1年前、XOR素数を見つけるように求められました。これらは、基数2でXOR乗算を実行するときの唯一の因子が1である数値とそれ自体です。今は少し物事を盛り上げるつもりでした。

XOR素数をベース-2で見つけます。

Base -2への変換

ベース-2は他のすべてのベースとよく似ています。左端の場所は1の場所(1 =(-2)0)であり、その隣に-2の場所(-2 =(-2)1)があり、その隣に4の場所(4 =(-2 )2)など。大きな違いは、負の数は負の符号なしでbase -2で表すことができることです。

変換の例をいくつか示します。

Decimal | Base -2
-----------------
 6      |   11010
-7      |    1001
 12     |   11100
-15     |  110001

Base -2でのXOR追加

Base -2でのXOR追加は、バイナリでのXOR追加とほとんど同じです。単に数値をBase -2に変換し、各桁のXORをXORします。(これはキャリーなしの加算と同じです)

以下は、ステップバイステップの例です。

(記号+'を使用して、Base -2 XOR加算を示します)

ベース10から開始:

6 +' -19

基数-2に変換:

11010 +' 10111

持ち運びせずに追加:

   11010
+' 10111
---------
   01101

結果を元の10に変換します。

-3

Base -2でのXOR乗算

ここでも、ベース-2でのXOR乗算は、バイナリでのXOR乗算とほぼ同じです。基数2でのXOR乗算に慣れていない場合は、ここに優れた説明があります。最初にそれを確認することをお勧めします。

BaseのXORの乗算は-2ベースに長い乗算を行う-2ではなく、伝統的なと数字のすべてを合算の最終段階に来るときを除いて同じである+あなたが使用し+'、我々は上記で定義されています。

以下に例を示します。

10進数で開始:

8 *' 7

ベース-2に変換:

11000 *' 11011

ロングディビジョンを設定します。

   11000
*' 11011
---------

最初の数値に2番目のすべての場所を掛けます

      11000
*'    11011
------------
      11000
     11000
        0
   11000
  11000

base -2 XOR加算を使用してすべての結果を合計します

       11000
*'     11011
-------------
       11000
      11000
         0
    11000
+' 11000
-------------
   101101000

結果を10進数に戻します。

280

チャレンジ

あなたの課題は、数値が基数-2のXOR素数であるかどうかを確認することです。基数で乗算される整数のペアが1とそれ自体の場合、数値は基数-2のXOR素数です。(1は素数ではありません)

数値を取り込んでブール値を出力します。入力がベース-2のXOR素数であれば真であり、それ以外の場合は偽です。

ソリューションは、最小バイト数を目標として、バイト単位でスコアリングされます。

テストケース

以下は、ベース-2のすべてのXOR素数です。

-395
-3
-2
 3
 15
 83

以下は、base -2のXOR素数ではありません

-500
-4
 0
 1
 258
 280

258等しいようです-2 *' -129 = 10 *' 10000011
ジョンファンミン

@JungHwanMin 1つは他のカテゴリに分類されることになっていたのは残念です。ご迷惑をおかけしましたことをお詫び申し上げます。
アドホックガーフハンター2017

回答:


3

Mathematica、156 101バイト

IrreduciblePolynomialQ[FromDigits[{#}//.{a_,p___}/;a!=1&&a!=0:>{-⌊a/2⌋,a~Mod~2,p},x],Modulus->2]&

ここで述べたように、これはXOR乗算が基本的に多項式リングF_2での乗算であるため機能します。

説明

{#}//.{a_,p___}/;a!=1&&a!=0:>{-⌊a/2⌋,a~Mod~2,p}

から始め{input}ます。数値a(0と1を除く)をamod 2で繰り返し置き換え、a変更されないまで-floor(/ 2)を付加します。これは、ベース-2の入力を計算します。

FromDigits[ ... ,x]

x変数としてを使用して、基数-2の数字を使用して多項式を作成します。例{1, 1, 0}->x^2 + x

IrreduciblePolynomialQ[ ... ,Modulus->2]

結果の多項式がモジュラス2で既約かどうかを確認します。

古いバージョン(156バイト)

If[#==1,1,Outer[FromDigits[BitXor@@(#~ArrayPad~{i++,--l}&)/@Outer[i=0;l=m;1##&,##],-2]&,k=Tuples[{0,1},m=Floor@Log2[8Abs@#~Max~1]]~Drop~{2},k,1,1]]~FreeQ~#&

素数のリスト

これは-1000から1000までのベース-2 XOR素数のリストです(ペーストビン)

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.