正の整数の部分分解


23

正の整数のコレクションd_1 d_2 ... d_kは、次の場合に正の整数の因数分解nです。

d_1 * d_2 * ... * d_k = n

各正の整数には一意の素因数分解がありますが、一般に、いくつかの項が合成される因数分解もあります。例えば

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

入力として単一の正の整数を取り、その明確な因数分解の完全なリストを返すか出力するプログラム、関数、動詞、または同様のものを書きます。因数分解は任意の順序で作成でき、それらの用語は任意の順序で作成できますが、2つが互いの順列であってはなりません。因数分解には12つの例外が含まれないn場合がn*1ありnます。入力のために、空のリストの代わりに1因数分解1を与えることができます。

入力は符号付き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

あなたはのfactorisationsのリスト投稿することができます901800900し、1338557220我々はそれらを確認することができますどこに?私のコードでは、これらの数値に対してそれぞれ2048と1024の因数分解を行っていますが、その理由はわかりません。
Sherlock9

@ Sherlock9、私が家に帰るとそれをします。オンラインジェネレーターでできることは、5336100の有効な出力を提供することです
ピーターテイラー

3
これは、ProjectEulerの課題を思い出させます(残念ながら、どれを覚えていません)。ただし、そこにリストするのではなく、因数分解の数を数える必要がありました。
flawr

関連OEIS:A001055
Sherlock9

回答:


12

Haskell、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ます。


これをテストするにはどうすればよいですか?ghcParse error: naked expression at top levelを与え、私をghci与えるparse error on input `='
ピーターテイラー

@PeterTaylor関数(2!)をプログラムに置き換えmain = print ((2!) (1338557220::Int))、コンパイルしてghc -O3 factor.hs、実行し./factorます。
アンデルスカセオルグ16

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を使用していることを確認してください。暗黙的Qに3月に追加されました。ただし、ゼロによる除算がどのように行われるかは想像できません。
アンデルスカセオルグ16

ああ。私はの"代わりに使用して'おり、bashは!%他の何かに拡張していました。
ピーターテイラー

6

パイソン252 313 312 311 145 141 137 135 103 84 83バイト

これは、主にAnders KaseorgのPyth回答に基づいています。ゴルフの提案は歓迎します。オンラインでお試しください!

編集:デニスのおかげで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インポートを取り除きます。
デニス

4

JavaScript(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

Ruby 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

これには特定のバージョンのRubyが必要ですか?1.8.7で、私は苦情を取得g[n/d,d]wrong number of arguments (0 for 1)
ピーター・テイラー

どうやら、安定したラムダ->がRuby 1.9で導入されたようです。回答を編集して、必要なバージョン番号を表示します。
Sherlock9

はい、ありがとう。私はまだ興味がありg[n/d,d]ます。g(n/d,d)より下位互換性があります。
ピーターテイラー

1
ああ、f[n]一般的にはstabby lambdaとRuby lambdaを呼び出す必要があります。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が2乗の場合、パフォーマンスが最適になります。そうでない場合、因子分解が重複して作成されます。

[:~.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.