Oblicz funkcję Landaua

19

Funkcja Landaua g(n) ( OEIS A000793 ) podaje maksymalny porządek elementu grupy symetrycznej Sn . Tutaj porządek permutacji π jest najmniejszą dodatnią liczbą całkowitą k tak że πk jest identycznością - która jest równa najmniejszej wspólnej wielokrotności długości cykli w rozkładzie cyklu permutacji. Na przykład g(14)=84 co osiąga się na przykład przez (1,2,3) (4,5,6,7) (8,9,10,11,12,13,14).

Dlatego też, g(n) jest równa maksymalnej wartości lcm(a1,,ak) gdzie 1 + + k = n z o 1 , ... , K dodatnimi liczbami całkowitymi.a1++ak=na1,,ak

Problem

Napisz funkcję lub program, który oblicza funkcję Landaua.

Wejście

Dodatnia liczba całkowita n .

Wynik

g(n) , maksymalna kolejność elementu grupy symetrycznejSn .

Przykłady

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

Wynik

To jest : Wygrywa najkrótszy program w bajtach. (Niemniej mile widziane są najkrótsze wdrożenia w wielu językach).

Pamiętaj, że nie ma żadnych wymagań dotyczących czasu działania; dlatego twoja implementacja niekoniecznie musi być w stanie wygenerować wszystkie powyższe wyniki przykładowe w rozsądnym czasie.

Standardowe luki są zabronione.

Daniel Schepler
źródło

Odpowiedzi:

10

Wolfram Language (Mathematica) , 44 bajty

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

Wypróbuj online!

Wolfram Language (Mathematica) , 31 bajtów

@DanielSchepler ma lepsze rozwiązanie:

Max[LCM@@@IntegerPartitions@#]&

Wypróbuj online!

rzymski
źródło
Nie Max[Apply@LCM/@IntegerPartitions@#]&jestem zbyt obeznany z językiem - ale wydaje się, że działa dla mnie i dałby 36 bajtów, jeśli jest poprawny.
Daniel Schepler
2
@DanielSchepler tak, super! Dlaczego nie zaproponujesz tego jako osobnego rozwiązania? Możesz nawet zrobić Max[LCM@@@IntegerPartitions@#]&dla 31 bajtów , ponieważ @@@robi to Applyna poziomie 1.
Rzym
4

Python , 87 bajtów

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

Wypróbuj online!

Funkcja rekurencyjna, która śledzi pozostałe ndo partycji i działającego LCM d. Zauważ, że oznacza to, że nie musimy śledzić faktycznych liczb na partycji ani tego, ile z nich wykorzystaliśmy. Staramy każdy możliwy następna część, n-mzastępując ntym, co pozostało m, i dz lcm(d,n-m). Bierzemy maksimum tych rekurencyjnych wyników i dsiebie. Kiedy nic nie pozostaje n=0, wynik jest po prostu d.

Problem polega na tym, że Python nie ma żadnych wbudowanych funkcji LCM, GCD ani faktoryzacji liczb pierwszych. Aby to zrobić lcm(d,m-n), generujemy listę wielokrotności di bierzemy wartość osiągającą minimalny moduł n-m, czyli key=(n-m).__rmod__. Ponieważ minpoda wcześniejszą wartość w przypadku remisu, jest to zawsze pierwsza niezerowa wielokrotność dpodzielna przez n-m, więc ich LCM. My tylko wielokrotności d, aby d*(n-m)zagwarantować trafienie w LCM, ale krótsze jest pisanie d<<n(co jest d*2**n), co wystarcza, gdy górne granice Pythona są wyłączne.

mathBiblioteka Pythona 3 ma gcd(ale nie lcm) po wersji 3.5, która jest kilka bajtów krótsza. Dzięki @Joel za skrócenie importu.

Python 3.5+ , 84 bajty

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

Wypróbuj online!

Korzystanie numpyz lcmjest jeszcze krótsze.

Python z numpy , 77 bajtów

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

Wypróbuj online!

xnor
źródło
Użycie from math import*to 85 bajtów, a użycie import math+ math.gcd(...)to 84 bajty. To samo dotyczy numpy.
Joel
@Joel Dzięki, zapomniałem o tym.
xnor
@Joel Dzięki, zapomniałem zaktualizować liczbę bajtów, oboje 77. numpy„s długość 5 jest próg rentowności dla import*.
xnor
Dobrze. W takim przypadku wolę użyć, import numpyponieważ numpy.maxzastąpiłoby wbudowane Python max(to samo dla min), jeśli from numpy import*jest używane. Nie powoduje tu problemów, ale wszyscy wiemy, że import*ogólnie nie jest to dobra praktyka programowania.
Joel
@Joel Choć import*jest bez wątpienia złą praktyką, nie sądzę, że rzeczywiście nadpisuje Pythona mini maxtak zamieszanie byłby ktoś spodziewa funkcję NumPy i uzyskanie jednego bazowego.
xnor
3

Galaretka , 7 bajtów

Œṗæl/€Ṁ

Wypróbuj online!

Łącze monadyczne przyjmujące za argument liczbę całkowitą i zwracające liczbę całkowitą.

Wyjaśnienie

Œṗ      | Integer partitions
  æl/€  | Reduce each using LCM
      Ṁ | Maximum
Nick Kennedy
źródło
3

JavaScript (ES6), 92 bajty

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

Wypróbuj online!


JavaScript (ES6), 95 bajtów

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)

Wypróbuj online!

W jaki sposób?

Definiujemy:

{g(1)=0g(n)=j=1Npjkjforn>1andn=j=1Npjkj

(to jest A008475 )

Następnie używamy formuły (z A000793 ):

f(n)=maxg(k)nk

Arnauld
źródło
3

Perl 6 , 50 bajtów

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

Wypróbuj online!

Sprawdza bezpośrednio wszystkie permutacje, takie jak rozwiązanie Ruby @ histocrat.

Wyjaśnienie

                                     &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 Do sprawdzenia możemy użyć dowolnej sekwencji n różnych elementów, więc po prostu bierzemy permutację.

2 Jeśli punktem końcowym jest kontener, ...operator sekwencji dopasowuje inteligentnie do pierwszego elementu. Musimy więc przekazać listę pojedynczego elementu.

nwellnhof
źródło
2

Rubinowy , 77 bajtów

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

Wypróbuj online!

(1..) składnia nieskończonego zakresu jest zbyt nowa dla TIO, więc link ustawia dowolną górną granicę.

Wykorzystuje to bezpośrednią definicję - wylicz wszystkie możliwe kombinacje, a następnie przetestuj każdą z nich, mutując, aaż wróci do swojej pierwotnej pozycji (co również wygodnie oznacza, że ​​mogę po prostu mutować oryginalną tablicę w każdej pętli).

histocrat
źródło
2

Gaia , 25 23 22 bajtów

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

Wypróbuj online!

Brak partycji LCM lub liczb całkowitych powoduje, że takie podejście jest dość długie.

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


1w&ḍΣ¦¦			;* push integer partitions
         ¦		;* for each
       ⇈⊢		;* Reduce by helper function
	  ⌉		;* and take the max
Giuseppe
źródło
2

Haskell, 70 67 bajtów

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

Wypróbuj online!

Edycja: -3 bajty dzięki @xnor.

nimi
źródło
Myślę, że powinno to działać mapM(:[1..n]), ponieważ dodatkowy element jest nieszkodliwy.
xnor
1

Python 3 + numpy, 115 102 99 bajtów

-13 bajtów dzięki @Daniel Shepler

-3 więcej bajtów od @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))

Wypróbuj online!

Metoda brutalnej siły: znajdź wszystkie możliwe sekwencje a, b, c, ... gdzie a + b + c + ... = n, a następnie wybierz tę o najwyższym lcm.

Hiatsu
źródło
Nawiasem mówiąc, mam rozwiązanie numpy Python 3 + z 87 bajtami.
Daniel Schepler
Nie wiem wystarczająco dużo o numpy, aby wymyślić, jak to zrobić, więc sugeruję, abyś opublikował swoje rozwiązanie osobno.
Hiatsu
Cóż, planowałem poczekać chwilę, aby go opublikować.
Daniel Schepler
Właśnie zdałem sobie sprawę, że opublikowałeś to wyzwanie. Przepraszam, dam z siebie wszystko.
Hiatsu
1
Jeśli zmienisz, caby zwrócić zestaw i zapamiętywać, nie robi to wcale źle (choć trzeba przyznać, że trochę nie działa): tio.run/##RY1BCsIwEEX3PUWWM1CLoiuhV/AKEsfUTkkmIU3AWnr2Ggvq7vM@//…
Daniel Schepler
0

Pyth , 24 15 bajtów

eSm.U/*bZibZd./

Wypróbuj online!

             ./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 bajtów: zwróciłem uwagę i zauważyłem, że Pyth ma wbudowaną funkcję GCD ( i).

ar4093
źródło