La derivada de una función es una piedra angular de las matemáticas, la ingeniería, la física, la biología, la química y también una gran cantidad de otras ciencias. Hoy vamos a calcular algo solo relacionado tangencialmente: la derivada aritmética.
Definición
La derivada aritmética a(n)
o n'
se define aquí ( A003415 ) por una serie de propiedades que son similares a la derivada de una función.
a(0) = a(1) = 0
,a(p) = 1
, dondep
es cualquier primo, ya(mn) = m*a(n) + n*a(m)
.
La tercera regla se basa en la regla del producto para la diferenciación de funciones: las funciones f(x)
y g(x)
, (fg)' = f'g + fg'
. Así que con los números, (ab)' = a'b + ab'
.
También es de destacar que, dado que la derivada aritmética se puede extender a los números negativos a través de esta simple relación a(-n) = -a(n)
, la entrada puede ser negativa.
Reglas
- Escriba un programa o función que, dado cualquier número entero
n
, devuelva la derivada aritmética den
. - Las entradas serán , para evitar problemas con los tamaños enteros y los números demasiado grandes para tener en cuenta una cantidad de tiempo razonable. Su algoritmo aún debería ser capaz de calcular teóricamente la derivada aritmética de números fuera de este rango.
-230 < n < 230
- Se permiten incorporados para matemática simbólica, factorización prima y diferenciación.
Ejemplos
> 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 siempre, si el problema no está claro, hágamelo saber. ¡Buena suerte y buen golf!
fuente
prime
ena(prime)
? ¿Es solo un número primo?Respuestas:
MATL , 12 bytes
Pruébalo en línea!
Explicación
Considere un entero a con | a |> 1, y deje que los factores primos (posiblemente repetidos) de | a | ser f 1 , ..., f n . Entonces el resultado deseado es un · (1 / f 1 + ... + 1 / f n ).
fuente
1
da1
como su descomposición de números "primos". Es un resultado extraño (una matriz vacía sería más significativa). Pero así es como funciona Matlab. Y también CJam. Entonces, ¿supongo que debe haber una buena razón para producir1
en ese caso? ¿Qué piensas? He tenido la tentación de redefinir laYf
función para generar una matriz vacía1
, pero no estaba seguroPython, 59 bytes
Una función recursiva. En entradas grandes, se queda sin profundidad de pila en los sistemas típicos a menos que lo ejecute con algo como Python apilable .
La definición recursiva se implementa directamente, contando para buscar factores primos candidatos. Dado que
f(prime)=1
, sin
tiene un primop
como factor, tenemosf(n) == p*f(n/p)+n/p
.fuente
Jalea,
87 bytes-1 byte por @Dennis
Utiliza la misma fórmula que todos los demás. Sin embargo, hay un pequeño truco con el que lidiar
0
.Probarlo aquí .
fuente
Python 2,
87787674 bytesMejoras gracias a @Maltysen:
Mejora adicional por dos bytes:
Mejora adicional gracias a @xnor:
Explicación
La derivada aritmética de
a
es igual aa
veces la suma de los recíprocos de los factores primos dea
. No se necesita ninguna excepción para 1 ya que la suma de los recíprocos de los factores primos de 1 es cero.fuente
abs(a)>1
puede sera*a>1
.d,s = 2,0
Haskell,
20390 bytesGracias @nimi!
Todavía no tengo idea de qué muescas causan qué interpretación, esta es la más corta que logré hasta ahora, y como siempre, estoy seguro de que se puede jugar mucho más. Voy a intentarlo de nuevo por la noche.
fuente
J,
302719 caracteresGracias a @Dennis por cortar 3 personajes.
Gracias a @Zgarb por cortar 8 personajes.
Pruébalo en línea!
Entrada de muestra:
Cómo funciona:
fuente
Pyth -
108 bytesMe encanta la entrada implícita! Debería equipararlo con Jelly para la mayoría de las cosas (excepto las habilidades de golf de Dennis).
Test Suite .
fuente
Haskell, 59 bytes
Implementa la definición recursiva directamente, con una variable auxiliar
p
que cuenta para buscar posibles factores primos, a partir de2
. La última línea es la función principal, que se conectap=2
a la función binaria definida en la primera línea.La función comprueba cada caso por turno:
n*n<2
, entoncesn
es uno de-1,0,1
, y el resultado es0
.n
no es un múltiplo dep
, incrementep
y continúe.n=p*r
, y por la propiedad "derivada", el resultado esr*a(p)+p*a(r)
, que se simplifica ar+p*a(r)
porquep
es primo.El último caso ahorra bytes al vincularlos
r
en un resguardo , lo que también evita el uso1>0
de repeticionesotherwise
. Sir
pudiera vincularse antes, la segunda condiciónmod n p>0
podría verificarse comor*p==n
, que es 3 bytes más corta, pero no veo cómo hacerlo.fuente
En serio ,
17141112 bytesMi primera respuesta seria. Esta respuesta se basa en la respuesta MATL de Luis Mendo y la idea de que la derivada aritmética de un número
m
es igual a donde es cada factor primo de multiplicidad. Mi adición es tener en cuenta que, si , entonces . Gracias a Mego por el golf y la ayuda para corregir errores. Pruébalo en línea!m·(1/p1 + 1/p2 + ... + 1/pn)
p1...pn
n
m = p1e1·p2e2·...·pnen
a(m) = m·(e1/p1 + e2/p2 + ... + en/pn)
No golfista:
fuente
Japt -x ,
161310 bytes- 6 bytes gracias a @Shaggy
Pruébalo en línea!
fuente
N.k()
no funciona en ellos.-x
bandera.APL (Dyalog Extended) ,
139 bytesUna solución simple La versión Dyalog Unicode era simplemente una versión más larga de esto, por lo que se ha omitido.
Editar: ahorró 4 bytes adoptando el método en la solución Jelly de lirtosiast .
Pruébalo en línea!
Ungolfing
fuente
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:
fuente
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!
fuente
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
fuente
Mathematica 10.0, 39 bytes
fuente
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...
fuente
05AB1E,
74 bytesPort of @lirtosiast's Jelly answer.
Pruébelo en línea o verifique todos los casos de prueba .
Explicación:
fuente
Perl 5, 62 bytes
Utiliza la fórmula (de OEIS):
If n = Product p_i^e_i, a(n) = n * Sum (e_i/p_i).
fuente
Perl 6, 90
Esto puede ser un poco lento para grandes números. Reemplace
2..^n
con2..n.sqrt
un código más largo pero un cálculo más rápido.fuente
Tinta , 183 bytes
Pruébalo en línea!
Me niego a creer que esta sea una buena solución, pero tampoco veo una manera de mejorarla.
fuente
Pari / GP , 45 bytes
Pruébalo en línea!
fuente