La fonction de Landau ( OEIS A000793 ) donne l'ordre maximum d'un élément du groupe symétrique . Ici, l'ordre d'une permutation est le plus petit entier positif tel que est l'identité - qui est égal au plus petit multiple commun des longueurs des cycles dans la décomposition du cycle de la permutation. Par exemple, qui est obtenu par exemple par (1,2,3) (4,5,6,7) (8,9,10,11,12,13,14).
Par conséquent, est également égal à la valeur maximale de où avec entiers positifs.
Problème
Écrivez une fonction ou un programme qui calcule la fonction de Landau.
Contribution
Un entier positif .
Production
, l'ordre maximum d'un élément du groupe symétrique .
Exemples
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
But
C'est le code-golf : le programme le plus court en octets gagne. (Néanmoins, les implémentations les plus courtes dans plusieurs langues sont les bienvenues.)
Notez qu'aucune exigence n'est imposée à l'exécution; par conséquent, votre implémentation ne doit pas nécessairement être en mesure de générer tous les résultats d'exemple ci-dessus dans un délai raisonnable.
Les failles standard sont interdites.
la source
Max[Apply@LCM/@IntegerPartitions@#]&
semble fonctionner pour moi et donnerait 36 octets si c'est correct.Max[LCM@@@IntegerPartitions@#]&
pour 31 octets , car le@@@
faitApply
au niveau 1.Python , 87 octets
Essayez-le en ligne!
Une fonction récursive qui suit le reste
n
à partitionner et le LCM en cours d'exécutiond
. Notez que cela signifie que nous n'avons pas besoin de suivre les nombres réels dans la partition ou le nombre d'entre eux que nous avons utilisés. Nous essayons chaque partie suivante possiblen-m
, en remplaçantn
par ce qui restem
, etd
aveclcm(d,n-m)
. Nous prenons le maximum de ces résultats récursifs etd
lui - même. Quand rien ne resten=0
, le résultat est justed
.La chose délicate est que Python n'a pas de fonctionnalités intégrées pour LCM, GCD ou factorisation principale. Pour ce faire
lcm(d,m-n)
, nous générons une liste de multiples ded
, et prenons la valeur atteignant le modulo minimumn-m
, c'est-à-dire aveckey=(n-m).__rmod__
. Puisquemin
donnera la valeur précédente en cas d'égalité, il s'agit toujours du premier multiple non nul ded
celui qui est divisible parn-m
, donc leur LCM. Nous n'avons que des multiplesd
pouvantd*(n-m)
être garantis pour atteindre le LCM, mais il est plus court d'écrired<<n
(ce qui estd*2**n
), ce qui suffit, les limites supérieures de Python étant exclusives.La
math
bibliothèque de Python 3 agcd
(mais paslcm
) après 3.5, ce qui est quelques octets plus court. Merci à @Joel d'avoir raccourci l'importation.Python 3.5+ , 84 octets
Essayez-le en ligne!
L'utilisation de
numpy
'slcm
est encore plus courte.Python avec numpy , 77 octets
Essayez-le en ligne!
la source
from math import*
est de 85 octets et l'utilisation deimport math
+math.gcd(...)
est de 84 octets. La même chose s'applique ànumpy
.numpy
La longueur de 5 est le point mort pourimport*
.import numpy
carnumpy.max
remplacerait le Python intégrémax
(idem pourmin
) s'ilfrom numpy import*
est utilisé. Cela ne pose pas de problème ici mais nous savons tous que ceimport*
n'est pas une bonne pratique de programmation en général.import*
soit sans aucun doute une mauvaise pratique, je ne pense pas que cela écrase réellement Pythonmin
etmax
, donc la confusion serait que quelqu'un attende la fonction de numpy et obtienne celle de base.Haskell , 44 octets
Essayez-le en ligne!
la source
Gelée , 7 octets
Essayez-le en ligne!
Un lien monadique prenant un entier comme argument et renvoyant un entier.
Explication
la source
JavaScript (ES6), 92 octets
Essayez-le en ligne!
JavaScript (ES6), 95 octets
Essayez-le en ligne!
Comment?
Nous définissons:
(c'est A008475 )
Ensuite, nous utilisons la formule (de A000793 ):
la source
Perl 6 , 50 octets
Essayez-le en ligne!
Vérifie toutes les permutations directement, comme la solution Ruby de @ histocrat.
Explication
1 Nous pouvons utiliser n'importe quelle séquence de n éléments distincts pour la vérification, nous prenons donc simplement la permutation elle-même.
2 Si le point de terminaison est un conteneur, l'
...
opérateur de séquence s'accorde avec le premier élément. Nous devons donc passer une liste à un seul élément.la source
Rubis , 77 octets
Essayez-le en ligne!
(1..)
la syntaxe de plage infinie est trop nouvelle pour TIO, donc le lien définit une limite supérieure arbitraire.Cela utilise la définition directe - énumérer toutes les permutations possibles, puis tester chacune en mutant
a
jusqu'à ce qu'elle revienne à sa position d'origine (ce qui signifie également que je peux simplement muter le tableau d'origine dans chaque boucle).la source
Gaia ,
252322 octetsEssayez-le en ligne!
L'absence de LCM ou de partitions entières rend cette approche assez longue.
la source
Haskell,
7067 octetsEssayez-le en ligne!
Edit: -3 octets grâce à @xnor.
la source
mapM(:[1..n])
, car l'élément supplémentaire est inoffensif.Python 3 + numpy,
11510299 octets-13 octets grâce à @Daniel Shepler
-3 octets supplémentaires de @Daniel Shepler
Essayez-le en ligne!
Méthode de la force brute: trouvez toutes les séquences possibles a, b, c, ... où a + b + c + ... = n, puis choisissez celle avec le plus grand lcm.
la source
c
pour renvoyer un ensemble et le mémorisez, cela ne fait pas mal du tout (mais il est vrai que cela se dégrade un peu): tio.run/##RY1BCsIwEEX3PUWWM1CLoiuhV/AKEsfUTkkmIU3AWnr2Ggvq7vM@//…Pyth ,
2415 octetsEssayez-le en ligne!
-9 octets: fait attention et remarqué que Pyth a en fait un GCD builtin (
i
).la source