La convolution de Dirichlet est un type spécial de convolution qui apparaît comme un outil très utile dans la théorie des nombres. Il opère sur l'ensemble des fonctions arithmétiques .
Défi
Étant donné deux fonctions arithmétiques (c'est-à-dire les fonctions ), calculer la convolution de Dirichlet comme défini ci-dessous. ( f ∗ g ) : N → R
Détails
- On utilise la convention .
- La convolution de Dirichlet de deux fonctions arithmétiques est à nouveau une fonction arithmétique, et elle est définie comme (Les deux sommes sont équivalentes. L'expressionsignifie quedivise, donc la somme est sur lesdiviseursnaturelsde . De même, nous pouvons substitueret nous obtenons la deuxième formulation équivalente. Si vous n'êtes pas habitué à cette notation, il y a un exemple étape par étape ci-dessous.) Juste pour élaborer (ce n'est pas directement pertinent pour ce défi): La définition vient du calcul du produit de lasérie Dirichlet:
- L'entrée est donnée sous forme de deux fonctions de boîte noire . Alternativement, vous pouvez également utiliser une liste infinie, un générateur, un flux ou quelque chose de similaire qui pourrait produire un nombre illimité de valeurs.
- Il existe deux méthodes de sortie: Soit une fonction est retournée, soit vous pouvez prendre une entrée supplémentaire et renvoyer directement.
- Pour simplifier, vous pouvez supposer que chaque élément de peut être représenté avec, par exemple, un entier 32 bits positif.
- Pour simplifier, vous pouvez également supposer que chaque entrée peut être représentée par exemple par un seul nombre réel à virgule flottante.
Exemples
Définissons d'abord quelques fonctions. Notez que la liste des nombres sous chaque définition représente les premières valeurs de cette fonction.
- l'identité multiplicative ( A000007 )
1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, ...
- la fonction d'unité constante ( A000012 )
1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, ...
- la fonction d'identité ( A000027 )
1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, ...
- la fonction de Möbius ( A008683 )
1, -1, -1, 0, -1, 1, -1, 0, 0, 1, -1, 0, -1, 1, 1, 0, -1, 0, -1, ...
- la fonction de totient d'Euler ( A000010 )
1, 1, 2, 2, 4, 2, 6, 4, 6, 4, 10, 4, 12, 6, 8, 8, 16, 6, 18, 8, ...
- la fonction de Liouville ( A008836 )
où est le nombre de facteurs premiers de comptés avec multiplicité
1, -1, -1, 1, -1, 1, -1, -1, 1, 1, -1, -1, -1, 1, 1, 1, -1, -1, -1, ...
- la fonction de somme des diviseurs ( A000203 )
1, 3, 4, 7, 6, 12, 8, 15, 13, 18, 12, 28, 14, 24, 24, 31, 18, 39, 20, ...
- la fonction de comptage des diviseurs ( A000005 )
1, 2, 2, 3, 2, 4, 2, 4, 3, 4, 2, 6, 2, 4, 4, 5, 2, 6, 2, 6, 4, 4, 2, 8, ...
- la fonction caractéristique des nombres carrés ( A010052 )
1, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, ...
Ensuite, nous avons les exemples suivants:
- et
- et
- et
- et
Les derniers pour sont une conséquence de l' inversion de Möbius : pour tout l'équation est équivalente à .
Exemple étape par étape
Il s'agit d'un exemple calculé étape par étape pour ceux qui ne connaissent pas la notation utilisée dans la définition. Considérons les fonctions et . Nous allons maintenant évaluer leur convolution à . Leurs premiers termes sont répertoriés dans le tableau ci-dessous.
La somme itère sur tous les nombres naturels qui divisent , donc suppose tous les diviseurs naturels de . Ce sont . Dans chaque somme, nous évaluons en et le multiplions par évalué en . Nous pouvons maintenant conclure
fun
?cond
pour économiser 5 octetsHaskell , 46 octets
Essayez-le en ligne!
Merci à flawr pour -6 octets et un grand défi! Et merci à H.PWiz pour un autre -6!
la source
Python 3 , 59 octets
Essayez-le en ligne!
la source
//
vraiment nécessaire au lieu de/
?/
produirait des flotteurs à droite?d
c'est un diviseur den
par définition, la partie fractionnaire den/d
est zéro, donc il ne devrait pas y avoir de problème avec l'arithmétique à virgule flottante. Les flottants avec une partie fractionnaire nulle sont assez proches des ints à des fins Pythoniques, et la sortie de la fonction est un nombre réel, donc fairen/d
au lieu den//d
devrait être bien.Wolfram Language (Mathematica) , 17 octets
Bien sûr, Mathematica a une fonction intégrée. Il arrive également de connaître de nombreuses fonctions d'exemple. J'ai inclus quelques exemples de travail.
Essayez-le en ligne!
la source
Ajouter ++ , 51 octets
Essayez-le en ligne!
Prend deux fonctions prédéfinies comme arguments, plusn et sorties ( f∗ g) ( n )
Comment ça fonctionne
la source
R , 58 octets
Essayez-le en ligne!
Prend
n
,f
etg
. Heureusement, lenumbers
paquet a déjà un certain nombre de fonctions implémentées.Si des versions vectorisées étaient disponibles, ce qui est possible en enveloppant chacune
Vectorize
, la version suivante de 45 octets est possible:R , 45 octets
Essayez-le en ligne!
la source
APL (Dyalog Classic) , 20 octets
avec
⎕IO←1
Essayez-le en ligne!
Facile à résoudre, difficile à tester - généralement pas mon type de défi. Pourtant, j'ai beaucoup apprécié celui-ci!
{
}
définit un opérateur dyadique dont les opérandes⍺⍺
et⍵⍵
les deux fonctions sont convolués;⍵
est l'argument numérique∪⍵∨⍳⍵
sont les diviseurs de⍵
dans l'ordre croissant, c'est-à-dire unique (∪
) des LCM (∨
) de⍵
avec tous les nombres naturels jusqu'à (⍳
)⍵⍵¨
appliquer l'opérande droit à chaque⍺⍺¨∘⌽
appliquer l'opérande gauche à chacun en sens inverse+.×
produit intérieur - multiplier les éléments correspondants et additionnerLa même chose dans ngn / apl semble meilleure en raison des identificateurs Unicode, mais prend 2 octets supplémentaires en raison de l'indexation 1.
la source
Gelée , 9 octets
Essayez-le en ligne!
La ligne en haut est la ligne principale deF , la ligne en bas est la ligne principale de g . n est passé en argument à cette fonction.
la source
Swift 4 ,
74 7054 octetsEssayez-le en ligne!
la source
JavaScript (ES6), 47 octets
Prend l'entrée comme
(f)(g)(n)
.Essayez-le en ligne!
Exemples
la source
C (gcc) , 108 octets
Implémentation simple, volée sans vergogne à la réponse Python de Leaky Nun .
Non golfé:
Essayez-le en ligne!
la source
F #, 72 octets
Prend les deux fonctions
f
etg
et un nombre natureln
. Filtre les valeursd
qui ne se divisent pas naturellementn
. Ensuite, les évaluef(n/d)
et lesg(d)
multiplie et résume les résultats.la source
Pari / GP , 32 octets
Essayez-le en ligne!
Il y a une
dirmul
fonction intégrée, mais elle ne prend en charge que des séquences finies .la source
APL (NARS), 47 caractères, 94 octets
où m et n sont la fonction que l'on doit utiliser (ceci parce que je ne sais pas comment appeler un tableau de fonction dans une fonction dans APL). En utilisant l'exemple ci-dessus, la multiplication de la fonction Mobius (ici, c'est 12π) et la fonction somme des diviseurs (ici, c'est 11π) pour la valeur 12, cette multiplication serait:
si l'on doit calculer une autre valeur:
On peut voir si par exemple le premier nombre 2000 le résultat de la fonction est l'identité
la source