La función de Landau ( OEIS A000793 ) da el orden máximo de un elemento del grupo simétrico . Aquí, el orden de una permutación es el número entero positivo más pequeño tal que es la identidad, que es igual al mínimo común múltiplo de las longitudes de los ciclos en la descomposición del ciclo de la permutación. Por ejemplo, que se logra, por ejemplo, con (1,2,3) (4,5,6,7) (8,9,10,11,12,13,14).S n π k π k g ( 14 ) = 84
Por lo tanto, también es igual al valor máximo de donde con enteros positivos.
Problema
Escriba una función o programa que calcule la función de Landau.
Entrada
Un entero positivo .
Salida
, el orden máximo de un elemento del grupo simétrico .
Ejemplos
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
Puntuación
Esto es code-golf : el programa más corto en bytes gana. (Sin embargo, las implementaciones más cortas en varios idiomas son bienvenidas).
Tenga en cuenta que no hay requisitos impuestos en tiempo de ejecución; por lo tanto, su implementación no necesariamente necesita poder generar todos los resultados del ejemplo anterior en un tiempo razonable.
Las lagunas estándar están prohibidas.
fuente
Max[Apply@LCM/@IntegerPartitions@#]&
parece funcionar para mí y daría 36 bytes si es correcto.Max[LCM@@@IntegerPartitions@#]&
por 31 bytes , porque lo@@@
haceApply
en el nivel 1.Python , 87 bytes
Pruébalo en línea!
Una función recursiva que rastrea el resto
n
de la partición y el LCM en ejecuciónd
. Tenga en cuenta que esto significa que no necesitamos rastrear los números reales en la partición o cuántos de ellos hemos usado. Intentamos cada posible parte siguienten-m
, reemplazandon
con lo que quedam
yd
conlcm(d,n-m)
. Tomamos el máximo de esos resultados recursivos y ded
sí mismo. Cuando no queda nadan=0
, el resultado es justod
.Lo complicado es que Python no tiene ninguna función incorporada para LCM, GCD o factorización prima. Para hacerlo
lcm(d,m-n)
, generamos una lista de múltiplos ded
, y tomamos el valor que alcanza el módulo mínimon-m
, es decir, conkey=(n-m).__rmod__
. Dadomin
que dará el valor anterior en caso de empate, este es siempre el primer múltiplo distinto de cerod
divisible porn-m
, por lo que su LCM. Solo tenemos múltiplos ded
hastad*(n-m)
garantizar que lleguemos al LCM, pero es más corto de escribird<<n
(que esd*2**n
), lo que es suficiente con que los límites superiores de Python sean exclusivos.La
math
biblioteca de Python 3 tienegcd
(pero nolcm
) después de 3.5, que es unos pocos bytes más cortos. Gracias a @Joel por acortar la importación.Python 3.5+ , 84 bytes
Pruébalo en línea!
Usar
numpy
'slcm
es aún más corto.Python con numpy , 77 bytes
Pruébalo en línea!
fuente
from math import*
es de 85 bytes y usarimport math
+math.gcd(...)
es de 84 bytes. Lo mismo se aplica anumpy
.numpy
's longitud de 5 es el punto de equilibrio paraimport*
.import numpy
porquenumpy.max
anularía el Python incorporadomax
(lo mismo paramin
) sifrom numpy import*
se usa. Aquí no causa problemas, pero todos sabemos queimport*
no es una buena práctica de programación en general.import*
sin duda es una mala práctica, no creo que realmente sobrescriba a Pythonmin
ymax
, por lo tanto, la confusión sería que alguien espera la función de Numpy y obtiene la base.Haskell , 44 bytes
Pruébalo en línea!
fuente
Jalea , 7 bytes
Pruébalo en línea!
Un enlace monádico que toma un número entero como argumento y devuelve un número entero.
Explicación
fuente
JavaScript (ES6), 92 bytes
Pruébalo en línea!
JavaScript (ES6), 95 bytes
Pruébalo en línea!
¿Cómo?
Definimos:
(esto es A008475 )
Luego usamos la fórmula (de A000793 ):
fuente
Perl 6 , 50 bytes
Pruébalo en línea!
Comprueba todas las permutaciones directamente, como la solución Ruby de @ histocrat.
Explicación
1 Podemos usar cualquier secuencia de n elementos distintos para la verificación, por lo que simplemente tomamos la permutación en sí.
2 Si el punto final es un contenedor, el
...
operador de secuencia coincide con el primer elemento. Entonces tenemos que pasar una lista de un solo elemento.fuente
Ruby , 77 bytes
Pruébalo en línea!
(1..)
la sintaxis de rango infinito es demasiado nueva para TIO, por lo que el enlace establece un límite superior arbitrario.Esto utiliza la definición directa: enumere todas las permutaciones posibles, luego pruebe cada una mutando
a
hasta que vuelva a su posición original (lo que también significa convenientemente que puedo mutar la matriz original en cada bucle).fuente
Gaia ,
252322 bytesPruébalo en línea!
No tener LCM o particiones enteras hace que este enfoque sea bastante largo.
fuente
Haskell,
7067 bytesPruébalo en línea!
Editar: -3 bytes gracias a @xnor.
fuente
mapM(:[1..n])
, ya que el elemento extra es inofensivo.Python 3 + numpy,
11510299 bytes-13 bytes gracias a @Daniel Shepler
-3 bytes más de @Daniel Shepler
Pruébalo en línea!
Método de fuerza bruta: encuentre todas las secuencias posibles a, b, c, ... donde a + b + c + ... = n, luego elija la que tenga el mcm más alto.
fuente
c
para devolver un conjunto y memorizarlo, no funciona mal (aunque es cierto que se deshace un poco): tio.run/##RY1BCsIwEEX3PUWWM1CLoiuhV/AKEsfUTkkmIU3AWnr2Ggvq7vM@//…Pyth ,
2415 bytesPruébalo en línea!
-9 bytes: prestó atención y notó que Pyth en realidad tiene un GCD incorporado (
i
).fuente