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.

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!


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!


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

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


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.


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


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

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.


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.


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

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.