A derivada de uma função é uma pedra angular da matemática, engenharia, física, biologia, química e também um grande número de outras ciências. Hoje vamos calcular algo apenas tangencialmente relacionado: a derivada aritmética.
Definição
A derivada aritmética a(n)
ou n'
é definida aqui ( A003415 ) por um número de propriedades semelhantes à derivada de uma função.
a(0) = a(1) = 0
,a(p) = 1
, ondep
está qualquer prime, ea(mn) = m*a(n) + n*a(m)
.
A terceira regra é baseada na regra do produto para a diferenciação de funções: para funções f(x)
e g(x)
, (fg)' = f'g + fg'
. Então, com números (ab)' = a'b + ab'
.
Além disso, como a derivada aritmética pode ser estendida aos números negativos por meio dessa relação simples a(-n) = -a(n)
, a entrada pode ser negativa.
Regras
- Escreva um programa ou função que, dado qualquer número inteiro
n
, retorne a derivada aritmética den
. - As entradas serão , para evitar problemas com tamanhos e números inteiros muito grandes para levar em consideração uma quantidade de tempo razoável. Seu algoritmo ainda deve ser capaz de calcular teoricamente a derivada aritmética de números fora desse intervalo.
-230 < n < 230
- São permitidos embutidos para matemática simbólica, fatoração principal e diferenciação.
Exemplos
> a(1)
0
> a(7)
1
> a(14) # a(7)*2 + a(2)*7 = 1*2 + 1*7 = 9
9
> a(-5) # a(-5) = -a(5) = -1
-1
> a(8) # a(8) = a(2**3) = 3*2**2 = 12
12
> a(225) # a(225) = a(9)*25 + a(25)*9 = 6*25 + 10*9 = 150 + 90 = 240
240
> a(299792458) # a(299792458) = a(2)*149896229 + a(7)*42827494 + a(73)*4106746 + a(293339)*1022 = 1*149896229 + 1*42827494 + 1*4106746 + 1*1022 = 149896229 + 42827494 + 4106746 + 1022 = 196831491
196831491
Como sempre, se o problema não estiver claro, entre em contato. Boa sorte e bom golfe!
fonte
prime
ema(prime)
? É apenas um número primo?Respostas:
MATL , 12 bytes
Experimente online!
Explicação
Considere um número inteiro a com | a |> 1, e deixe os fatores primários (possivelmente repetidos) de | a | seja f 1 , ..., f n . Então o resultado desejado é a · (1 / f 1 + ... + 1 / f n ).
fonte
1
dá1
como decomposição de números "primos". É um resultado estranho (uma matriz vazia seria mais significativa). Mas é assim que o Matlab funciona. E também CJam. Então eu acho que deve haver uma boa razão para produzir1
nesse caso? O que você acha? Fui tentado a redefinir aYf
função para gerar uma matriz vazia1
, mas não tinha certezaPython, 59 bytes
Uma função recursiva. Em entradas grandes, fica sem profundidade de pilha em sistemas típicos, a menos que você a execute com algo como o Stackless Python .
A definição recursiva é implementada diretamente, contando até a busca de fatores primos candidatos. Desde a
f(prime)=1
, sen
tem um primop
como um fator, nós temosf(n) == p*f(n/p)+n/p
.fonte
Geléia,
87 bytes-1 byte por @Dennis
Usa a mesma fórmula que todo mundo faz. No entanto, há um pequeno truque para lidar com
0
.Experimente aqui .
fonte
Python 2,
87787674 bytesMelhorias graças a @Maltysen:
Melhoria adicional em dois bytes:
Melhorias adicionais graças ao @xnor:
Explicação
A derivada aritmética de
a
é igual aa
vezes a soma dos recíprocos dos fatores primos dea
. Nenhuma exceção para 1 é necessária, uma vez que a soma dos recíprocos dos fatores primos de 1 é zero.fonte
abs(a)>1
pode sera*a>1
.d,s = 2,0
Haskell,
20390 bytesObrigado @nimi!
Ainda não tenho idéia de quando quais recuos causam qual interpretação, esse é o mais curto que consegui até agora e, como sempre, tenho certeza de que pode jogar muito mais. Vou tentar novamente à noite.
fonte
J,
302719 caracteresObrigado a @Dennis por cortar 3 caracteres.
Obrigado ao @Zgarb por cortar 8 caracteres.
Experimente online!
Entrada de amostra:
Como funciona:
fonte
Pitão -
108 bytesAmando a entrada implícita! Deve equipará-lo a Jelly para a maioria das coisas (exceto as habilidades de golfe de Dennis).
Conjunto de Teste .
fonte
Haskell, 59 bytes
Implementa a definição recursiva diretamente, com uma variável auxiliar
p
que conta até procurar possíveis fatores primos, começando em2
. A última linha é a função principal, que se conectap=2
à função binária definida na primeira linha.A função verifica cada caso por sua vez:
n*n<2
, entãon
é um dos-1,0,1
, e o resultado é0
.n
não for múltiplo dep
, aumentep
and continue.n=p*r
e pela propriedade "derivada", o resultado ér*a(p)+p*a(r)
, o que simplificar+p*a(r)
porquep
é primo.The last case saves bytes by binding
r
in a guard, which also avoids the1>0
for the boilerplateotherwise
. Ifr
could be bound earlier, the second conditionmod n p>0
could be checked asr*p==n
, which is 3 bytes shorter, but I don't see how to do that.fonte
Seriously,
17141112 bytesMy first ever Seriously answer. This answer is based on Luis Mendo's MATL answer and the idea that the arithmetic derivative of a number
m
is equal tom·(1/p1 + 1/p2 + ... + 1/pn)
wherep1...pn
is every prime factor ofn
to multiplicity. My addition is to note that, ifm = p1e1·p2e2·...·pnen
, thena(m) = m·(e1/p1 + e2/p2 + ... + en/pn)
. Thanks to Mego for golfing and bug fixing help. Try it online!Ungolfing:
fonte
Japt -x,
161310 bytes- 6 bytes thanks to @Shaggy
Try it online!
fonte
N.k()
doesn't work on them.-x
flag.APL (Dyalog Extended),
139 bytesA simple solution. The Dyalog Unicode version was simply a longer version of this so it has been omitted.
Edit: Saved 4 bytes by adopting the method in lirtosiast's Jelly solution.
Try it online!
Ungolfing
fonte
Ruby,
876680757068 bytesThis answer is based on Luis Mendo's MATL answer, wythagoras's Python answer, and the idea that the arithmetic derivative of a number
m
is equal tom·(1/p1 + 1/p2 + ... + 1/pn)
wherep1...pn
is every prime factor ofn
to multiplicity.This function is called in the following way:
Ungolfing:
fonte
Julia,
7243 bytesThis is an anonymous function that accepts an integer and returns a float. To call it, assign it to a variable.
For an input integer n, if n2 ≤ 1 return 0. Otherwise obtain the prime factorization of n2 as a
Dict
, then for each prime/exponent pair, divide the prime by its exponent, then divide n by the result. This is just computing n x / p, where p is the prime factor and x is its exponent, which is the same as summing n / p, x times. We sum the resulting array and divide that by 2, since we've summed twice as much as we need. That's due to the fact that we're factoring n2 rather than n. (Doing that is a byte shorter than factoring |n|.)Saved 29 bytes thanks to Dennis!
fonte
Jolf, 13 bytes
Kudos to the MATL answer for the algorithm! Try it here, or test them all at once. (Outputs [key,out] in an array.)
Explanation
fonte
Mathematica 10.0, 39 bytes
fonte
FactorInteger@1
yields{1,1}
, so theIf
function is no longer necessary, saving 10 bytes.{{1,1}}
, returned by my version ({}
is the expected result to me).APL(NARS), 35 char, 70 bytes
test and how to use:
I thought that it would not be ok because I don't know if c variable is composed (and not a prime)... But seems ok for the test...
fonte
05AB1E,
74 bytesPort of @lirtosiast's Jelly answer.
Try it online or verify all test cases.
Explanation:
fonte
Perl 5, 62 bytes
Uses the formula (from OEIS):
If n = Product p_i^e_i, a(n) = n * Sum (e_i/p_i).
fonte
Perl 6, 90
This might be a bit slow for large numbers. Replace
2..^n
with2..n.sqrt
for longer code but faster computation.fonte
Ink, 183 bytes
Try it online!
I refuse to believe this is a good solution, but I can't see a way to improve it either.
fonte
Pari/GP, 45 bytes
Try it online!
fonte