The Dirichlet konvolusi adalah jenis khusus dari konvolusi yang muncul sebagai alat yang sangat berguna di nomor teori. Ini beroperasi pada set fungsi aritmatika .
Tantangan
Diberikan dua fungsi aritmatika (yaitu fungsi ) menghitung konvolusi Dirichlet sebagaimana didefinisikan di bawah ini.
Detail
- Kami menggunakan konvensi .
- The Dirichlet konvolusi dari dua fungsi aritmatika lagi fungsi aritmatika, dan itu didefinisikan sebagai (Kedua jumlah yang setara Ekspresi.saranamembagi, karena penjumlahan adalah atas alampembagidari nDemikian pula kita dapat subsitute.I=ndan kami mendapatkan formulasi setara kedua. Jika Anda tidak terbiasa dengan notasi ini ada langkah demi langkah contoh di bawah ini) Hanya untuk menguraikan (ini tidak secara langsung relevan untuk tantangan ini):. Definisi tersebut berasal dari komputasi produk dariseri Dirichlet:
- Input diberikan sebagai dua fungsi kotak hitam . Atau, Anda juga bisa menggunakan daftar tanpa batas, generator, aliran, atau sesuatu yang serupa yang dapat menghasilkan jumlah nilai yang tidak terbatas.
- Ada dua metode keluaran: Salah satu fungsi dikembalikan, atau Anda dapat mengambil input tambahan dan mengembalikan secara langsung.
- Untuk kesederhanaan Anda dapat mengasumsikan bahwa setiap elemen dapat diwakili dengan misalnya int 32-bit positif.
- Untuk kesederhanaan Anda juga dapat mengasumsikan bahwa setiap entri dapat diwakili oleh misalnya satu angka floating point nyata.
Contohnya
Mari kita tentukan beberapa fungsi. Perhatikan bahwa daftar angka di bawah setiap definisi mewakili beberapa nilai pertama dari fungsi itu.
- identitas multiplikatif ( A000007 )
1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, ...
- fungsi unit konstan ( A000012 )
1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, ...
- fungsi identitas ( A000027 )
1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, ...
- fungsi Möbius ( A008683 )
1, -1, -1, 0, -1, 1, -1, 0, 0, 1, -1, 0, -1, 1, 1, 0, -1, 0, -1, ...
- fungsi totient Euler ( A000010 )
1, 1, 2, 2, 4, 2, 6, 4, 6, 4, 10, 4, 12, 6, 8, 8, 16, 6, 18, 8, ...
- fungsi Liouville ( A008836 )
mana adalah jumlah faktor prima dari dihitung dengan multiplisitas
1, -1, -1, 1, -1, 1, -1, -1, 1, 1, -1, -1, -1, 1, 1, 1, -1, -1, -1, ...
- fungsi jumlah pembagi ( A000203 )
1, 3, 4, 7, 6, 12, 8, 15, 13, 18, 12, 28, 14, 24, 24, 31, 18, 39, 20, ...
- fungsi penghitung pembagi ( 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, ...
- fungsi karakteristik bilangan kuadrat ( 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, ...
Kemudian kita memiliki contoh berikut:
- dan
- dan
- dan
- dan
Yang terakhir adalah konsekuensi dari inversi Mbius : Untuk setiap persamaan setara dengan .
Langkah demi Langkah Contoh
Ini adalah contoh yang dihitung langkah demi langkah untuk mereka yang tidak terbiasa dengan notasi yang digunakan dalam definisi. Pertimbangkan fungsinya dan . Kami sekarang akan mengevaluasi konvolusi mereka pada . Beberapa istilah pertama mereka tercantum dalam tabel di bawah ini.
Jumlahnya berulang atas semua bilangan asli yang membagi , dengan demikian mengasumsikan semua pembagi alami . Ini adalah . Dalam setiap ringkasan, kami mengevaluasi pada dan mengalikannya dengan dievaluasi pada . Sekarang kita bisa menyimpulkan
fun
?cond
menyimpan 5 byteHaskell , 46 byte
Cobalah online!
Terima kasih kepada flawr untuk -6 byte dan tantangan besar! Dan terima kasih kepada H.PWiz untuk -6 lainnya!
sumber
Python 3 , 59 byte
Cobalah online!
sumber
//
benar-benar dibutuhkan, bukan/
?/
akan menghasilkan mengapung kan?d
merupakan pembagin
dengan definisi, bagian fraksionaln/d
adalah nol, jadi seharusnya tidak ada masalah dengan aritmatika floating point. Mengapung dengan pecahan bagian nol cukup dekat dengan int untuk keperluan Pythonic, dan output dari fungsi adalah bilangan real, sehingga melakukann/d
alih - alihn//d
harus baik-baik saja.Bahasa Wolfram (Mathematica) , 17 byte
Tentu saja Mathematica memiliki built-in. Itu juga terjadi untuk mengetahui banyak fungsi contoh. Saya telah memasukkan beberapa contoh kerja.
Cobalah online!
sumber
Tambahkan ++ , 51 byte
Cobalah online!
Mengambil dua fungsi yang telah didefinisikan sebelumnya sebagai argumen, plusn , dan output ( f∗ g) ( n )
Bagaimana itu bekerja
sumber
R , 58 byte
Cobalah online!
Membawa
n
,f
, dang
. Untungnyanumbers
paket tersebut memiliki beberapa fungsi yang sudah diimplementasikan.Jika versi vektor tersedia, yang dimungkinkan dengan membungkus masing-masing dengan
Vectorize
, maka versi 45 byte berikut ini mungkin:R , 45 byte
Cobalah online!
sumber
Jelly , 9 byte
Cobalah online!
Baris di atas adalah jalur utamaf , garis di bagian bawah adalah jalur utama g . n dilewatkan sebagai argumen untuk fungsi ini.
sumber
Swift 4 ,
74 7054 byteCobalah online!
sumber
JavaScript (ES6), 47 byte
Mengambil input sebagai
(f)(g)(n)
.Cobalah online!
Contohnya
sumber
APL (Dyalog Classic) , 20 byte
dengan
⎕IO←1
Cobalah online!
Mudah dipecahkan, sulit diuji - umumnya bukan tipe tantangan saya. Namun, saya sangat menikmati yang satu ini!
{
}
mendefinisikan operator diad yang operandnya⍺⍺
dan⍵⍵
dua fungsinya dililit;⍵
adalah argumen numerik∪⍵∨⍳⍵
adalah pembagi⍵
dalam urutan menaik, yaitu unik (∪
) dari LCMs (∨
)⍵
dengan semua bilangan alami sampai ke sana (⍳
)⍵⍵¨
terapkan operan yang tepat untuk masing-masing⍺⍺¨∘⌽
terapkan operan kiri ke masing-masing secara terbalik+.×
produk dalam - gandakan elemen yang sesuai dan jumlahHal yang sama dalam ngn / apl terlihat lebih baik karena pengidentifikasi Unicode, tetapi membutuhkan 2 byte tambahan karena pengindeksan 1.
sumber
C (gcc) , 108 byte
Implementasi langsung, tanpa malu-malu dicuri dari jawaban Python Leaky Nun .
Tidak Disatukan:
Cobalah online!
sumber
F #, 72 byte
Mengambil dua fungsi
f
dang
dan bilangan alamin
. Menyaring nilai-nilaid
yang tidak terbagi secara alamin
. Kemudian mengevaluasif(n/d)
dang(d)
, melipatgandakannya, dan menjumlahkan hasilnya.sumber
Pari / GP , 32 byte
Cobalah online!
Ada
dirmul
fungsi bawaan, tetapi hanya mendukung urutan terbatas .sumber