Die Dirichlet-Faltung ist eine spezielle Art der Faltung , die in der Zahlentheorie als sehr nützliches Werkzeug erscheint. Es arbeitet mit dem Satz von arithmetischen Funktionen .
Herausforderung
Wenn zwei arithmetische Funktionen (dh Funktionen ) gegeben sind, berechnen Sie die Dirichlet-Faltung wie unten definiert.
Einzelheiten
- Wir verwenden die Konvention .
- Die Dirichlet-Faltung zweier arithmetischer Funktionen ist wiederum eine arithmetische Funktion und definiert als (Beide Summen sind äquivalent. Der Ausdruckbedeutetdividiert, daher ist die Summation über den natürlichenTeilernvon . Ebenso können wirund wir erhalten die zweite äquivalente Formulierung. Wenn Sie nicht an diese Notation gewöhnt sind, finden Sie im Folgenden ein schrittweises Beispiel.) Nur zur Erläuterung (dies ist für diese Herausforderung nicht direkt relevant): Die Definition stammt aus der Berechnung des Produkts derDirichlet-Reihe:
- Die Eingabe erfolgt als zwei Blackbox-Funktionen . Alternativ können Sie auch eine unendliche Liste, einen Generator, einen Stream oder ähnliches verwenden, um eine unbegrenzte Anzahl von Werten zu erzeugen.
- Es gibt zwei Ausgabemethoden: Entweder wird eine Funktion zurückgegeben, oder Sie können eine zusätzliche Eingabe und direkt zurückgeben.
- Der Einfachheit halber können Sie davon ausgehen, dass jedes Element von zB mit einem positiven 32-Bit-Int dargestellt werden kann.
- Der Einfachheit halber kann man auch davon ausgehen, dass jeder Eintrag zB durch eine einzige reelle Gleitkommazahl dargestellt werden kann.
Beispiele
Definieren wir zunächst einige Funktionen. Beachten Sie, dass die Liste der Zahlen unter jeder Definition die ersten Werte dieser Funktion darstellt.
- die multiplikative Identität ( A000007 )
1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, ...
- die konstante Einheitsfunktion ( A000012 )
1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, ...
- die Identitätsfunktion ( A000027 )
1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, ...
- die Möbius-Funktion ( A008683 )
1, -1, -1, 0, -1, 1, -1, 0, 0, 1, -1, 0, -1, 1, 1, 0, -1, 0, -1, ...
- die Euler-Totientenfunktion ( A000010 )
1, 1, 2, 2, 4, 2, 6, 4, 6, 4, 10, 4, 12, 6, 8, 8, 16, 6, 18, 8, ...
- die Liouville-Funktion ( A008836 )
wobei die Anzahl der Primfaktoren von die mit der Multiplizität gezählt werden
1, -1, -1, 1, -1, 1, -1, -1, 1, 1, -1, -1, -1, 1, 1, 1, -1, -1, -1, ...
- die Divisorsummenfunktion ( A000203 )
1, 3, 4, 7, 6, 12, 8, 15, 13, 18, 12, 28, 14, 24, 24, 31, 18, 39, 20, ...
- die Divisor-Zählfunktion ( 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, ...
- die charakteristische Funktion von Quadratzahlen ( 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, ...
Dann haben wir folgende Beispiele:
- und
- and
- and
- and
The last for are a consequence of the Möbius inversion: For any the equation is equivalent to .
Step by Step Example
This is an example that is computed step by step for those not familiar with the notation used in the definition. Consider the functions and . We will now evaluate their convolution at . Their first few terms are listed in the table below.
The sum iterates over all natural numbers that divide , thus assumes all the natural divisors of . These are . In each summand, we evaluate at and multiply it with evaluated at . Now we can conclude
fun
?cond
to save 5 bytesHaskell, 46 bytes
Try it online!
Thanks to flawr for -6 bytes and a great challenge! And thanks to H.PWiz for another -6!
quelle
Python 3, 59 bytes
Try it online!
quelle
//
really needed instead of/
?/
would produce floats right?d
is a divisor ofn
by definition, the fractional part ofn/d
is zero, so there shouldn't be any issues with floating point arithmetic. Floats with fractional part zero are close enough to ints for Pythonic purposes, and the output of the function is a real number, so doingn/d
instead ofn//d
should be fine.Wolfram Language (Mathematica), 17 bytes
Of course Mathematica has a built-in. It also happens to know many of the example functions. I've included some working examples.
Try it online!
quelle
Add++, 51 bytes
Try it online!
Takes two pre-defined functions as arguments, plusn , and outputs (f∗g)(n)
How it works
quelle
R, 58 bytes
Try it online!
Takes
n
,f
, andg
. Luckily thenumbers
package has quite a few of the functions implemented already.If vectorized versions were available, which is possible by wrapping each with
Vectorize
, then the following 45 byte version is possible:R, 45 bytes
Try it online!
quelle
Jelly, 9 bytes
Try it online!
Line at the top is the main line off , line at the bottom is the main line of g . n is passed as an argument to this function.
quelle
Swift 4,
74 7054 bytesTry it online!
quelle
JavaScript (ES6), 47 bytes
Takes input as
(f)(g)(n)
.Try it online!
Examples
quelle
APL (Dyalog Classic), 20 bytes
with
⎕IO←1
Try it online!
Easy to solve, hard to test - generally not my type of challenge. Yet, I enjoyed this one very much!
{
}
defines a dyadic operator whose operands⍺⍺
and⍵⍵
are the two functions being convolved;⍵
is the numeric argument∪⍵∨⍳⍵
are the divisors of⍵
in ascending order, i.e. unique (∪
) of the LCMs (∨
) of⍵
with all natural numbers up to it (⍳
)⍵⍵¨
apply the right operand to each⍺⍺¨∘⌽
apply the left operand to each in reverse+.×
inner product - multiply corresponding elements and sumThe same in ngn/apl looks better because of Unicode identifiers, but takes 2 additional bytes because of 1-indexing.
quelle
C (gcc), 108 bytes
Straightforward implementation, shamelessly stolen from Leaky Nun's Python answer.
Ungolfed:
Try it online!
quelle
F#, 72 bytes
Takes the two functions
f
andg
and a natural numbern
. Filters out the values ofd
that do not naturally divide inton
. Then evaluatesf(n/d)
andg(d)
, multiples them together, and sums the results.quelle
Pari/GP, 32 bytes
Try it online!
There is a built-in
dirmul
function, but it only supports finite sequences.quelle