Splot dirichleta to specjalny rodzaj splotu , który pojawia się jako bardzo użyteczne narzędzie w teorii liczb. Działa na zbiorze funkcji arytmetycznych .
Wyzwanie
Biorąc pod uwagę dwie funkcje arytmetyczne (tj. Funkcje ), oblicz splot Dirichleta jak zdefiniowano poniżej.
Detale
- Używamy konwencji .
- Splot Dirichleta dwóch funkcji arytmetycznych jest ponownie funkcją arytmetyczną i jest zdefiniowany jako (Obie sumy są równoważne. Wyrażenieoznaczadzieli zatem sumowanie na naturalnychdzielnikówz Podobnie można subsitute.i otrzymujemy drugi równoważny preparat. Jeśli nie jesteś przyzwyczajony do tej notacji, poniżej znajdziesz krok po kroku.) Tylko w celu rozwinięcia (nie ma to bezpośredniego związku z tym wyzwaniem): Definicja pochodzi z obliczenia iloczynuserii Dirichleta:
- Dane wejściowe podano jako dwie funkcje czarnej skrzynki . Alternatywnie możesz również użyć nieskończonej listy, generatora, strumienia lub czegoś podobnego, co może wygenerować nieograniczoną liczbę wartości.
- Istnieją dwie metody wyjściowe: albo funkcja jest zwracana, albo alternatywnie możesz wziąć dodatkowe wejście i zwrócić bezpośrednio bezpośrednio.
- Dla uproszczenia można założyć, że każdy element może być reprezentowany np. Dodatnim 32-bitowym int.
- Dla uproszczenia można również założyć, że każdy wpis może być reprezentowany np. Przez jedną rzeczywistą liczbę zmiennoprzecinkową.
Przykłady
Najpierw zdefiniujmy kilka funkcji. Zauważ, że lista liczb pod każdą definicją reprezentuje kilka pierwszych wartości tej funkcji.
- tożsamość multiplikatywna ( A000007 )
1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, ...
- funkcja stałej jednostki ( A000012 )
1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, ...
- funkcja tożsamości ( A000027 )
1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, ...
- funkcja Möbiusa ( A008683 )
1, -1, -1, 0, -1, 1, -1, 0, 0, 1, -1, 0, -1, 1, 1, 0, -1, 0, -1, ...
- funkcja sumy Eulera ( A000010 )
1, 1, 2, 2, 4, 2, 6, 4, 6, 4, 10, 4, 12, 6, 8, 8, 16, 6, 18, 8, ...
- funkcja Liouville'a ( A008836 )
gdzie jest liczbą czynników pierwszych zliczonych
1, -1, -1, 1, -1, 1, -1, -1, 1, 1, -1, -1, -1, 1, 1, 1, -1, -1, -1, ...
- funkcja sumy dzielników ( A000203 )
1, 3, 4, 7, 6, 12, 8, 15, 13, 18, 12, 28, 14, 24, 24, 31, 18, 39, 20, ...
- funkcja zliczania dzielników ( 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, ...
- funkcja charakterystyczna liczb kwadratowych ( 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, ...
Następnie mamy następujące przykłady:
- i
- i
- i
- i
Ostatnie są konsekwencją inwersji Möbiusa : dla każdego równanie jest równoważne .
Przykład krok po kroku
Jest to przykład obliczany krok po kroku dla tych, którzy nie znają notacji stosowanej w definicji. Rozważ funkcje i . Ocenimy teraz ich splot przy . Ich kilka pierwszych terminów wymieniono w poniższej tabeli.
Suma iteruje się po wszystkich liczbach naturalnych które dzielą , a zatem przyjmuje wszystkie naturalne dzielniki . Są to . W każdym podsumowaniu oceniamy punkcie i mnożymy przez obliczone w punkcie . Teraz możemy podsumować
fun
?cond
5 bajtówHaskell , 46 bajtów
Wypróbuj online!
Dzięki flawr dla -6 bajtów i wielkim wyzwaniem! I dzięki H.PWiz za kolejne -6!
źródło
Python 3 , 59 bajtów
Wypróbuj online!
źródło
//
naprawdę jest potrzebny zamiast/
?/
czy produkuje pływaki, prawda?d
zn
definicji jest dzielnikiem , część ułamkowan/d
wynosi zero, więc nie powinno być żadnych problemów z arytmetyką zmiennoprzecinkową. Liczba zmiennoprzecinkowa z ułamkową częścią zerową jest wystarczająco zbliżona do liczb całkowitych dla celów Pythona, a wynikiem działania funkcji jest liczba rzeczywista, więc działanien/d
zamiastn//d
powinno być w porządku.Wolfram Language (Mathematica), 17 bytes
Oczywiście Mathematica ma wbudowane. Zdarza się również, że zna wiele przykładowych funkcji. Podałem kilka przykładów roboczych.
Wypróbuj online!
źródło
Dodaj ++ , 51 bajtów
Wypróbuj online!
Bierze dwie predefiniowane funkcje jako argumenty plusn i wyniki ( f∗ g) ( n )
Jak to działa
źródło
R , 58 bajtów
Wypróbuj online!
Trwa
n
,f
ig
. Na szczęścienumbers
pakiet ma już zaimplementowanych kilka funkcji.Jeśli dostępne były wersje wektoryzowane, co jest możliwe poprzez zawinięcie każdej z nich
Vectorize
, możliwa jest następująca 45-bajtowa wersja:R , 45 bajtów
Wypróbuj online!
źródło
APL (Dyalog Classic) , 20 bajtów
z
⎕IO←1
Wypróbuj online!
Łatwy do rozwiązania, trudny do przetestowania - generalnie nie jest to mój typ wyzwania. Jednak bardzo mi się podobało!
{
}
definiuje dynamiczny operator, którego argumenty⍺⍺
i⍵⍵
dwie funkcje są ze sobą powiązane;⍵
jest argumentem liczbowym∪⍵∨⍳⍵
są dzielnikami⍵
w porządku rosnącym, tj. niepowtarzalnym (∪
) LCM (∨
) dla⍵
wszystkich liczb naturalnych do niego (⍳
)⍵⍵¨
zastosować odpowiedni operand do każdego⍺⍺¨∘⌽
zastosuj lewy operand do każdego w odwrotnej kolejności+.×
produkt wewnętrzny - pomnóż odpowiednie elementy i sumęTo samo w ngn / apl wygląda lepiej dzięki identyfikatorom Unicode, ale zajmuje 2 dodatkowe bajty z powodu 1-indeksowania.
źródło
Galaretka , 9 bajtów
Wypróbuj online!
Linia u góry jest główną liniąfa , linia u dołu jest główną linią sol . n jest przekazywany jako argument do tej funkcji.
źródło
Swift 4 ,
74 7054 bajtówWypróbuj online!
źródło
JavaScript (ES6), 47 bajtów
Pobiera dane wejściowe jako
(f)(g)(n)
.Wypróbuj online!
Przykłady
źródło
C (gcc) , 108 bajtów
Prosta implementacja, bezwstydnie skradziona z odpowiedzi Pythona Leaky Nun .
Nie golfowany:
Wypróbuj online!
źródło
F #, 72 bajty
Pobiera dwie funkcje
f
ig
liczbę naturalnąn
. Odfiltrowuje wartościd
, które nie dzielą się w naturalny sposóbn
. Następnie oceniaf(n/d)
ig(d)
mnoży je razem i sumuje wyniki.źródło
Pari / GP , 32 bajty
Wypróbuj online!
Jest wbudowana
dirmul
funkcja, ale obsługuje tylko sekwencje skończone .źródło
APL (NARS), 47 znaków, 94 bajty
gdzie m i n to funkcja, której należy użyć (ponieważ nie wiem, jak wywołać jedną tablicę funkcji w jednej funkcji w APL). Korzystając z powyższego przykładu, mnożenie funkcji Mobiusa (tutaj jest to 12π) i suma funkcji dzielników (tutaj jest 11π) dla wartości 12, to mnożenie byłoby:
jeśli trzeba obliczyć inną wartość:
Można zobaczyć, czy na przykład pierwszym numerem 2000 wynikiem funkcji jest tożsamość
źródło