(λ(n)(cadr(argmax cadr((let()(local-require math/number-theory)factorize)n))))
Experimente online!
(Não tenho certeza se existe um consenso sobre o que constitui uma solução completa do Racket, então vou com a convenção do Mathematica de que uma função pura conta.)
Como funciona
factorize
dá a fatoração como uma lista de pares: (factorize 108)
dá '((2 2) (3 3))
. O segundo elemento de um par é dado por cadr
, uma abreviação para a composição de car
(cabeça de uma lista) com cdr
(cauda de uma lista).
Eu me sinto boba fazendo (cadr (argmax cadr list))
para encontrar o máximo dos segundos elementos, mas max
não funciona em listas: (max (map cadr list))
não faz o que queremos. Eu não sou especialista em Racket, então talvez haja uma maneira padrão melhor de fazer isso.
Raquete, 93 bytes
(λ(n)(define(p d m)(if(=(gcd m d)d)(+(p d(/ m d))1)0))(p(argmax(λ(d)(p d n))(range 2 n))n))
Experimente online!
Como funciona
Uma versão alternativa que não importa factorize
e faz tudo do zero, mais ou menos. A função (p m d)
encontra o maior poder do d
que divide m
e então nós apenas encontrar maior valor de (p n d)
para d
entre 2
e n
. (Não precisamos restringir isso a números primos, pois não haverá um poder composto que funcione melhor do que os poderes primos.)