비트 플립 방지 복합 번호


26

때로는 프로그램을 작성할 때 어떤 이유로 든 다른 이유로 소수를 사용해야하는 경우가 있습니다 (예 : 암호화). 때로는 복합 번호도 사용해야한다고 가정합니다. 때때로, 적어도 여기 PPCG에서는 프로그램이 임의의 변경을 처리 할 수 ​​있어야합니다. 흥미로운 PPCG 질문을하기 위해 편리하게 고안된 상황에서 아마도 사용중인 숫자조차도 부패에 저항해야합니다.

정의

합성 수 는 1.보다 큰 두 개의 작은 정수의 제품 즉, 소수가 아닌 정수 ≥ 4 bitflip에 강한 합성 수는 다음과 같이 정의됩니다 : 당신이 그것을 작성하는 경우는,를위한 복합 양의 정수입니다 가능한 최소 비트 수의 이진수로 숫자에서 하나 또는 두 개의 비트를 변경할 수 있으며 숫자는 여전히 복합적입니다.

예를 들어 숫자 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
1110000112 8 × 14
1110100116 4 × 29
1110101117 9 × 13
1110110118 2 × 59
1111100124 4 × 31

첫 번째 열은 이진수로 된 숫자입니다. 두 번째 열은 10 진수입니다. 세 번째 열에서 알 수 있듯이이 숫자는 모두 복합입니다. 따라서 84는 비트 플립 방지 복합 번호입니다.

작업

언어에 가장 적합한 다음 세 가지 프로그램 또는 기능 중 하나를 작성해야합니다.

  • 음수가 아닌 정수 n 을 입력으로 취하고 첫 번째 n 비트 플립 저항 복합 번호를 출력 하는 프로그램 또는 함수입니다 .
  • 음이 아닌 정수 걸리는 프로그램이나 함수 N 입력으로, 그리고보다 적은 모든 bitflip 강한 합성 수를 출력하는 N (또는 이하, 선호 또는 동일한 경우, N은 , 예하면 여부를 선택할 수 N bitflip 경우 출력에 포함 내성).
  • 입력을받지 않고 모든 비트 플립 저항 복합 번호를 출력하는 프로그램 또는 기능. stdout, lazy list 또는 generator로 인쇄하는 것과 같이 프로그램이 계속 실행되는 동안 출력을 생성 할 수있는 출력 메커니즘을 사용해야합니다. 전체 목록을 계산 한 다음 인쇄 할 수는 없습니다.

테스트 사례

다음은 비트 플립 내성 합성 번호 중 처음 몇 가지입니다.

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

설명

  • 비트 플립에 저항해야하는 것은 숫자 만 생성합니다. 이것은 비트 플립에 저항하는 프로그램을 만드는 것에 관한 일이 아닙니다. 프로그램 자체에서 원하는 숫자를 사용하십시오.
  • 당신이 출력 한 숫자는 "제로 제로"의 비트 플립에 저항 할 필요는 없습니다. 숫자는 가능한 최소 비트 수에 저장되며 해당 비트 만 뒤집기를 방지해야한다고 상상해보십시오. 그러나 출력하는 숫자의 첫 1 비트는 비트 플립에 영향을받지 않아야합니다.
  • 올바른 결과를 생성하는 원하는 알고리즘을 사용하십시오. 당신은 여기 효율성에 표시되지 않습니다.
  • 비트 플립에 강한 복합 숫자가 무한히 많다는 것을 증명할 수 있다면 a) 출력 형식에 대한 제한이 해제되고 b) 하드 코딩이 허용됩니다 (단지 계산하는 것보다 더 자세한 설명이 가능하지만). 이 규칙은 대부분 완전성만을위한 것입니다. 나는 그것이 관련성이 있다고 기대하지 않습니다.

승리 조건

이것은 이므로 평소와 같이 짧을수록 좋습니다. 또한 평소와 같이 프로그램 길이는 바이트 단위로 측정됩니다.


"음수가 아닌 정수 n을 입력으로 사용하고 n보다 작은 모든 비트 플립 저항 복합 번호를 출력하는 프로그램 또는 함수"- 비트 플립 저항이 포함되어 n있다면 포함시킬 수 n있습니까? (즉, "n보다 작거나 같게합니까?")
JungHwan Min


2
나는 당신의 스펙이 얼마나 명확하고 철저한 지 좋아합니다
Luis Mendo

처음에는 부패에 대한 저항력에 대한 이야기가 있었지만 이것이 거의 불가능한 방사선 경화 문제가 될 것이라고 생각했습니다.
ETHproductions

2
@ ais523 빈 프로그램처럼 보입니다. 비어있는 모든 프로그램 세트.
mbomb007

답변:


5

젤리 , 20? 22 바이트

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

온라인으로 사용해보십시오!

처음 n 개의 숫자를 나타냅니다.

어쩌면 ;0제거 될 수 있습니다 (숫자 자체가 복합인지 여부를 확인하지 않으면 모든 비트 플립 복합에 소수가 있습니까?)

비트 플립 된 숫자 집합으로 테스트 를 수행하는 것만으로 는 충분 하지 않습니다not(any(is prime)) . 또한 0세트에없는 것을 테스트해야합니다 .

이것은 0소수가 아니며 복합적이지 않기 때문 입니다 ( 1이 역시 마찬가지이지만 아래 참조).

확인해야 할 필요성 0은 반례로 볼 수 있습니다.

  • 131136( 2 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어쨌든 (사실 모두 그렇지 않은 경우 7) 포함합니다.

  • 가까이에 1하나의 비트 플립의 원 전화 번호는 형식이어야 2 K +2 0 , 이는보다 큰 경우 3, 즉, K> 1 , 우리가 도달 할 수있는 3오프 젖혀 k 개의 비트를 상기 설정 비트를 ( 2 1 +2 0 = 3 ).

  • 도달하기 위해 1두 개의 비트에하면 원래 번호는 형식이어야 플립 K 이것이보다 큰 경우 3우리가 도달 할 수있는 2이 대신 플립, 그리고 2소수.

코드는 "중요하지 않은"아톰을 사용하여 함께 처리 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 비트 씩 다른 모든 숫자 집합에 입력이 포함되어 있습니까? 그렇다면 어쨌든 입력 자체의 복합성을 검사합니다.
JungHwan Min

아니오는, 그 이유는 ;0이 - Œċ인덱스 (교체 모든 정렬되지 않은 쌍을 얻는다 J(28) (의 좋아하는을 포함하여의 7 비트가있는 84 그래서) [1,1]를 싱글에서 (비트 - 플립을 위해 ),하지 (29) (플러스 변경 없음) 부분 "교체와 함께."
조나단 앨런

비트-플립 된 사촌이 모두 복합적 일 수있는 소수가 없다는 것을 알면 제거 할 수있다. 그러나 나는 그 사실을 확신하지 못한다.
Jonathan Allan

5

Brachylog , 32 38 바이트

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

온라인으로 사용해보십시오!

이것은 ↰₀모든 숫자를 생성하는 생성기를 반환 하는 함수 / 조건 자 입니다. (TIO 링크는 첫 번째 숫자 만 인쇄하므로 관찰 할 수있는 것이 있습니다. 로컬로 실행하면 더 많은 결과가 생성됩니다.)

이제 0 또는 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

자바 스크립트 (ES6), 96 바이트

를 사용하여 일치하는 정수의 수를 묻고 하나씩 표시하는 전체 프로그램입니다 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까지 확인) 비트 수가 증가함에 따라 하나를 찾을 확률이 감소하는 것처럼 보입니다 (그러나 기본적으로 그것에 대한 직감입니다).


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

파이썬 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))]

(두 번째 줄은 함수에 대한 입력 값보다 작은 모든 비트 플립 방지 복합 번호 목록을 반환하는 명명되지 않은 함수입니다.)

구문 all(u%q for q in range(2,u))은 소수이거나 이하일 True때마다 평가 되고 그렇지 않은 경우로 평가됩니다 . ( 보다 작거나 같으면 애매 합니다 .)u2FalseTrueu2

다시 말해, if 가 복합적인 경우에만 all(u%q for q in range(2,u))같습니다 .0u

함수의 입력이보다 작 으면 2함수는 원하는대로 빈 목록을 반환합니다. 따라서 입력 N이 적어도 2있다고 가정하고 가정하십시오 1 <= n < N. 각 k0내지 n(포함) 코드가 있는지 확인한다 nxor의 함께이 k복합체이며 여부도 검사 k많아야 두 있습니다 1'이진 표현이야. 경우 n^k복합 경우, 또는 k두 개 이상 보유 1'들, 그것은 다음의 값으로 이동한다 k. 그것의 모든 값을 통과 할 경우 k에서 0를 통해 n이 방법, 그것은 포함 n목록에.

값이 있다면 반면에, k대부분의 두와 1같은 s '를 n^k합성하지 않다가 다음 n목록에 포함되지 않습니다.


2

펄 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 {$ _ % 모두 2 .. ^ $ _}

    비 복합 돌연변이가없는 경우 에만 n을 출력리스트의 일부로 허용하십시오 (각 돌연변이 x 모듈로를 2와 x -1 사이의 숫자의 결합으로 확인 ).


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))까지의 모든 숫자를 생성하기 때문에 매우 비효율적입니다.

두 번째 코드는 U + F4A1 ( Function함수)을 사용합니다


1

Floroid , 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)도 처리합니다.

플로 로이드는 오래된 언어로 몇 번만 사용했습니다. 충분한 시간 동안 프로그램을 만지지 않았으므로 프로그램의 크기가 커집니다.

다음 파이썬 코드로 번역합니다. 재귀로 줄일 수 있다고 생각합니다.

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은 두 개의 비틀림을 통해 도달 할 수있는 유일한 비 복합 값으로 0을 갖습니다 (0은 소수가 아님). 그것을 찾은 JonathanAllan에게 감사합니다.

1

MATL , 30 28 27 26 바이트

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

온라인으로 사용해보십시오!

모든 비트 플립 방지 복합 번호를 n까지 출력합니다. 두 젤리 솔루션의 아이디어를 사용합니다. 0은 문제가없는 비 프라임으로 간주합니다. 먼저 거리 2 내의 숫자 목록을 생성 한 다음 xor를 사용합니다.

루핑 (30 바이트)을 통한 대체 솔루션 :

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

모든 비트 플립 방지 복합 번호를 n까지 출력합니다.


0

CJam , 34 33 바이트

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

모든 비트 플립 방지 복합재를 n 미만으로 엄격하게 계산합니다 .

Jonathan Allan과 마찬가지로 실제로 0 bitflips를 확인해야하는지 확실하지 않습니다. 소수에 비트 비트가 모두없는 경우 복합 숫자가 나오면 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 바이트

수정 해 주신 Jonathan Allan에게 감사드립니다.

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 해결되었습니다. 다시 감사합니다!
Luis Mendo
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.