Calcola la funzione di Landau


19

La funzione g(n) Landau ( OEIS A000793 ) fornisce l'ordine massimo di un elemento del gruppo simmetrico Sn . Qui, l'ordine di una permutazione π è il più piccolo intero positivo k tale che πk è l'identità - che è uguale al multiplo meno comune delle lunghezze dei cicli nella decomposizione del ciclo della permutazione. Ad esempio, g(14)=84 che si ottiene ad esempio da (1,2,3) (4,5,6,7) (8,9,10,11,12,13,14).

Pertanto, g(n) è uguale anche al valore massimo di lcm(a1,,ak) in cui a1++ak=n con a1,,ak interi positivi.

Problema

Scrivi una funzione o un programma che calcola la funzione di Landau.

Ingresso

Un numero intero positivo n .

Produzione

g(n) , l'ordine massimo di un elemento del gruppo simmetricoSn .

Esempi

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

Punto

Questo è : vince il programma più breve in byte. (Tuttavia, le implementazioni più brevi in ​​più lingue sono benvenute.)

Si noti che non sono previsti requisiti per il runtime; pertanto, l'implementazione non deve necessariamente essere in grado di generare tutti i risultati dell'esempio sopra riportato in tempi ragionevoli.

Sono vietate le scappatoie standard.

Risposte:



10

Wolfram Language (Mathematica) , 44 byte

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

Provalo online!

Wolfram Language (Mathematica) , 31 byte

@DanielSchepler ha una soluzione migliore:

Max[LCM@@@IntegerPartitions@#]&

Provalo online!


Non molto familiare con la lingua, ma Max[Apply@LCM/@IntegerPartitions@#]&sembra funzionare per me e darebbe 36 byte se è corretto.
Daniel Schepler,

2
@DanielSchepler sì, super! Perché non lo proponi come soluzione separata? Puoi anche fare Max[LCM@@@IntegerPartitions@#]&per 31 byte , perché lo @@@fa Applyal livello 1.
Roman

4

Python , 87 byte

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

Provalo online!

Una funzione ricorsiva che tiene traccia del resto ndella partizione e dell'LCM in esecuzione d. Si noti che ciò significa che non è necessario tenere traccia dei numeri effettivi nella partizione o di quanti ne abbiamo utilizzati. Proviamo ogni possibile parte successiva n-m, sostituendola ncon ciò che resta me dcon lcm(d,n-m). Prendiamo il massimo di quei risultati ricorsivi e di per dsé. Quando non rimane nulla n=0, il risultato è giustod .

La cosa difficile è che Python non ha alcun built-in per LCM, GCD o fattorizzazione primaria. Per fare lcm(d,m-n), generiamo un elenco di multipli di de prendiamo il valore che raggiunge il modulo minimo n-m, cioè con key=(n-m).__rmod__. Dato minche darà il valore precedente in caso di pareggio, questo è sempre il primo multiplo diverso da zero dche è divisibile per n-m, quindi il loro LCM. Abbiamo solo multipli di dfino a d*(n-m)che sia garantito a colpire il LCM, ma è più breve di scrittura d<<n(che è d*2**n) che basta con limiti superiore di Python essere esclusivo.

La mathlibreria di Python 3 ha gcd(ma non lcm) dopo 3.5, che è più breve di alcuni byte. Grazie a @Joel per abbreviare l'importazione.

Python 3.5+ , 84 byte

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

Provalo online!

L'uso numpydi lcmè ancora più breve.

Python con numpy , 77 byte

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

Provalo online!


L'uso from math import*è di 85 byte e l'utilizzo di import math+ math.gcd(...)è 84 byte. Lo stesso vale per numpy.
Joel

@Joel Grazie, me ne sono dimenticato.
xnor

@Joel Grazie, mi ero dimenticato di aggiornare il conteggio dei byte, sono entrambi 77. numpyLa lunghezza di 5 è il punto di pareggio per import*.
xnor

Giusto. In quel caso preferisco usare import numpyperché numpy.maxavrebbe la precedenza sul built-in di Python max(lo stesso per min) se from numpy import*usato. Non causa problemi qui, ma sappiamo tutti che import*non è una buona pratica di programmazione in generale.
Joel

@Joel Anche se import*è senza dubbio una cattiva pratica, non penso che sovrascriva effettivamente Python mine max, quindi la confusione sarebbe qualcuno che si aspetta la funzione del numpy e ottiene quella di base.
xnor


3

Gelatina , 7 byte

Œṗæl/€Ṁ

Provalo online!

Un collegamento monadico che prende un intero come argomento e restituisce un intero.

Spiegazione

Œṗ      | Integer partitions
  æl/€  | Reduce each using LCM
      Ṁ | Maximum

3

JavaScript (ES6), 92 byte

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

Provalo online!


JavaScript (ES6), 95 byte

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)

Provalo online!

Come?

Definiamo:

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

(questo è A008475 )

Quindi usiamo la formula (da A000793 ):

f(n)=maxg(k)nK


3

Perl 6 , 50 byte

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

Provalo online!

Controlla direttamente tutte le permutazioni, come la soluzione Ruby di @histocrat.

Spiegazione

                                     &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 Possiamo usare qualsiasi sequenza di n elementi distinti per il controllo, quindi prendiamo semplicemente la permutazione stessa.

2 Se l'endpoint è un contenitore, l' ...operatore di sequenza esegue lo smartmatch rispetto al primo elemento. Quindi dobbiamo passare un elenco di elementi singoli.


2

Rubino , 77 byte

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

Provalo online!

(1..) la sintassi a intervallo infinito è troppo nuova per TIO, quindi il collegamento imposta un limite superiore arbitrario.

Questo utilizza la definizione diretta - enumera tutte le possibili permutazioni, quindi verifica ciascuna mutando afino a quando non torna alla sua posizione originale (il che significa anche che posso semplicemente mutare l'array originale in ciascun loop).


2

Gaia , 25 23 22 byte

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

Provalo online!

Non avere LCM o partizioni intere rende questo approccio piuttosto lungo.

,:Π¤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 byte

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

Provalo online!

Modifica: -3 byte grazie a @xnor.


Penso che dovrebbe funzionare mapM(:[1..n]), dato che l'elemento extra è innocuo.
xnor

1

Python 3 + numpy, 115 102 99 byte

-13 byte grazie a @Daniel Shepler

-3 più byte da @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))

Provalo online!

Metodo della forza bruta: trova tutte le possibili sequenze a, b, c, ... dove a + b + c + ... = n, quindi scegli quella con il mcm più alto.


Per inciso, ho una soluzione numpy Python 3 + con 87 byte.
Daniel Schepler,

Non so abbastanza su numpy da capire come farlo, quindi ti suggerisco di pubblicare la soluzione separatamente.
Hiatsu,

Beh, stavo programmando di aspettare un po 'per pubblicarlo.
Daniel Schepler,

Ho appena realizzato che hai pubblicato questa sfida. Scusa, farò del mio meglio.
Hiatsu,

1
Se cambi cper restituire un set e memoize, non funziona affatto male (anche se, certamente, lo fa ungolf un po '): tio.run/##RY1BCsIwEEX3PUWWM1CLoiuhV/AKEsfUTkkmIU3AWnr2Ggvq7vM@//…
Daniel Schepler

0

Pyth , 24 15 byte

eSm.U/*bZibZd./

Provalo 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 byte: prestato attenzione e notato che Pyth ha effettivamente un GCD incorporato ( i).

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.