La dérivée d'une fonction est une pierre angulaire des mathématiques, de l'ingénierie, de la physique, de la biologie, de la chimie et d'un grand nombre d'autres sciences. Aujourd'hui, nous allons calculer quelque chose qui ne concerne que de manière tangentielle: la dérivée arithmétique.
Définition
Le dérivé arithmétique a(n)
ou n'
est défini ici ( A003415 ) par un certain nombre de propriétés similaires au dérivé d’une fonction.
a(0) = a(1) = 0
,a(p) = 1
, oùp
est tout premier, eta(mn) = m*a(n) + n*a(m)
.
La troisième règle est basée sur la règle du produit de différenciation des fonctions: des fonctions f(x)
et g(x)
, (fg)' = f'g + fg'
. Donc , avec des chiffres, (ab)' = a'b + ab'
.
À noter également, puisque la dérivée arithmétique peut être étendue aux nombres négatifs via cette relation simple a(-n) = -a(n)
, l’entrée peut être négative.
Règles
- Ecrivez un programme ou une fonction qui, avec n'importe quel entier
n
, retourne la dérivée arithmétique den
. - Les entrées seront , pour éviter les problèmes avec les tailles entières et les nombres trop grands pour prendre en compte une quantité de temps raisonnable. Votre algorithme devrait toujours pouvoir théoriquement calculer la dérivée arithmétique des nombres en dehors de cette plage.
-230 < n < 230
- Les fonctions intégrées pour les mathématiques symboliques, la décomposition en facteurs premiers et la différenciation sont autorisées.
Exemples
> 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
Comme toujours, si le problème n'est pas clair, merci de me le faire savoir. Bonne chance et bon golf!
la source
prime
ena(prime)
? Est-ce juste un nombre premier?Réponses:
MATL , 12 octets
Essayez-le en ligne!
Explication
Considérons un entier a avec | a |> 1, et laissez les facteurs premiers (éventuellement répétés) de | a | être f 1 , ..., f n . Alors le résultat souhaité est un · (1 / f 1 + ... + 1 / f n ).
la source
1
donne en fait1
comme "premier" décomposition en nombre. C'est un résultat étrange (un tableau vide serait plus significatif). Mais c'est comme ça que Matlab fonctionne. Et aussi CJam. Donc je suppose qu'il doit y avoir une bonne raison de sortir1
dans ce cas? Qu'est-ce que tu penses? J'ai été tenté de redéfinir laYf
fonction pour générer un tableau vide1
, mais je n'étais pas sûrPython, 59 octets
Une fonction récursive. Sur les grandes entrées, la profondeur de pile sur les systèmes classiques est insuffisante, à moins que vous ne l' utilisiez avec quelque chose comme Pile sans pile .
La définition récursive est implémentée directement, en comptant jusqu'à la recherche de facteurs premiers candidats. Depuis
f(prime)=1
, sin
ap
un facteur premier, nous avonsf(n) == p*f(n/p)+n/p
.la source
Gelée,
87 octets-1 octet par @Dennis
Utilise la même formule que tout le monde. Cependant, il y a un petit truc à gérer
0
.Essayez ici .
la source
Python 2,
87787674 octetsAméliorations grâce à @Maltysen:
Amélioration ultérieure de deux octets:
Amélioration supplémentaire grâce à @xnor:
Explication
La dérivée arithmétique de
a
est égale àa
fois la somme des inverses des facteurs premiers dea
. Aucune exception pour 1 n'est nécessaire puisque la somme des inverses des facteurs premiers de 1 est égale à zéro.la source
abs(a)>1
peut êtrea*a>1
.d,s = 2,0
Haskell,
20390 octetsMerci @nimi!
Je ne sais toujours pas quand les indentations causent quelle interprétation, c’est le plus court j’ai réussi jusqu’à présent, et comme toujours, je suis sûr que cela peut être joué beaucoup plus. Je vais essayer à nouveau dans la soirée.
la source
J,
302719 caractèresMerci à @Dennis d' avoir coupé 3 personnages.
Merci à @Zgarb d' avoir coupé 8 caractères.
Essayez-le en ligne!
Exemple de saisie:
Comment ça marche:
la source
Pyth -
108 octetsLovin 'l'entrée implicite! Devrait le mettre sur un pied d'égalité avec Jelly pour la plupart des choses (sauf les compétences de golf de Dennis).
Suite de test .
la source
Haskell, 59 octets
Implémente directement la définition récursive, avec une variable auxiliaire
p
qui compte jusqu'à la recherche de facteurs premiers potentiels, à partir de2
. La dernière ligne est la fonction principale, qui se connectep=2
à la fonction binaire définie dans la première ligne.La fonction vérifie chaque cas successivement:
n*n<2
, alorsn
est l'un des-1,0,1
, et le résultat est0
.n
n'est pas un multiple dep
, puis incrémentezp
et continuez.n=p*r
, et par la propriété "dérivé", le résultat estr*a(p)+p*a(r)
, ce qui simplifier+p*a(r)
parce quep
est premier.Le dernier cas économise des octets en se liant
r
à un garde , ce qui évite également le1>0
pour le passe-partoutotherwise
. Sir
pouvait être lié plus tôt, la deuxième conditionmod n p>0
pourrait être vérifiéer*p==n
, c'est-à-dire 3 octets de moins, mais je ne vois pas comment faire.la source
Sérieusement ,
17141112 octetsMa première réponse sérieusement. Cette réponse est basée sur la réponse MATL de Luis Mendo et sur l'idée que la dérivée arithmétique d'un nombre
m
est égale à où est chaque facteur premier de multiplicité. Mon ajout est à noter que, si , alors . Merci à Mego pour son aide au golf et à la correction des bugs. Essayez-le en ligne!m·(1/p1 + 1/p2 + ... + 1/pn)
p1...pn
n
m = p1e1·p2e2·...·pnen
a(m) = m·(e1/p1 + e2/p2 + ... + en/pn)
Ungolfing:
la source
Japt -x ,
161310 octets- 6 octets grâce à @Shaggy
Essayez-le en ligne!
la source
N.k()
cela ne fonctionne pas.-x
drapeau.APL (Dyalog Extended) ,
139 octetsUne solution simple La version Dyalog Unicode était simplement une version plus longue de celle-ci, elle a donc été omise.
Edit: Sauvegardé 4 octets en adoptant la méthode dans la solution Jelly de lirtosiast .
Essayez-le en ligne!
Ungolfing
la source
Ruby,
876680757068 octetsCette réponse est basée sur la réponse de MATL de Luis Mendo , la réponse Python wythagoras , et l'idée que la dérivée arithmétique d'un nombre
m
est égal à où est chaque facteur premier de la multiplicité.m·(1/p1 + 1/p2 + ... + 1/pn)
p1...pn
n
Cette fonction est appelée de la manière suivante:
Ungolfing:
la source
Julia,
7243 octetsC'est une fonction anonyme qui accepte un entier et renvoie un float. Pour l'appeler, assignez-le à une variable.
Pour un entier en entrée n , si n 2 ≤ 1, renvoyer 0. Sinon, obtenir la factorisation première de n 2 sous la forme a
Dict
, puis pour chaque paire nombre premier / exposant, divisez le nombre premier par son exposant, puis divisez n par le résultat. Il ne s’agit que de calculer n x / p , où p est le facteur premier et x son exposant, ce qui revient à sommer n / p , x fois. Nous additionnons le tableau résultant et le divisons par 2, car nous avons additionné deux fois plus que nécessaire. C'est dû au fait que nous factorisons n 2plutôt que |.)n n. (Faire cela est un octet plus court que l'affacturage |Sauvegardé 29 octets grâce à Dennis!
la source
Jolf, 13 octets
Félicitations à la réponse MATL pour l'algorithme! Essayez ici , ou de les tester à la fois . (Les sorties [key, out] dans un tableau.)
Explication
la source
Mathematica 10.0, 39 octets
la source
FactorInteger@1
obtenu{1,1}
, de sorte que laIf
fonction n'est plus nécessaire, en économisant 10 octets.{{1,1}}
renvoyée par ma version ({}
c'est le résultat attendu pour moi).APL (NARS), 35 caractères, 70 octets
test et comment utiliser:
Je pensais que ça ne serait pas correct parce que je ne sais pas si c variable est composée (et non un nombre premier) ... Mais semble bien pour le test ...
la source
05AB1E ,
74 octetsRéponse du port de @lirtosiast 's Jelly .
Essayez-le en ligne ou vérifiez tous les cas de test .
Explication:
la source
Perl 5, 62 octets
Utilise la formule (d'OEIS):
If n = Product p_i^e_i, a(n) = n * Sum (e_i/p_i).
la source
Perl 6, 90
Cela pourrait être un peu lent pour les grands nombres. Remplacez
2..^n
par2..n.sqrt
pour un code plus long mais un calcul plus rapide.la source
Encre , 183 octets
Essayez-le en ligne!
Je refuse de croire que c'est une bonne solution, mais je ne vois pas non plus de moyen de l'améliorer.
la source
Paris / GP , 45 octets
Essayez-le en ligne!
la source