素数を素数の適切なサブセットにマッピングする自然数内の全単射


14

定義

  • 全単射セットからSセットには、Tから関数でSTこのような1つの要素Tに正確に1つの要素によってマッピングされますS

  • セット内の全単射で Sから全単射であるSS

  • 自然数は、より大きいまたは等しい整数です0

  • セットのサブセットは、セットS内のすべての要素もにあるようなセットですS

  • 適切なサブセットセットのはSの部分集合である集合であるSと等しくされていませんS

仕事

入力として自然数を取り、自然数を出力するプログラム/関数を作成します。これは全単射でなければならず、プログラム/関数の下の素数のイメージは、{f(p) : p ∈ ℙ}の適切なサブセットである必要があります。ここで、は素数です。

得点

これはです。バイト単位の最短回答が優先されます。標準の抜け穴が適用されます


回答:


17

Mathematica、54 48バイト

±(t=x_?PrimeQ)=NextPrime@x
±n_:=Abs[n-1]/.t:>x-1

次の全単射を定義します。

 n  0, 1, 2, 3, 4, 5, 6,  7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, ...
±n  1, 0, 3, 5, 2, 7, 4, 11, 6, 8,  9, 13, 10, 17, 12, 14, 15, 19, ...

基本的な考え方は、各素数を次の素数にマッピングし、それらが適切なサブセットにマッピングされるようにすることです。これにより、2で「ギャップ」が生じます。そのギャップを埋めるために、42にマップし、次に、それぞれのコンポジット番号を前のコンポジット番号にマッピングして、ギャップを「バブルアップ」します。以来、2及び3は、 2つだけの隣接素数であり、私たちは「として、それらのマッピングの両方を発現することができるn-1個又はそれは次いで素数のif N-2」。最後に、このマッピングは1から0を送信することになり、n-1の絶対値を取得して01に送信します。


マップする必要があります0か?
ニール

@Neilしますが、とにかく全単射を変更しました。
マーティンエンダー

8

MATL、21バイト

間違いを見つけてくれたエミニャに感謝します。

tZp?_Yq}q:Zp~fX>sG~E+

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

これにより、次の全単射が実装されます。素数を一列に、非素数を下に書きます:

2  3  5  7 11 13 17 ...
0  1  4  6  8  9 10 ...

次に、入力から矢印をたどって出力を取得します。

2 > 3 > 5 > 7 > 11 > 13 > 17 ...
^
0 < 1 < 4 < 6 <  8 <  9 < 10 ...

説明されたコード

t       % Implicit input. Duplicate
Zp      % Is it a prime? Gives true / false
?       % If so
  _Yq   %   Next prime
}       % Else
  q     %   Subtract 1
  :     %   Range from 1 to that
  Zp~   %   Is each entry not a prime? Gives an array of true / false
  f     %   Find non-zero entries, i.e. non-primes. Will be empty for input 1
  X>    %   Maximum. This gives the greatest non-prime less than the input.
        %   Will be empty for input 1
  s     %   Sum. This is to transform empty into 0
  G~E   %   Push input, negate, times 2. This gives 2 for input 0, or 0 otherwise
  E     %   Add. This handles the case of input 0, so that it outputs 2
        % End (implicit). Display (implicit)


3

JavaScript(ES6)、82 77 75バイト

ルイスメンドーの答えと同じロジックを実装します

f=(n,i=(P=(n,x=n)=>n%--x?P(n,x):x==1||-1)(x=n))=>x?x==n|P(n)-i?f(n+i,i):n:2

フォーマットおよびコメント

f = (                   // given:
  n,                    // - n = input
  i =                   // - i = 'direction' to move towards
    (P = (n, x = n) =>  // - P = function that returns:
      n % --x ?         //   - 1 when given a prime
        P(n, x)         //   - -1 when given a composite number
      :                 //
        x == 1 || -1    //
    )(x = n)            // - x = copy of the original input
) =>                    //
  x ?                   // if the input is not zero:
    x == n | P(n) - i ? //   if n equals the input or doesn't match its primality:
      f(n + i, i)       //     do a recursive call in the chosen direction
    :                   //   else:
      n                 //     return n
  :                     // else:
    2                   //   return 2

デモ


2

ゼリー、12バイト

Æn_ḍ@¡ÆP?2»0

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

使い方

Æn_ḍ@¡ÆP?2»0  Main link. Argument: n (non-negative integer)

      ÆP?     If the input is prime:
Æn                Compute the next prime after n.
              Else:
   ḍ@¡   2        Do once if n is divisible by 2, zero times if not.
  _      2        Subtract 2.
              So far, we've mapped all primes to the next prime, all even integers
              (except 2) to the previous even integer, and all composite, odd,
              positive integers to themselves. In particular, 0 -> 2, but 0 doesn't
              have a preimage, so we need 0 -> 0.
          »0  Take the maximum of the result and 0, mapping 0 -> max(-2, 0) = 0.

うーん、説明を追加してください?
エリックアウトゴルファー

@EriktheOutgolferが追加されました。
デニス

いいですね、今ではもっと多くの人がこの混乱を理解できるようになりました。
エリックアウトゴルファー
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.