랜도의 함수 계산


19

Landau의 함수 ( OEIS A000793 )은 대칭 그룹 의 요소의 최대 차수를 제공합니다 . 여기에서, 순열의 순서 는 가장 작은 양의 정수 이므로, 는 동일성입니다. 이는 순열의 사이클 분해에서 사이클의 길이의 최소 공배수와 같습니다. 예를 들어, 는 예를 들어 (1,2,3) (4,5,6,7) (8,9,10,11,12,13,14)에 의해 달성됩니다.()에스π케이π케이(14)=84

따라서, 되고도의 최대 값과 동일 여기서 으로 양의 정수.()lcm(1,,케이)1 + + K = N 1 , ... , K1++케이=1,,케이

문제

Landau의 기능을 계산하는 기능 또는 프로그램을 작성하십시오.

입력

양의 정수 입니다.

산출

() 대칭 족 원소의 최대 순서 .에스

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 Language (Mathematica) , 44 바이트

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

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

Wolfram Language (Mathematica) , 31 바이트

@DanielSchepler는 더 나은 솔루션을 제공합니다.

Max[LCM@@@IntegerPartitions@#]&

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


언어에 익숙하지는 않지만 Max[Apply@LCM/@IntegerPartitions@#]&저에게 효과적이며 올바른 경우 36 바이트를 줄 것입니다.
Daniel Schepler

2
@DanielSchepler 예, 슈퍼! 왜 별도의 솔루션으로 제안하지 않습니까? 당신은 할 수 Max[LCM@@@IntegerPartitions@#]&에 대한 31 바이트 때문에, @@@수행 Apply레벨 1에서
로마

4

파이썬 , 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,와 d함께 lcm(d,n-m). 우리는 그 재귀적인 결과와 d그 자체를 최대한 활용 합니다. 아무 것도 남지 않으면 n=0결과는 그저 아닙니다 d.

까다로운 점은 Python에 LCM, GCD 또는 주요 인수 분해를위한 기본 제공 기능이 없다는 것입니다. 이를 위해 lcm(d,m-n), 우리는의 배수의 목록을 생성 d하고, 최소 모듈을 달성 값을 가지고 n-m함께, key=(n-m).__rmod__. min동점 인 경우 초기 값을 제공 하므로 항상 0으로 d나눌 수있는 배수가 아니므 로 n-mLCM입니다. 우리 는 LCM에 도달하는 것을 보장 d하기 d*(n-m)위해 최대 배수 이지만, 파이썬의 상한이 배타적이면 쓰기가 짧습니다 d<<n( d*2**n).

파이썬 3의 math라이브러리는 3.5 이후에 gcd(그러나 아님 lcm) 몇 바이트 더 짧습니다. 가져 오기를 줄인 @Joel에게 감사합니다.

파이썬 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 , 77 바이트의 Python

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.
Joel

@Joel 감사합니다, 나는 그것에 대해 잊었습니다.
xnor

@Joel 감사합니다. 바이트 수를 업데이트하는 것을 잊었습니다. 모두 77 numpy입니다. 5의 길이는 손익 분기점 입니다 import*.
xnor

권리. 이 경우 내가 사용하는 것을 선호 import numpy하기 때문에 numpy.max오버라이드 (override) 할 파이썬의 내장 max(동일위한 min경우) from numpy import*사용됩니다. 여기서 문제를 일으키지 import*는 않지만 일반적으로 좋은 프로그래밍 방법이 아니라는 것을 알고 있습니다.
Joel

@Joel import*의심 할 여지없이 나쁜 습관이지만 실제로 파이썬 min과를 덮어 쓰지 않는다고 생각 max하므로 혼란은 numpy의 기능을 기대하고 기본 기능을 얻는 사람이 될 것입니다.
xnor



3

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

lcm(1,,케이)1++케이

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

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


자바 스크립트 (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)

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

어떻게?

우리는 다음을 정의합니다.

{(1)=0()=제이=1제이케이제이...에 대한>1=제이=1제이케이제이

(이것은 A008475입니다 )

그런 다음 공식을 사용합니다 ( A000793 ) :

에프()=최대(케이)케이


3

펄 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

2

하스켈, 70 67 바이트

f n=maximum[foldl1 lcm a|k<-[1..n],a<-mapM id$[1..n]<$[1..k],sum a==n]

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

편집 : @xnor 덕분에 -3 바이트.


mapM(:[1..n])여분의 요소가 무해하기 때문에 그렇게해야한다고 생각합니다 .
xnor

1

파이썬 3 + NumPy와, 115 (102) 99 바이트

@Daniel Shepler 덕분에 -13 바이트

@Daniel Shepler에서 -3 바이트 더

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 솔루션이 있습니다.
Daniel Schepler

numpy에 대해 충분히 알지 못하므로 솔루션을 별도로 게시하는 것이 좋습니다.
히아 쓰

글쎄, 나는 그것을 게시하기 위해 잠시 기다릴 계획이었습니다.
Daniel Schepler

난 당신 이이 도전을 게시 깨달았다. 미안, 최선을 다하겠습니다.
히아 쓰

1
당신이 변경하는 경우 c집합을 반환하고 전혀 나쁘게하지 않습니다 memoize하는 (하지만 틀림없이 그것은 ungolf를 조금 않습니다) : tio.run/##RY1BCsIwEEX3PUWWM1CLoiuhV/AKEsfUTkkmIU3AWnr2Ggvq7vM@//...
다니엘 Schepler

0

Pyth , 24 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.