素数指数を隣接するものと交換する


13

ビットを隣人と交換することについての私の質問に続きます。)

仕事

正の整数x =(2 a  ・3 b)・(5 c  ・7 d)・(11 e  ・13 f)・…が与えられた場合、この素因数分解の指数を連続する素数ペアごとに交換して得られた整数を出力します。y =(2 b  ・3 a)・(5 d  ・7 c)・(11 f  ・13 e)・…

OEISのA061898。これはなので、最短のプログラム(バイト単位)が勝ちです!

テストケース

1 -> 1
2 -> 3
3 -> 2
10 -> 21
37 -> 31
360 -> 756
12345 -> 11578
67895678 -> 125630871

1ではなくTrueを返すことができますか?
デニス

@Dennisいくつかの検討の後、私の答えはノーと判断しました。出力は少なくとも数字のように見える必要があります
リン

回答:



4

ゼリー、17 16 11バイト

デニスのおかげで5バイト。

ÆfÆC’^1‘ÆNP

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

説明

ÆfÆC’^1‘ÆNP   Main monadic chain. Argument: n

Æf            Yield the prime factors of n.
  ÆC          For each factor, count the number of primes below it.
              This effectively yields their indices.
    ’         Decrement [each] by 1.
     ^1       Xor with 1
       ‘      Increment [each] by 1.
        ÆN    Find their corresponding primes.
          P   Yield their product.

以前の16バイトバージョン

ÆnÆRiЀÆf’^1‘ÆNP

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

説明

ÆnÆRiЀÆf’^1‘ÆNP   Main monadic chain. Argument: n

Æn                 Yield the next prime from n.
  ÆR               Yield all primes from 2 to it.
       Æf          Yield prime factors of n
    iЀ            Yield their index in the prime list.
         ’         Decrement [each] by 1.
          ^1       Xor with 1
            ‘      Increment [each] by 1.
             ÆN    Find their corresponding primes.
               P   Yield their product.

以前の17バイトバージョン:

ÆnÆR©iЀÆf’^1‘ị®P

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

説明

ÆnÆR©iЀÆf’^1‘ị®P   Main monadic chain. Argument: n

Æn                  Yield the next prime from n.
  ÆR                Yield all primes from 2 to it.
    ©               Store to register.
        Æf          Yield prime factors of n
     iЀ            Yield their index in the prime list.
          ’         Decrement [each] by 1.
           ^1       Xor with 1
             ‘      Increment [each] by 1.
              ị®    Find their corresponding primes in
                    the list in register.
                P   Yield their product.

3

Mathematica、70 69バイト

1##&@@(Prime[BitXor[PrimePi@#+1,1]-1]^#2&)@@@FactorInteger@#/._@_->1&

整数を受け取って返す名前のない関数。入力時にエラーをスローします1が、正しい結果を計算します。

説明

いつものように、すべての構文糖のために、読み上げ順序は少しおかしいです。&右定義無名関数とその引数には、で参照されている##2#3、等

...FactorInteger@#...

入力を因数分解することから始めます。これにより、ペアのリストが得られます。{prime, exponent}たとえば、入力12はを与え{{2, 2}, {3, 1}}ます。やや不便、1提供します{{1, 1}}

(...&)@@@...

これ、左側の関数をレベル1の整数のリストに適用します。つまり、関数は各ペアに対して呼び出され、素数と指数を別々の引数として渡し、結果のリストを返します。(これはリスト上で関数をマッピングするのと似ていますが、2つの個別の引数を受け取るほうがペアを受け取るよりも便利です。)

...PrimePi@#...

built-inを使用して、(プライム)入力までのプライムの数を計算しPrimePiます。これにより、素数のインデックスが得られます。

...BitXor[...+1,1]-1...

結果はインクリメントされ、XORされ1、再びデクリメントされます。これは1 <-> 2, 3 <-> 4, 5 <-> 6, ...、すべての1ベースのインデックスを交換します。入力がそのノート1もたらす0ためPrimePi、その後にマッピングされ-1、このプロセスにおいて。後で対処します。

 ...Prime[...]^#2...

次に、正しく交換された素数であるn番目の素数(nは前の計算の結果)を取得し、入力の因数分解で元の素数の累乗に上げます。この時点でPrime[-1]エラーがスローされますが、評価されずに返されます。この場合のパワーは、これ1までのプロセス全体{Prime[-1]}が入力1と、他のすべての入力の正しいプライムパワーのリストを生成することです。

 1##&@@...

次に、すべての素数の累乗を増やします。機能の1##&ための標準的なゴルフのトリックですTimes。仕組みについては、このヒント(「引数のシーケンス」セクション)を参照してください。

最後に、1上記のすべてが結果となった入力を処理する必要がありPrime[-1]ます。単純な置換ルールで簡単に修正できます。はのf@x略であることに注意してくださいf[x]。そのフォームの任意の式と一致させ(他のすべての結果は整数、つまりアトミック式であるため)、それをaに置き換えたいだけです1

.../._@_->1

ここで、/.は、の略でReplaceAll、あらゆる_@_形式のパターンf[x](つまり、単一の子を持つ複合式)であり、->1「置換」と言い1ます。


3

Python 2、149 139バイト

Dennisのおかげで10バイト。

n=input()
p=f=1;w=[2]
while w[-1]<=n:f*=p;p+=1;w+=[p]*(-~f%p<1)
r=p=1;w=w[1:]
while n>1:
    p+=1
    while n%p<1:n/=p;r*=w[w.index(p)^1]
print r

input()Python 2で動作しますか?
NoOneIsHere

@NoOneIsHereはい、それは等価であるeval(input())Pythonの3の
MEGO

2

MATL、17バイト

EZqGYfy&mt2\Eq+)p

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

説明

これは指数を直接使用しません。代わりに、次のまたは前の素数によって各(可能性として繰り返される)素因数を交換します。

EZq    % Implicit input. Multiply by 2
Zq     % Array with sequence of primes up to that (this is more than enough)
GYf    % Prime factors of input, with possible repetitions
y      % Duplicate array with sequence of primes
&m     % Indices of prime factors in the sequence of primes
t2\    % Duplicate, modulo 2. Gives 0 for even indices, 1 for odd
Eq     % Multiply by 2, add 1. Transforms 0 / 1 into -1 / 1 
+      % Add. This modifies the indices to perform the swapping
)      % Apply the new indices into the sequence of primes
p      % Product. Implicit display

2

ジュリア、64バイト

~=primes
!n=prod(t->(~3n)[endof(~t[1])+1$1-1]^t[2],factor(2n))/3

オンラインでお試しください!最後のテストケースではTIOに必要なメモリが多すぎますが、ローカルで検証しました。

使い方

特別な場合の入力1(空の辞書の積が定義されていない)を避けるために、入力n2を掛け、最終結果をそのペア3で除算します。

factor(2n)2nの素因数のすべての正の指数を辞書として与えます。ディクショナリを反復処理すると、キーと値と素数と指数のペアが取得されます。関数prodはこれらのペアを取得し、それらに匿名関数t->...を適用して、結果の積を返します。

各ペアt =(p、e)に対して、endof(~t[1])またはpに等しいかそれ以下の素数の数kをendof(primes(t[1]))返します。これは、pk 番目の素数であることを意味します。

+1$1-1kをインクリメントし、XOR k + 11にして、結果をデクリメントします。kが奇数の場合、k + 1は偶数であるため、XORが増分され、最終結果はk + 1になります。kが偶数の場合、k + 1は奇数なので、XORは減少し、最終結果はk-1になります。ます。

最後に、我々はより少ないすべての素数を計算するかに等しい3N(~3n)またはprimes(3n)(最高素因数2nが小さいか等しいn個ならば、nは> 2、との間に常にプライムありますN2N)、インデックスに1つの選択のk +を1又はK - 1、及びそれを高めるE 番目と電源^t[2]


2

Python 2、112 109 108 95 94バイト

f=lambda n,k=4,m=6,p=[3,2]:1/n or n%p[1]and f(n,k+1,m*k,m*m%k*[k]+p)or p[len(p)*2%4]*f(n/p[1])

Ideoneでテストします。

使い方

場合fが呼び出され、それは最初の計算1 / N。結果がゼロ以外の場合、n1でf1を返します。

場合1> nは、次のことが起こります。

  • np [1](最初は2)で割り切れない場合n%p[1]、真理値を生成し、

    f(n,k+1,m*k,m*m%k*[k]+p)

    呼び出されます。

    このブランチは、最後から2番目の分岐がnを均等に分割するまで素数を生成します。そうするために、ウィルソンの定理の次の帰結を使用します。

    ウィルソンの定理の帰結

    常時、mはの階乗に等しいK - 1(初期!= 3 6及び4。各反復では、結果は、m*m%k*[k]素数のリストの先頭に追加されますP。、当然の結果でm*m%kある1場合、kは素数であり、そしてそうでない場合は0であるため、kが素数である場合に限り、これはkpの前に付加します。

  • もしNで割り切れるP [1] n%p[1]収率は0

    p[len(p)*2%4]*f(n/p[1])

    実行されます。

    pに偶数の素数が含まれている場合、0len(p)*2%4が生成され、最初の被乗数はp [0]の値を取ります。pに奇数の素数が含まれている場合、2が生成され、最初の被乗数はp [2]の値を取りますlen(p)*2%4

    いずれの場合でも、これは指数がp [1]の1つと交換されるべき素数であるため、np [1]で除算し(指数を1で減少)、その結果にf(n/p[1])対応する素数を乗算します(増加します)1の指数)。

    km、およびpをデフォルト値にf(n/p[1])リセットすることに注意してください。効率が向上しますが、6バイト余分にコストがかかります。f(n/p[1],k,m,p)


1

Pyth、25バイト

JfP_TSfP_ThQ*F+1m@Jx1xJdP

テストスイート。

説明

JfP_TSfP_ThQ*F+1m@Jx1xJdP

           Q    get input
          h     add one
      fP_T      find the first prime after it
     S          range from 1 to that prime
 fP_T           filter for the primes
J               assign to J

                        P  prime factorize input
                m      d   for each factor
                     xJ    find its index in J
                   x1      xor with 1
                 @J        find the corresponding entry in J
            *F+1           product of the whole list

1

ジュリア、155の 131 127バイト

n->(x=[sort([merge([p=>0for p=primes(n+1)],factor(n))...]);1=>0];prod([x[i-1][1]^x[i][2]*x[i][1]^x[i-1][2]for i=2:2:endof(x)]))

これは、整数を受け入れて整数を返す匿名関数です。呼び出すには、変数に割り当てます。基本機能が0.5でBaseから削除されたため、Juliaバージョン<0.5が必要です。

ゴルフをしていない:

function f(n::Int)
    # Create an array of pairs by merging the Dict created from factoring n
    # with all primes less than n+1 with a 0 exponent. Append an extra pair
    # to account for 1 and situations where x would otherwise have odd length.
    x = [sort([(merge([p=>0 for p in primes(n+1)], factor(n))...]); 1=>0]

    # Compute a^d * c^b, where a and c are primes with b and d as their
    # respective exponents.
    prod([x[i-1][1]^x[i][2] * x[i][1]^x[i-1][2] for i = 2:2:endof(x)])
end

オンラインでお試しください!(すべてのテストケースを含む)


1

実際には、15バイト

w`i;r♂Pí1^Pn`Mπ

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

説明:

w`i;r♂Pí1^Pn`Mπ
w                prime factorization
 `          `M   map (for (p,e) in factorization):
  i;               flatten, make a copy of p
    r♂P            [prime[i] for i in range(p)]
       í           index (essentially the 0-based prime index of p)
        1^         XOR with 1
          P        prime[n]
           n       repeat e times
              π  product

1

05AB1E、22バイト

Ó¾‚˜2ô€R˜DgL<Ø)øvy`smP

説明した

Ó¾‚˜                    # list of primeexponents with a 0 appended: n=10 -> [1,0,1,0] 
    2ô                  # split into pairs: [[1,0],[1,0]]
      €R˜               # reverse each pair and flatten: [0,1,0,1]
         DgL<Ø          # get list of primes corresponding to the exponents: [2,3,5,7]
              )ø        # zip lists: [[0,2],[1,3],[0,5],[1,7]]
                vy`sm   # raise each prime to its new exponent: [1,3,1,7]
                     P  # product: 21

オンラインで試す


0

J、21バイト

([:,_2|.\,&0)&.(_&q:)

nの素数指数を取得しますをゼロの素数として。次に、それらをサイズ2の重複しないサブリストに分割し、さらにゼロを追加します。次に、各サブリストを逆にし、それらをリストにフラット化します。最後に、素指数から数値に変換し直します。

使用法

   f =: ([:,_2|.\,&0)&.(_&q:)
   (,.f"0) 1 2 3 10 37 360 12345
    1     1
    2     3
    3     2
   10    21
   37    31
  360   756
12345 11578
   f 67895678x
125630871

説明

([:,_2|.\,&0)&.(_&q:)  Input: n
                _&q:   Obtain the list of prime exponents
(           )&.        Apply to the list of prime exponenets
         ,&0           Append a zero to the end of the list
    _2  \              Split the list into nonoverlapping sublists of size 2
      |.               Reverse each sublist
 [:,                   Flatten the list of sublists into a list
             &.(    )  Apply the inverse of (Obtain the list of prime exponents)
                       to convert back to a number and return it
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.