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.