소수 지수를 이웃과 교환


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

@ 데니스 몇 가지 고려 후, 나는 내 대답이 아니오라고 결정했습니다. 적어도 출력해야 살펴 수있다.
Lynn

답변:



4

젤리, 17 16 11 바이트

Dennis 덕분에 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에서 정수의 목록에 왼쪽에있는 기능. (이것은 목록에 함수를 매핑하는 것과 비슷하지만 두 개의 개별 인수를받는 것이 쌍을받는 것보다 편리합니다.)

...PrimePi@#...

내장을 사용하여 (프라임) 입력을 포함하여 최대 프라임 수를 계산합니다 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]. 우리는 그 형식의 표현을 일치시키고 싶습니다 (다른 모든 결과는 정수, 즉 원자 표현이기 때문에) 1.

.../._@_->1

여기 /.에 짧은 ReplaceAll, _@_형태의 무엇이든을위한 패턴이다 f[x](하나의 아이, 즉 어떤 복합 표현)과 ->1"로 대체 말한다 1".


3

파이썬 2, 149139 바이트

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()파이썬 2에서 작동합니까?
NoOneIsHere6

@NoOneIsHere 예, 그것은 eval(input())파이썬 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, 예) , endof(~t[1])또는 endof(primes(t[1]))리턴 K , 작은 또는 동일한 개수의 소수 (P) 즉, p는 은 IS K 번째 소수.

+1$1-1증가한다 K , XOR의 K + 1하나 , 그 결과를 감소. 경우 K는 홀수이고, K + 1은 배타적 논리합 증가 및 최종 결과가되도록, 짝수 K + 1 . 경우 K는 짝수이고, K + 1은 배타적 논리합 줄여, 최종 결과가되므로 홀수 1 - K .

마지막으로, 우리는 작은 모든 소수를 계산하거나 동일 3N(~3n)primes(3n)(최고 소인수 2N은 작거나 같은 N 경우 n은> 2 , 사이 항상 소수있다 N2N ), 인덱스에서 하나를 선택 케이 +를 1 또는 K - 1 , 및로 상승 전자 번째 로 전원 ^t[2].


2

파이썬 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가 호출 먼저 계산 N / 1 . 결과가 0이 아닌 경우 n1 이고 f1을 반환합니다 .

경우 N> 1 , 다음과 같은 상황이 발생합니다.

  • np [1] (초기 2 ) 로 나눌 수없는 경우 n%p[1], 진솔한 값을 산출하고

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

    호출됩니다.

    이 분기는 두 번째가 n을 균등하게 나눌 때까지 소수를 생성 합니다. 그렇게하기 위해, 그것은 윌슨 정리 의 다음과 같은 목록을 사용 한다 .

    윌슨 정리의 목록

    항상, m은 의 계승 같다 K - 1 (초기 = 3~6!4 각각의 반복에서의 결과. m*m%k*[k]솟수들의 목록을 위해 미리 도착 P 필연적으로이. m*m%k하다 경우, k는 소수이고 0 이 아니라면,이 앞에 추가 그래서 케이P 의 경우에만, k는 소수이다.

  • 경우 n은 로 나누어 P [1] , n%p[1]수득 0

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

    처형된다.

    경우 p는 소수의 양에도 포함 len(p)*2%4수득한다 0 과 제 피승수는 소요의 값 P [0]가 . p 에 홀수의 소수가 들어 있으면 2len(p)*2%4 를 산출 하고 첫 번째 배수는 p [2] 의 값을 갖습니다 .

    두 경우 모두 지수가 p [1] 중 하나와 교환되어야하는 소수 이므로, np [1]로 나누고 (지수를 1 씩 감소 ) 결과에 f(n/p[1])해당 소수를 곱합니다 (증가) 1에 의한 지수 )

    참고 f(n/p[1])리셋의 K , m페이지 기본값으로합니다. f(n/p[1],k,m,p)6 바이트의 추가 비용으로 효율성이 향상됩니다.


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 의 소수 지수 를 0의 소수로 구합니다. 그런 다음 추가 0으로 채우면서 크기가 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.