Landauの関数を計算する


19

Landauの関数OEIS A000793)は、対称群要素の最大次数を与えます。ここで、置換順序は最小の正の整数、が恒等式であり、これは置換のサイクル分解におけるサイクルの長さの最小公倍数に等しくなります。たとえば、は、たとえば(1,2,3)(4,5,6,7)(8,9,10,11,12,13,14)によって達成されます。gnSnπkπkg(14)=84

したがって、はの最大値にも等しくここでは正の整数です。g(nlcma1aka1++ak=na1ak

問題

Landauの関数を計算する関数またはプログラムを作成します。

入力

正の整数。n

出力

gn、対称グループ要素の最大次数。Sn

n    g(n)
1    1
2    2
3    3
4    4
5    6
6    6
7    12
8    15
9    20
10   30
11   30
12   60
13   60
14   84
15   105
16   140
17   210
18   210
19   420
20   420

スコア

これはです。バイト単位の最短プログラムが勝ちます。(それにもかかわらず、複数の言語での最短の実装は歓迎です。)

実行時に課せられる要件はないことに注意してください。したがって、実装では、上記のすべてのサンプル結果を妥当な時間で生成できる必要はありません。

標準的な抜け穴は禁止されています。

回答:



10

Wolfram言語(Mathematica)、44バイト

Max[PermutationOrder/@Permutations@Range@#]&

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

Wolfram言語(Mathematica)、31バイト

@DanielScheplerにはより良い解決策があります。

Max[LCM@@@IntegerPartitions@#]&

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


言語にそれほど詳しくない-しかしMax[Apply@LCM/@IntegerPartitions@#]&私のために働くようであり、それが正しい場合36バイトを与えます。
ダニエルシェプラー

2
@DanielScheplerはい、スーパー!別のソリューションとして提案してみませんか?あなたも行うことができますMax[LCM@@@IntegerPartitions@#]&のために31のバイトので、@@@ないApplyレベル1で
ローマの

4

Python、87バイト

f=lambda n,d=1:max([f(m,min(range(d,d<<n,d),key=(n-m).__rmod__))for m in range(n)]+[d])

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

残りのnパーティションと実行中のLCM を追跡する再帰関数d。これは、パーティション内の実際の数や使用した数を追跡する必要がないことを意味することに注意してください。私たちは、それぞれの可能な次の部分を試しn-m置き換え、n残っているものでmあり、dlcm(d,n-m)。これらの再帰的な結果とdそれ自体の最大値を取得します。何も残っていn=0なければ、結果はただではありませんd

トリッキーなことは、PythonにはLCM、GCD、または素因数分解の組み込み機能がないことです。行うためにlcm(d,m-n)、我々はの倍数のリストを生成dし、最小剰余達成値とるn-mです、key=(n-m).__rmod__。以来、minタイの場合には、以前の値を与える、これは常に最初のゼロ以外の倍数でd割り切れるだn-mそれらのLCMので、。LCMにヒットすることが保証されるのはd最大数の倍数だけですが、Pythonの上限が排他的であるだけで十分です(つまり、)d*(n-m)記述するのは短くなります。d<<nd*2**n

Python 3のmathライブラリは3.5より後ですgcd(しかしlcm、そうではありません)。これは数バイト短くなっています。インポートを短縮してくれた@Joelに感謝します。

Python 3.5以降、84バイト

import math
f=lambda n,d=1:max([f(m,d*(n-m)//math.gcd(n-m,d))for m in range(n)]+[d])

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

使用するnumpyのはlcmまだ短いです。

numpyを使用した Python 、77バイト

from numpy import*
f=lambda n,d=1:max([f(m,lcm(d,n-m))for m in range(n)]+[d])

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


使用from math import*は85バイトで、import math+ math.gcd(...)は84バイトです。同じことが適用されnumpyます。
ジョエル

@ジョエルありがとう、私はそれを忘れていました。
xnor

@Joelありがとう、バイトカウントを更新するのを忘れていました。どちらも77です。numpy長さ5は、の損益分岐点ですimport*
xnor

右。その場合、Pythonの組み込み(と同じ)が使用されるとオーバーライドされるimport numpyため、使用することを好みnumpy.maxます。ここでは問題は発生しませんが、一般的にはそれが良いプログラミング手法ではないことを知っています。maxminfrom numpy import*import*
ジョエル

@Joel import*間違いなく悪い習慣ですが、実際にPython minとを上書きするとは思わないmaxので、混乱はnumpyの関数を期待して基本関数を取得する人になります。
xnor



3

JavaScript(ES6)、92バイト

lcm(a1,,ak)a1++akn

f=(n,i=1,l=m=0)=>n?i>n?m:f(n-i,i,l*i/(G=(a,b)=>b?G(b,a%b):a)(l,i)||i)&f(n,i+1,l)|m:m=l>m?l:m

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


JavaScript(ES6)、95バイト

f=(n,i=1,m)=>i>>n?m:f(n,i+1,i<m|(g=(n,k=2,p=0)=>k>n?p:n%k?p+g(n,k+1):g(n/k,k,p*k||k))(i)>n?m:i)

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

どうやって?

以下を定義します。

{g1=0gn=j=1Npjkjためにn>1そしてn=j=1Npjkj

(これはA008475です

次に、式(A000793から)を使用します。

fn=最大gknk


3

Perl 6、50バイト

{max .map:{+(.[$_],{.[@^a]}...$_,)}}o&permutations

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

@histocratのRubyソリューションのように、すべての順列を直接チェックします。

説明

                                     &permutations  # Permutations of [0;n)
{                                  }o  # Feed into block
     .map:{                       }  # Map permutations
                           ...  # Construct sequence
             .[$_]  # Start with permutation applied to itself [1]
                  ,{.[@^a]}  # Generate next item by applying permutation again
                              $_,  # Until it matches original permutation [2]
           +(                    )  # Length of sequence
 max  # Find maximum

1チェックにはn個の異なるアイテムのシーケンスを使用できるため、順列自体を取得します。

2エンドポイントがコンテナの場合、...シーケンス演算子は最初のアイテムに対してスマートマッチします。そのため、単一要素のリストを渡す必要があります。


2

ルビー、77バイト

f=->n{a=*0...n;a.permutation.map{|p|(1..).find{a.map!{|i|p[i]}==a.sort}}.max}

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

(1..) 無限範囲の構文はTIOにとって新しすぎるため、リンクは任意の上限を設定します。

これは直接定義を使用します-可能なすべての順列を列挙aし、元の位置に戻るまで変化させることでそれぞれをテストします(これは、各ループで元の配列を単に変更できることも意味します)。


2

ガイア25 23 22バイト

,:Π¤d¦&⊢⌉/
1w&ḍΣ¦¦⇈⊢¦⌉

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

LCMまたは整数パーティションがないため、このアプローチはかなり長くなります。

,:Π¤d¦&⊢⌉/		;* helper function: LCM of 2 inputs


1w&ḍΣ¦¦			;* push integer partitions
         ¦		;* for each
       ⇈⊢		;* Reduce by helper function
	  ⌉		;* and take the max


1

Python 3 + numpy、115 102 99バイト

@Daniel Sheplerのおかげで-13バイト

-3 @Daniel Sheplerからさらにバイト

import numpy
c=lambda n:[n]+[numpy.lcm(i,j)for i in range(1,n)for j in c(n-i)]
l=lambda n:max(c(n))

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

ブルートフォース法:すべての可能なシーケンスa、b、c、...を見つけます(a + b + c + ... = n)。次に、最も高いlcmのシーケンスを選択します。


ちなみに、87バイトを実行するPython 3 + numpyソリューションがあります。
ダニエルシェプラー

私はそれを行う方法を理解するためにnumpyについて十分に知らないので、私はあなたのソリューションを別々に投稿することをお勧めします。
ハイツ

まあ、私はしばらくそれを投稿するのを待つつもりだった。
ダニエルシェップラー

私はあなたがこのチャレンジを投稿したことに気づきました。すみません、頑張ります。
ハイツ

1
あなたが変更した場合はc(確かにそれは少しungolfんが)セットを返し、それがすべてでは悪い行いませんmemoizeする:tio.run/##RY1BCsIwEEX3PUWWM1CLoiuhV/AKEsfUTkkmIU3AWnr2Ggvq7vM@//...
ダニエルSchepler

0

Pyth24 15バイト

eSm.U/*bZibZd./

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

             ./Q  # List of partitions of the input
  m               # map that over lambda d:
   .U       d     # reduce d (with starting value first element of the list) on lambda b,Z:
     /*bZgbZ      # (b * Z) / GCD(b, Z)
 S                # this gives the list of lcms of all partitions. Sort this
e                 # and take the last element (maximum)

-9バイト:注意を払い、Pythには実際にGCDが組み込まれていることに気付きました(i)。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.