ビットフリップ耐性複合数


26

時には、プログラムを作成するときに、何らかの理由で暗号化などの素数を使用する必要があります。場合によっては、合成番号も使用する必要があると思います。場合によっては、少なくともここPPCGでは、プログラムが任意の変更に対処できる必要があります。また、興味深いPPCGの質問を作成するために便利に考案された状況では、おそらくあなたが使用している数字でさえ、腐敗に耐えなければならない…

定義

複合番号は、それが1 Aを超える2つのより小さな整数の積、すなわち、素数でない整数≥4 bitflip性複合数次のように定義されています。あなたはそれを書くならば、それは、のための複合正の整数です可能な最小ビット数のバイナリでは、その数値から任意の1ビットまたは2ビットを変更できますが、その数値はまだ合成されています。

たとえば、数値84を考え1010100ます。バイナリでは、それがです。以下は、それと2ビット以内に異なるすべての数値です。

0000100 4 2×2
0010000 16 4×4
0010100 20 4×5
0010101 21 3×7
0010110 22 2×11
0011100 28 4×7
0110100 52 4×13
1000000 64 8×8
1000100 68 4×17
1000101 69 3×23
1000110 70 7×10
1001100 76 4×19
1010000 80 8×10
1010001 81 9×9
1010010 82 2×41
1010100 84 7×12
1010101 85 5×17
1010110 86 2×43
1010111 87 3×29
1011000 88 8×11
1011100 92 4×23
1011101 93 3×31
1011110 94 2×47
1100100100 10×10
1110000 112 8×14
1110100116 4×29
1110101 117 9×13
1110110 118 2×59
1111100 124 4×31

最初の列は2進数の数値です。2番目の列は10進数の数値です。3列目が示すように、これらの数値はすべて合成されています。そのため、84はビットフリップ抵抗のある合成数です。

タスク

次の3つのプログラムまたは関数のうち、言語に最も適したもののいずれかを作成する必要があります。

  • 入力として非負の整数nを取り、最初のn個のビットフリップ耐性合成数を出力するプログラムまたは関数。
  • 非負整数かかるプログラムや関数、Nを入力として、および以下のすべてbitflip性複合数値を出力するn個(または未満、好むか等しい場合、N、すなわち、あなたがいるかどうかを選択することができ、N bitflip場合出力に含まれています-耐性)。
  • 入力を受け取らず、すべてのビットフリップ耐性の合成数を出力するプログラムまたは関数。(これは、標準出力、遅延リスト、またはジェネレーターへの印刷など、プログラムの実行中に出力を生成できる出力メカニズムを使用する必要があります。リスト全体を計算してから印刷することはできません。)

テストケース

以下は、最初のいくつかのビットフリップ耐性合成数です。

84, 184, 246, 252, 324, 342, 424, 468, 588, 636, 664, 670, 712, 730, 934, 958

明確化

  • ビットフリップに耐性を持たなければならないのは、あなたが作り出す数字だけです。これは、ビットフリップに耐性があるプログラムを作成することに関するタスクではありません。プログラム自体で好きな数字を使用してください。
  • 出力する数値は、「先行ゼロ」のビットフリップに耐える必要はありません。数字は可能な限り最小のビット数で保存され、それらのビットのみが反転しないようにする必要があると想像してください。ただし、出力する数値の最初の1ビットは、ビットフリップの影響を受けないようにする必要があります。
  • 適切な結果が得られる任意のアルゴリズムを使用してください。ここでは効率性についてマークされていません。
  • ビットフリップ耐性のある合成数が有限数であることを証明できる場合は、a)出力形式の制限が解除され、b)リストのハードコーディングが許可されます(ただし、単に計算するよりも冗長になります)。この規則は、ほとんど完全性のためです。関連性があるとは思わない。

勝利条件

これはなので、いつものように、短いほうが良いです。また、通常どおり、プログラムの長さはバイト単位で測定されます。


「入力としてn個の非負整数を受け取り、そしてnより小さいすべてbitflip性複合数値を出力するプログラムまたは機能」 - Iに含めることができるn場合nbitflip耐性でありますか?(つまり、「n以下」にしますか?)
ジョンファンミン


2
私はあなたの仕様が通常どれほど明確で徹底的であるかが好きです
ルイス・メンドー

腐敗に耐性であることについて初めにすべてのことの話で、私は...これは別ほぼ不可能放射線硬化性の課題になるだろうと思った
ETHproductions

2
@ ais523空のプログラムのように見えます。すべての空のプログラムのセット。
mbomb007

回答:


5

ゼリー、20?22 バイト

BµJŒċ;0Ṭ^µḄµÆPoỊṀ¬
⁴Ç#

オンラインでお試しください!

最初のn個のそのような数値を生成します。

おそらく;0削除することができます(それなしでは、数値自体が複合であるかどうかはチェックしません-すべてのビットフリップ複合を持つ素数はありますか?)

あることに注意していないテストを実行するのに十分なnot(any(is prime))ビット反転数のセットに。0セットに含まれていないものもテストする必要があります。

これは、0素数でも複合1でもないからです(余りですが、以下を参照)。

チェックする必要性0は反例によって見られるかもしれません:

  • 1311362 17 +2 6)には、次のビットフリップセットがあります。

[0, 64, 65, 66, 68, 72, 80, 96, 192, 320, 576, 1088, 2112, 4160, 8256, 16448, 32832, 65600, 131072, 131073, 131074, 131076, 131080, 131088, 131104, 131136, 131137, 131138, 131139, 131140, 131141, 131142, 131144, 131145, 131146, 131148, 131152, 131153, 131154, 131156, 131160, 131168, 131169, 131170, 131172, 131176, 131184, 131200, 131264, 131265, 131266, 131268, 131272, 131280, 131296, 131328, 131392, 131393, 131394, 131396, 131400, 131408, 131424, 131520, 131584, 131648, 131649, 131650, 131652, 131656, 131664, 131680, 131776, 131904, 132096, 132160, 132161, 132162, 132164, 132168, 132176, 132192, 132288, 132416, 132672, 133120, 133184, 133185, 133186, 133188, 133192, 133200, 133216, 133312, 133440, 133696, 134208, 135168, 135232, 135233, 135234, 135236, 135240, 135248, 135264, 135360, 135488, 135744, 136256, 137280, 139264, 139328, 139329, 139330, 139332, 139336, 139344, 139360, 139456, 139584, 139840, 140352, 141376, 143424, 147456, 147520, 147521, 147522, 147524, 147528, 147536, 147552, 147648, 147776, 148032, 148544, 149568, 151616, 155712, 163840, 163904, 163905, 163906, 163908, 163912, 163920, 163936, 164032, 164160, 164416, 164928, 165952, 168000, 172096, 180288, 196608, 196672, 196673, 196674, 196676, 196680, 196688, 196704, 196800, 196928, 197184, 197696, 198720, 200768, 204864, 213056, 229440]

これらはすべて0コンポジットを除き、0素数ではありません。

1また、非プライムおよび非コンポジットであり、セットに表示される可能性があります。ただし、必要に応じて、これをコンポジットのように残すことができます。

  • とにかく(3まったく考慮されている場合)以下のすべての入力には、0とにかく(実際にはすべて7do 未満)が含まれています。

  • リーチに11ビットフリップの元の数の形式でなければならない2 K +2 0、これがより大きい場合3、すなわち、K> 1、我々は到達することができ3オフ反転によりk個のビットをと設定1ビットを(2 1 +2 0 = 3)。

  • 12ビットフリップで到達するには、元の数値は2 kの形式である必要があり、これが2フリップで3到達できるよりも大きい場合は素数になります。22

現状では、コードは両方0を処理1し、「重要でない」アトムを一緒に使用しています。

どうやって?

⁴Ç# - Main link: n
⁴   - 16
  # - count up from 16 finding the first n matches of
 Ç  -     last link (1) as a monad

BµJŒċ;0Ṭ^µḄµÆPoỊṀ¬ - Link 1, test a number: i
B                  - convert to a binary list
 µ                 - start a new monadic chain
  J                - range(length): [1,2,...,nBits]
   Œċ              - pairs with replacement: [[1,1],[1,2],...,[1,nBits],[2,2],[2,3],...,[2,nBits],...,[nBits-1,nBits]]
     ;0            - concatenate a zero
       Ṭ           - untruth (makes lists with ones at those indexes - the [1,1], [2,2], etc make the one-flips, the zero makes the no-flip, the rest make the two-flips)
        ^          - exclusive or with the binary list version of i (flip the bits)
         µ         - start a new monadic chain
          Ḅ        - un-binary (get the integer values of each of the flipped versions)
           µ       - start a new monadic chain
            ÆP     - is prime? (make a list of 1s for primes and 0 for non-primes)
               Ị   - is insignificant (abs(v)<=1)
              o    - logical or (now we have true for any primes, 0 or 1 - hence non-composites)
                Ṁ  - maximum (1 if any non-composite was found)
                 ¬ - not (1 if all were composite)

入力は、最大2ビット異なるすべての数値のセットに含まれていますか?そうであれば、とにかく入力自体の複合性をチェックします。
ジョンファンミン

いいえ、それが;0そこにある理由です- Œċすべての順序付けられていないペアをインデックスの置換で取得します(J) )一部「交換して」ではなく、29(プラス変更なし)。
ジョナサン・アラン

プライムが存在せず、ビット反転したいとこがすべてコンポジットであることがわかっている場合は、削除できます。しかし、私はその事実を確信していません。
ジョナサンアラン

5

Brachylog32 38バイト

2<≜.¬(ḃ↰₂↰₂~ḃ≜{ṗ|ℕ<2}∧)
k~k|tgT∧?k↰:Tc

オンラインでお試しください!

これは、↰₀そのような数値をすべて生成するジェネレーターを返す関数/述語です。(TIOリンクは最初の数字のみを出力するため、何かを観察できます。それをローカルで実行すると、さらに多くが生成されます。)

0または1(素数でも合成でもない)の2つのビットフリップ内の数値を正しく処理するように更新されました。

説明

ヘルパー述語 ↰₂(1つの要素を除いて、入力に等しいリストを返します)

k~k|tgT∧?k↰:Tc
   |            Either:
 ~k               the output is produced by appending an arbitrary element
k                 to the input minus its last element
                Or:
        ?k        take the input minus its last element,
          ↰       call this predicate recursively on that,
      T    :Tc    then append
     g            the singleton list consisting of
    t             the last element of the input

この比較的単純な再帰を行うためのより簡単な方法があればそれが大好きですが、まだあるかどうかはわかりません。仕様には有望な機能がいくつかありますが、未実装としてマークされています。

主なプログラム ↰₀

2<≜.¬(ḃ↰₂↰₂~ḃ≜{ṗ|ℕ<2}∧)
2<≜                      For each integer greater than 2
   .                     generate it if
    ¬(                )  it does not have the following property:
      ḃ                  converting it to binary,
       ↰₂↰₂              running the helper predicate twice,
           ~ḃ            and converting back to decimal
             ≜           does not allow us to find a specific value
              {     }    that is:
               ṗ           prime;
                |        or:
                 ℕ<2       nonnegative and less than 2
                     ∧   (disable an unwanted implicit constraint)

4

JavaScript(ES6)、96バイト

を使用して、一致する整数の数を要求し、それらを1つずつ表示する完全なプログラムalert()

for(i=prompt(n=2);i;n+=2)(g=b=>b>n?alert(n,i--):(C=(n,x=n)=>n%--x?C(n,x):x>1)(n^b|1)&&g(b*2))(1)

ブラウザがTail Call Optimizationを使用するように設定されていない限り、再帰オーバーフローのためにこれは最終的に中断します。

以下は非再帰バージョン(102バイト)です。

for(i=prompt(n=2);i;n+=2){for(c=b=1;b<n;b*=2,c&=C)for(C=k=2,x=n^b|1;k<x;k++)C|=!(x%k);c&&alert(n,i--)}

仮定

このアルゴリズムは、すべてのビットフリップ耐性合成数が偶数であるという仮定に依存しています。これにより、かなり重要な単純化が行われます。考えられるすべてのビットペアを反転する代わりに、ビット#0と別のビットのみを反転し(または他のビットをまったく使用せず)、結果の数値がすべて合成されることを確認します。

しかし、奇妙なビットフリップ耐性の合成数が実際に存在しないという明白な証拠を理解することはできません。それはたまたま小さな数には当てはまらず(最大1,000,000までチェックしました)、ビット数が増加するにつれて1つを見つける確率は減少しているように見えます(しかし、これは基本的に私の直感です)。


3

ゼリー20 17バイト

BJŒċṬUḄ^;⁸ÆḍṂỊµÐḟ

オンラインでお試しください!

使い方

BJŒċṬUḄ^;⁸ÆḍṂỊµÐḟ  Main link. Argument: n

              µ    Combine all links to the left into a chain.
               Ðḟ  Filter-false; keep only integers k from [1, ..., n] for which
                   the chain returns 0.
B                    Convert k to binary.
 J                   Get the indices of all digits.
  Œċ                 Take all combination of two indices, with replacement.
    Ṭ                Untruth; map each index pair [i, j] to the Boolean array of
                     length j that has 1's at (and only at) indices i and j.
     U               Upend; reverse each Boolean array.
      Ḅ              Unbinary; convert each array from base 2 to integer.
       ^             XOR the resulting numbers with k.
        ;⁸           Append k to the resulting list.
          Æḍ         Count the number of proper divisors of each result.
            Ṃ        Take the minimum.
             Ị       Insignificant; test if the minimum is 0 or 1.

1
今、私は、ソースコードを読んで説明がなくてもこれがどのように機能するかを理解したと私に言っていることを疑問に思っています。私はJellyでこの質問に出かけましたが、それほど遠くには行きませんでした(つまり、実用的なソリューションがありました-テストケースのリストを生成したのですが-明らかに冗長すぎました)。私が欠けていたのは、最初に2ビット以下の数字のテーブルを作成し、それをXORするトリックでした。

3

Python 2、113バイト

r=range
lambda N:[n for n in r(1,N)if 1-any((bin(k).count('1')<3)*all((n^k)%q for q in r(2,n^k))for k in r(n+1))]

(2行目は名前のない関数で、関数への入力よりも小さいすべてのビットフリップ耐性合成数のリストを返します。)

構文all(u%q for q in range(2,u))は、Trueいつuでも素数かそれ以下のいずれか2に評価され、そうでなければ評価されFalseます。(が以下であるTrue場合、空っぽです。)u2

言い換えれば、all(u%q for q in range(2,u))は、複合である0場合にのみ等しいu

関数の入力が未満の場合2、関数は空のリストを返します(必要に応じて)。したがって、入力Nが少なくとも2であると仮定します1 <= n < N。毎kから0スルーn(包括的)、コードがいるかどうかチェックするnとXOR演算k複合体である、そしてかどうかもチェックk最大2で有し1、そのバイナリ表現での。n^kが複合の場合、または3 kつ以上ある場合1、次の値に移動しますk。それは、すべての値によって取得した場合kから0通じnこのようにして、それは、nリストに。

一方、k最大で2つ1の値n^kがあり、複合でnはない場合は、リストに含まれません。


2

Perl 6の87の 85バイト

{grep {!grep {$_%all 2..^$_},($_ X+^grep {.base(2)~~m:g/1/ <3},^(2+<.log(2)))},2..$_}

入力数値以下の数値をすべて返します。

使い方

2から入力までの各数値nに対して、次のことを行います。

  1. ^(2 + <.log(2))

    nと同じか短いビット長を持つすべての非負整数を生成します。

  2. grep {.base(2)~~ m:g / 1 / <3}、

    (正規表現を使用して)3ビット未満が設定されているこのリストの数値をフィルタリングします。

  3. $ _ X + ^

    XORのn個のすべての有効な「変異」もたらすこれらの数字のそれぞれで、nは

  4. !grep {$ _%all 2 .. ^ $ _}

    突然変異がいずれも非合成でない場合にのみ、nを出力リストの一部にします(2からx -1の間の数字のすべてのジャンクションを法として各突然変異xを取ることによってチェックされます)。


2

Mathematica、115バイト

@MartinEnderのおかげで1 4バイト節約

Cases[4~Range~#,x_/;And@@CompositeQ[Fold[#+##&]/@Select[{0,1}~Tuples~BitLength@x,Tr@Abs[#-x~IntegerDigits~2]<3&]]]&

(* or *)

(s=Select)[4~Range~#,xAnd@@CompositeQ[Fold[#+##&]/@s[{0,1}~Tuples~BitLength@x,Tr@Abs[#-x~IntegerDigits~2]<3&]]]&

2 ^ ceil(lg(n))までのすべての数値を生成するため、非常に非効率的です。

2番目のコードはU + F4A1を使用します(Function関数)


1

フロロイド95 109バイト

Bj:[n KnIw(j)Fp(Cao(hm("".y(k)))Mhm("".y(k))>1KkIcd("10"*Z(hi(n)),Z(hi(n)))FT(a!=b Ka,bIq(hi(n),"".y(k)))<3)]

までのビットフリップ耐性の数値のリストを返しますinput - 1。エッジの効いた状況(0および1)も処理します。

フロロイドは私の古い言語で、数回しか使用していません。しばらく触れなかったので、プログラムのサイズが大きかった。

次のPythonコードに変換します。これは、再帰によって削減できると思います。

lambda j:[n for n in  range(j) if  all( not  functions.isPrime( functions.fromBinStr("".join(k))) and  functions.fromBinStr("".join(k))>1for k in  functions.combinations_with_replacement("10"*len( functions.pureBin(n)),len( functions.pureBin(n))) if sum (a!=b for a,b in  zip( functions.pureBin(n),"".join(k)))<3)]

ここで使用される各関数は、Floroidで事前定義されています。このページには、すべての機能とその定義が含まれています。


注:素数ではないが、合成されていない数値(0と1)があります。そのため、いくつかのソリューションを修正する必要がありました。これもそうだろうと思う。

@ ais523私は実際にそれについて読んだ。そのような既知のテストケースはまだありますか?とにかく、私はそれを(おそらく)傾向があるので、私は修正します、ありがとう!
Yytsi

@TuukaX:131136には、2つのビットフリップを介して到達できる唯一の非複合値として0があります(0は素数ではありません)。見つけてくれたJonathanAllanに感謝します。

1

MATL30 28 27 26バイト

:GBnW:qtB!s3<)!Z~tZpw~+a~f

オンラインでお試しください!

nまで(およびnを含む)すべてのビットフリップ抵抗合成数を出力します。両方のJellyソリューションのアイデアを使用します-0は問題のある非素数としてのみ考慮されます。そして、最初に距離2以内の数値のリストを生成し、次にxorを取ります。

ループ(30バイト)による代替ソリューション:

:"@BnW:qt@Z~B!s3<)Zp1M~ha~?@D]

nまで(およびnを含む)すべてのビットフリップ抵抗合成数を出力します。


0

CJam34 33バイト

ri{_2b,,2\f#_m*::|0+f^:mp:+!},2>p

厳密にn未満のすべてのビットフリップ耐性複合材料を計算します。

ジョナサン・アランのように、ビットフリップが0かどうかを実際にチェックする必要があるかどうかはわかりません。素数のビットフリップがすべて合成数にならないことが判明した場合0+は、削除できます。

オンラインでお試しください!

説明

ri                                 Take an integer from input (n)
  {                                Filter out all numbers in the range 0...n-1 for which
                                    the following block is false
   _                                 Duplicate the number
    2b,                              Convert to binary, get the length
       ,                             Range from 0 to length-1
        2\f#                         Map each number in that range as a power of 2
                                      results in all powers of 2 less than or equal to n
            _m*                      Cartesian product with itself
               ::|                   Reduce each Cartesian pair with btiwse OR
                                      results in all numbers that have 1-2 1 bits in binary
                  0+                 Add 0 to that list
                    f^               Bitwise XOR the number we're checking with each of these
                                      This computes all the bitflips
                      :mp            Map each result to 0 if it's prime, 1 if it's composite
                         :+!         Take the sum of the list, check if it's 0
                                      If it is, then none of the results were prime
                            },     (end of filter block)
                              2>   Discard the first 2 numbers, since 0 and 1 always pass
                                p  Print the list nicely

0

MATL、29バイト

訂正してくれたジョナサン・アランに感謝します。

q:Q"@BtnFTZ^=~!s3<fqt2>)Zp~?@

これは数値nを取り、ビットフリップ耐性のあるnまでのすべての合成数値を出力します。

使い方

MATL Onlineでお試しください!

q:Q       % Input n implicitly. Push range [2 3 ... n]
"         % For each k in [2 3 ... n]
  @       %   Push k
  B       %   Convert to binary. Gives a row vector of zeros and ones, say v
  tn      %   Duplicate. Number of elements, say m
  FT      %   Push [0 1]
  Z^      %   Cartesian power of [0 1] raised to m. This gives a matrix,
          %   where each row is a binary number of length m
  =~      %   Compare with v, with broadcast
  !s      %   Sum of each row. Gives a row vector. This is the number of
          %   bit flips
  3<      %   True for numbers that are less than 3 bit flips away from k
  fq      %   Find their indices and subtract 1 to convert to decimal form.
          %   This gives a vector of numbers that are less than 3 bit flips
          %   away from k
  t2>)    %   Remove 0 or 1
  Zp~     %   Test each entry for non-primeness
?         % If all entries are true
  @       %   Push k
          % End (implicit)
          % Display stack (implicit)

@JonathanAllan今解決しました。再度、感謝します!
ルイスメンドー
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.