양의 정수의 부분 분해


23

양의 정수의 집합은 d_1 d_2 ... d_kA는 인수 분해 양의 정수의 n경우

d_1 * d_2 * ... * d_k = n

각 양의 정수에는 고유 한 소인수 분해 가 있지만 일반적으로 일부 항이 복합 인 인수 분해도 있습니다. 예 :

12 = 6 * 2 = 4 * 3 = 3 * 2 * 2

단일 양의 정수를 입력으로 사용하고 고유 한 인수 분해의 전체 목록을 반환하거나 인쇄하는 프로그램, 함수, 동사 또는 이와 유사한 프로그램을 작성하십시오. 인수 분해는 임의의 순서로 생성 될 수 있으며, 그 항은 임의의 순서로있을 수 있지만, 둘은 서로 순열되지 않아야합니다. Factorisations는 포함되지 않을 수 있습니다 1이 개 예외 : 입력 n당신이 인수 분해를 제공 할 수 있습니다 n*1대신 n; 입력 11위해 빈 목록 대신 인수 분해 를 제공 할 수 있습니다 .

입력이 부호있는 32 비트 정수 범위에 있다고 가정 할 수 있습니다. 출력이 문자열 인 경우 인수 분해 내 숫자의 구분과 인수 분해의 구분이 명확하게 구분되어야하지만 (예를 들어)와 요소를 결합 할 필요는 없습니다 *.

코드는 합리적인 데스크톱 컴퓨터에서 10 분 이내에 유효한 입력을 처리 할 수 ​​있어야합니다.

1                  [[]]
                or [[1]]
                or [[1 1]]

7                  [[7]]
                or [[7 1]]
                or [[1 7]]

12                 [[12] [6 2] [4 3] [2 3 2]]
                or variants

16                 [[2 2 2 2] [2 2 4] [2 8] [4 4] [16]]
                or variants

901800900          a list of 198091 factorisations

1338557220         a list of 246218 factorisations

인수 분해 목록 9018009001338557220이를 확인할 수있는 위치 를 게시 할 수 있습니까 ? 내 코드는 해당 숫자에 대해 각각 2048 및 1024의 인수 분해를 제공하며 그 이유를 모르겠습니다.
Sherlock9

@ Sherlock9, 내가 집에 도착하면 그렇게 할 것입니다. 온라인 발전기로 할 수있는 것은 5336100에 대한 유효한 출력을 제공하는 것 입니다.
피터 테일러

3
이것은 ProjectEuler 도전을 생각 나게합니다 (불행히도 어느 것을 기억하지 못합니다). 그러나 거기 에서 인수 분해를 나열하는 대신 계수 화 의 수를 세어야했습니다.
flawr

관련 OEIS : A001055
Sherlock9

답변:


12

하스켈, 56 바이트

_!1=[[]]
i!n=[j:f|j<-[i..n],mod n j<1,f<-j!div n j]
(2!)

(2!)(1338557220::Int)로 컴파일 할 때 랩톱에서 5 분 안에 인쇄됩니다 ghc -O3.

Haskell, 62 바이트, 훨씬 빠름

i!n|i*i>n=[[n]]|0<1=[i:f|mod n i<1,f<-i!div n i]++(i+1)!n
(2!)

(2!)(1338557220::Int)로 컴파일하면 1/4 초 안에 노트북에 인쇄됩니다 ghc -O3.


이것을 어떻게 테스트합니까? ghc저를 제공 Parse error: naked expression at top level하고 ghci저를 준다parse error on input `='
피터 테일러

@PeterTaylor 함수 (2!)를 프로그램으로 바꾸고로 main = print ((2!) (1338557220::Int))컴파일 한 ghc -O3 factor.hs다음로 실행하십시오 ./factor.
Anders Kaseorg

7

Pyth, 29 바이트

Msam+Ldgd/Hdf!%HT>S@H2tG]]Hg2

M                                def g(G, H):
                   @H2             square root of H
                  S                1-indexed range up to floor
                 >    tG           all but first G − 1 elements
            f                      filter for elements T such that:
              %HT                    H mod T
             !                       is false (0)
   m                               map for elements d:
       gd/Hd                         g(d, H/d)
    +Ld                              prepend d to each element
  a                     ]]H        append [[H]]
 s                                 concatenate
                           g2Q   print g(2, input)

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

1338557220내 노트북 에서 20 초 안에 실행됩니다 .


@PeterTaylor 일반적인 방법 : pyth factor.pyth(또는 pyth -c 'Msam+Ldgd/Hdf!%HT>S@H2tG]]Hg2'), 16stdin 제공 . 현재 버전의 Pyth를 사용하고 있는지 확인하십시오. 암시 적은 Q3 월에 추가되었습니다. 그래도 당신이 어떻게 0으로 나눌 수 있는지 상상할 수 없습니다.
Anders Kaseorg

Arrrrgh. "대신을 사용 '하고 있었고 bash는 !%다른 것을 확장하고있었습니다 .
피터 테일러

6

파이썬 , 252 313 312 311 145 141 137 135 103 84 83 바이트

이것은 주로 Anders Kaseorg의 Pyth answer 에 기반합니다 . 모든 골프 제안을 환영합니다. 온라인으로 사용해보십시오!

편집 : Dennis 덕분에 19 바이트 골프. 코드의 오타를 수정하고 TIO 링크를 추가했습니다.

g=lambda n,m=2:[[n]]+[j+[d]for d in range(m,int(n**.5)+1)if n%d<1for j in g(n/d,d)]

언 골프 드 :

def g(n, m=2):
    a = [[n]]
    s = int(n**.5) + 1
    for d in range(m, s):
        if n%d == 0:
            for j in g(n/d, d):
                a.append([d]+j)
    return a

1
**.5가져 오기를 제거합니다.
Dennis

4

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

f=(n,a=[],m=2,i=m)=>{for(;i*i<=n;i++)n%i<1&&f(n/i,[...a,i],i);console.log(...a,n)}

@AndersKaseorg의 제곱근 트릭을 빌려서 전체 바이트를 절약했습니다. 인쇄 1의 입력은 1, 그렇지 않으면 인쇄되지 않습니다 1들.


1

루비 1.9+, 87 89 87 바이트

이 답변은 Anders Kaseorg의 Pyth 답변을 기반으로 합니다. 이 코드는 스테이 비 람다 ->는 1.9에서만 도입 되었기 때문에 Ruby 1.9 이후 버전에서만 작동합니다 . 모든 골프 제안은 환영합니다.

g=->n,m=2{(m..Math.sqrt(n)).select{|i|n%i<1}.flat_map{|d|g[n/d,d].map{|j|[d]+j}}+[[n]]}

언 골프 드 :

def g(n, m=2)
  a = [[n]]
  s = (m..Math.sqrt(n))
  t = s.select{|i|n%i<1}
  t.each do |d|
    g[n/d,d].each do |j|
      a.push([d]+j)
    end
  end
  return a
end

특정 버전의 루비가 필요합니까? 1.8.7에서 다음에 대한 불만이 접수되었습니다 g[n/d,d].wrong number of arguments (0 for 1)
Peter Taylor

분명히 스테이 비 람다 ->는 Ruby 1.9에서 도입되었습니다. 필요한 버전 번호를 표시하도록 답변을 편집하겠습니다.
Sherlock9

알았어 고마워. 아직도 궁금 g[n/d,d]합니다. g(n/d,d)더 이전 버전과 호환됩니다.
피터 테일러

1
아, f[n]일반적으로 stabby lambdas와 Ruby lambdas를 호출해야합니다. f(n)그리고 f n전화가 필요 def하고 end. 더 많은 정보를 원하시면 여기여기
Sherlock9

1

J, 52 바이트

[:~.q:<@/:~@(*//.)"$~#@q:_&(;@]<@(,~"{~0,#\@~.)"1)}:

일부 인수 분해가 반복 될 수 있고 각 인수 분해를 정렬 한 다음 중복 제거한 후 최종 단계를 수행해야하므로 효율성이 떨어집니다.

온라인으로 사용해보십시오! 그러나 입력 값을 작게 유지하십시오.

내 데스크탑에서 타이밍은

   f =: [:~.q:<@/:~@(*//.)"$~#@q:_&(;@]<@(,~"{~0,#\@~.)"1)}:
   timex 'r =: f 1338557220'
3.14172
   # r
246218
   timex 'r =: f 901800900'
16.3849
   # r
198091

설명

이 방법은 입력 정수 n 의 소인수에 대한 모든 설정 파티션 생성에 의존합니다 . n 에 제곱이없는 경우 성능이 가장 좋습니다 . 그렇지 않으면 중복 인수 분해가 생성됩니다.

[:~.q:<@/:~@(*//.)"$~#@q:_&(;@]<@(,~"{~0,#\@~.)"1)}:  Input: integer n
                                                  }:  Curtail, forms an empty array
                       q:                             Prime factorization
                     #@                               Length, C = count prime factors
                         _&(                     )    Repeat that many times on x = []
                                 (            )"1       For each row
                                            ~.            Unique
                                         #\@              Enumerate starting at 1
                                       0,                 Prepend 0
                                  ,~"{~                   Append each of those to a
                                                          copy of the row
                               <@                         Box it
                            ;&]                         Set x as the raze of those boxes
                                                      These are now the restricted growth
                                                      strings of order C
    q:                                                Prime factorization
            (    )"$~                                 For each RGS
               /.                                       Partition it
             */                                         Get the product of each block
        /:~@                                            Sort it
      <@                                                Box it
[:~.                                                  Deduplicate
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.