나누기 제수 나누기


17

양의 정수를 감안할 때 항상 튜플 찾을 수 있습니다 (케이1,케이2,...,케이미디엄) 정수는 케이나는2 그러한 케이1케이2...케이미디엄=

케이1|케이2 , 케이2|케이 ,  , 케이미디엄1|케이미디엄.
여기|방법 의 배수 인 a , "는 분할 된 B"를 말한다. n>1 경우 모든 항목 ki2 이상이어야합니다 . 를 들어 n=1 , 우리는 그런 요인이없고, 따라서 우리는 빈 튜플을 얻는다.

이것이 어디에서 왔는지 궁금한 경우 :이 분해는 수 이론에서 불변 인자 분해 로 알려져 있으며 유한하게 생성 된 Abelian 그룹분류에 사용됩니다 .

도전

을 감안할 때 출력 모두 같은 튜플 (케이1,케이2,...,케이미디엄) 주어진에 대한 , 정확히 한 번 어떤에서처럼 주문. 표준 출력 형식이 허용됩니다.

  1: () (empty tuple)
  2: (2)
  3: (3)
  4: (2,2), (4)
  5: (5)
  6: (6)
  7: (7)
  8: (2,2,2), (2,4), (8)
  9: (3,3), (9)
 10: (10)
 11: (11)
 12: (2,6), (12)
108: (2,54), (3,3,12), (3,6,6), (3,36), (6,18), (108)

관련 : http://oeis.org/A000688 , n의 모든 곱셈 파티션 나열


각 튜플을 역순으로 출력 할 수 있습니까? (예 12,3,3)
Arnauld

1
@Arnauld 예, 오름차순 또는 내림차순으로 정렬되는 한 괜찮습니다.
flawr

입력을 정수> = 2로 제한 할 수 있습니까? 그렇지 않으면 기존 답변 중 일부가 무효화됩니까?
Nick Kennedy

1
사양은 을 포함하는 양의 정수를 입력으로 제공 할 수 있다고 명확하게 말합니다 . 이제 변경하면 실제로 사양을 준수하는 모든 사람이 답변을 변경해야합니다. =1
flawr

답변:



3

05AB1E , 13 바이트

Òœ€.œP€`êʒüÖP

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

Ò                      # prime factorization of the input
 œ€.œ                  # all partitions
     P                 # product of each sublist
      €`               # flatten
        ê              # sorted uniquified
         ʒ             # filter by:
          üÖ           #  pairwise divisible-by (yields list of 0s or 1s)
            P          #  product (will be 1 iff the list is all 1s)

Òœ€.œP하위 목록을 얻는 데 사용 하는 좋은 방법입니다 . 나는 또한 더 짧은 것을 찾는 데 실제로 어려움을 겪었다 Åœ. ;)
Kevin Cruijssen

n = 1 실패 (질문에 대한 의견 참조)
Nick Kennedy


2

자바 스크립트 (V8) ,  73  70 바이트

내림차순으로 튜플을 인쇄합니다 (케이미디엄,케이미디엄1,...,케이1).

f=(n,d=2,a=[])=>n>1?d>n||f(n,d+1,a,d%a[0]||f(n/d,d,[d,...a])):print(a)

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

댓글

f = (             // f is a recursive function taking:
  n,              //   n   = input
  d = 2,          //   d   = current divisor
  a = []          //   a[] = list of divisors
) =>              //
  n > 1 ?         // if n is greater than 1:
    d > n ||      //   unless d is greater than n,
    f(            //   do a recursive call with:
      n,          //     -> n unchanged
      d + 1,      //     -> d + 1
      a,          //     -> a[] unchanged
      d % a[0] || //     unless the previous divisor does not divide the current one,
      f(          //     do another recursive call with:
        n / d,    //       -> n / d
        d,        //       -> d unchanged
        [d, ...a] //       -> d preprended to a[]
      )           //     end of inner recursive call
    )             //   end of outer recursive call
  :               // else:
    print(a)      //   this is a valid list of divisors: print it

1

05AB1E , 17 15 14 바이트

ѦIиæʒPQ}êʒüÖP

더 큰 테스트 사례의 경우 매우 느립니다.

@Grimy 덕분에 -1 바이트 .

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

설명:

Ñ               # Get all divisors of the (implicit) input-integer
 ¦              # Remove the first value (the 1)
  Iи            # Repeat this list (flattened) the input amount of times
                #  i.e. with input 4 we now have [2,4,2,4,2,4,2,4]
    æ           # Take the powerset of this list
     ʒ  }       # Filter it by:
      PQ        #  Where the product is equal to the (implicit) input
         ê      # Then sort and uniquify the filtered lists
          ʒ     # And filter it further by:
           ü    #  Loop over each overlapping pair of values
            Ö   #   And check if the first value is divisible by the second value
             P  #  Check if this is truthy for all pairs

                # (after which the result is output implicitly)

감사합니다. 그리고 제수를 잘 부르십시오. 여전히 매우 느립니다=8하지만 모든 비트가 도움이되며 성능을 향상시키기 위해 추가 바이트 비용이 들지 않으면 사용하지 않는 것이 좋습니다. :)
Kevin Cruijssen

1
13 이상 . 여전히 짧아 질 수 있습니다.
Grimmy

1

자바 스크립트, 115 바이트

f=(n,a=[],i=1)=>{for(;i++<n;)n%i||(a=a.concat(f(n/i).filter(e=>!(e[0]%i)).map(e=>[i].concat(e))));return n>1?a:[a]}

나중에 설명을 쓰겠습니다


1

Wolfram Language (Mathematica) , 78 76 72 71 67 바이트

If[#>(p=1##2),Join@@If[i∣##,##~#0~i,{}]~Table~{i,2,#/p},{{##2}}]&

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

재귀 검색 트리.


무차별 대입 솔루션, 64 바이트 :

Union@Cases[Range@#~Tuples~#,{a__,__}/;1a==#&&a>=2&&1∣a:>{a}]&

n의 모든 곱하기 파티션나열 하기 위해 Mathematica 솔루션 을 간단하게 수정했습니다 .

이것은 확인해야하기 때문에 튜플의 경우 동일한 논리를 사용하여보다 효율적인 버전을 사용해보십시오 .


0

apt , 22 바이트

â Åï c à f@¥XשXäv eÃâ

시도 해봐

â Åï c à f@¥XשXäv eÃâ     :Implicit input of integer U
â                          :Divisors
  Å                        :Slice off the first element, removing the 1
   ï                       :Cartesian product
     c                     :Flatten
       à                   :Combinations
         f                 :Filter by
          @                :Passing each sub-array X through the following function
           ¥               :  Test U for equality with
            X×             :  X reduced by multiplication
              ©            :  Logical AND with
               Xä          :  Consecutive pairs of X
                 v         :  Reduced by divisibility
                   e       :  All truthy?
                    Ã      :End filter
                     â     :Deduplicate
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.