ディリクレ畳み込み


19

ディリクレ畳み込みは、特別な種類のあるコンボリューション数論において非常に有用なツールとして表示されます。算術関数のセットで動作します

チャレンジ

2つの算術関数f,g(関数f,g:NR)が与えられた場合、ディリクレ畳み込み f g )を計算します:NR(fg):NR以下に定義します。

詳細

  • 我々は、規則を使用0N={1,2,3,}
  • ディリクレ畳み込みfg 2つの算術関数のf,g再び演算機能であり、それは以下のように定義される
    (fg)(n)=d|nf(nd)g(d)=ij=nf(i)g(j).
    (両方和は表現と等価であるd|n手段は、dN分割n従って総和は自然の上にある、除数n同様に、我々はsubsituteすることができる。i=ndN,j=dNと、私たちは、第二の同等の製剤を得ます。あなたはこの表記に慣れていない場合は、以下のステップの例により、ステップがあります)ただ、これは)この挑戦のために直接関係ありません(詳しく説明する:定義は、の積の計算から来ディリクレシリーズ
    (nNf(n)ns)(nNg(n)ns)=nN(fg)(n)ns
  • 入力は2つのブラックボックス関数として与えられます。または、無限リスト、ジェネレータ、ストリーム、または無数の値を生成できる類似のものを使用することもできます。
  • 機能次のいずれかが二つの出力方法は、fg返され、あるいは追加の入力を取る取ることができnNとリターン(fg)(n)に直接。
  • 簡単にするために、Nのすべての要素をN、たとえば正の32ビット整数で表現できます。
  • 簡単にするために、すべてのエントリRを単一の実浮動小数点数などで表すこともできます。

最初にいくつかの関数を定義しましょう。各定義の下の数字のリストは、その関数の最初のいくつかの値を表していることに注意してください。

  • 乗法的アイデンティティ(A000007
    ϵ(n)={1n=10n>1
    1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, ...
  • 定数単位関数(A000012
    1(n)=1n
    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, ...
  • 恒等関数(A000027
    id(n)=nn
    1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, ...
  • メビウス関数(A008683
    μ(n)={(1)k if n is squarefree and k is the number of Primefactors of n0 otherwise 
    1, -1, -1, 0, -1, 1, -1, 0, 0, 1, -1, 0, -1, 1, 1, 0, -1, 0, -1, ...
  • オイラートーティエント関数(A000010
    φ(n)=np|n(11p)
    1, 1, 2, 2, 4, 2, 6, 4, 6, 4, 10, 4, 12, 6, 8, 8, 16, 6, 18, 8, ...
  • Liouville関数(A008836
    λ(n)=(1)k
    ここで、kは多重度でカウントされた nの素因数1, -1, -1, 1, -1, 1, -1, -1, 1, 1, -1, -1, -1, 1, 1, 1, -1, -1, -1, ...
  • 除数和関数(A000203
    σ(n)=d|nd
    1, 3, 4, 7, 6, 12, 8, 15, 13, 18, 12, 28, 14, 24, 24, 31, 18, 39, 20, ...
  • 除数カウント関数(A000005
    τ(n)=d|n1
    1, 2, 2, 3, 2, 4, 2, 4, 3, 4, 2, 6, 2, 4, 4, 5, 2, 6, 2, 6, 4, 4, 2, 8, ...
  • 平方数の特性関数(A010052
    sq(n)={1 if n is a square number0otherwise
    1, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, ...

次に、次の例を示します。

  • ϵ=1μ
  • f=ϵff
  • ϵ=λ|μ|
  • σ=φτ
  • id=σμおよびσ=id1
  • sq=λ1およびλ=μsq
  • τ=11および1=τμ
  • id=φ1およびφ=idμ

最後のメビウス反転の結果は次のとおりです。任意のf,gについて、方程式g=f1f=gμと同等です。

ステップバイステップの例

これは、定義で使用される表記法に慣れていない人のために段階的に計算される例です。関数f=μおよびg=σます。ここで、 n = 12での畳み込みμσを評価します。最初のいくつかの用語を以下の表にリストします。n=12

ff(1)f(2)f(3)f(4)f(5)f(6)f(7)f(8)f(9)f(10)f(11)f(12)μ111011100110σ134761281513181228

すべての自然数にわたる合計反復は、dN分割することをn=12、従ってd、すべての天然の約数を前提としn=12=223。これらはd=1,2,3,4,6,12。各加数で、dでg=σを評価し、nで評価したf = μで乗算しますdf=μnd。これで終わりです

(μσ)(12)=μ(12)σ(1)+μ(6)σ(2)+μ(4)σ(3)+μ(3)σ(4)+μ(2)σ(6)+μ(1)σ(12)=01+13+04+(1)7+(1)12+128=0+310712+28=12=id(12)

回答:


4

リーン108の 100 95 78 75バイト

def d(f g:_->int)(n):=(list.iota n).foldr(λd s,ite(n%d=0)(s+f d*g(n/d))s)0

オンラインでお試しください!

すべての機能を備えたより多くのテストケース。


ラムダは本当に4バイトよりも高価fun ですか?
マリオカルネイロ

ラムダは3バイトですが、私が思う
漏れ修道女

UTF8では2つだと思います(ギリシャ語はかなり低いUnicodeです)
マリオカルネイロ

あなたが正しい。私はまた輸入品をゴルフしました
リーキー修道女

また、以前condは5バイトを保存していました
Leaky Nun


3

Python 3、59バイト

lambda f,g,n:sum(f(d)*g(n//d)for d in range(1,n+1)if 1>n%d)

オンラインでお試しください!


されて//、本当に必要なの代わりに/
ミスターXcoder

/フロートを生成しますか?
リーキー修道女

定義上のd除数であるためn、の小数部n/dはゼロであるため、浮動小数点演算に問題はありません。小数部がゼロの浮動小数点数は、Pythonの目的ではintに十分に近く、関数の出力は実数であるため、n/d代わりに実行してn//dも問題ありません。
メゴ


2

Add ++、51バイト

D,g,@~,$z€¦~¦*
D,f,@@@,@b[VdF#B]dbRzGb]$dbL$@*z€g¦+

オンラインでお試しください!

引数として2つの事前定義関数に加えてn取り、出力(fg)(n)

使い方

D,g,		; Define a helper function, $g
	@~,	; $g takes a single argument, an array, and splats that array to the stack
		; $g takes the argument e.g. [[τ(x) φ(x)] [3 4]]
		; STACK : 			[[τ(x) φ(x)] [3 4]]
	$z	; Swap and zip:			[[3 τ(x)] [4 φ(x)]]
	€¦~	; Reduce each by execution:	[[τ(3) φ(4)]]
	¦*	; Take the product and return:	τ(3)⋅φ(4) = 4

D,f,		; Define the main function, $f
	@@@,	; $f takes three arguments: φ(x), τ(x) and n (Let n = 12)
		; STACK:			[φ(x) τ(x) 12]
	@	; Reverse the stack:		[12 τ(x) φ(x)]
	b[V	; Pair and save:		[12]			Saved: [τ(x) φ(x)]
	dF#B]	; List of factors:		[[1 2 3 4 6 12]]
	dbR	; Copy and reverse:		[[1 2 3 4 6 12] [12 6 4 3 2 1]]
	z	; Zip together:			[[[1 12] [2 6] [3 4] [4 3] [6 2] [12 1]]]
	Gb]	; Push Saved:			[[[1 12] [2 6] [3 4] [4 3] [6 2] [12 1]] [[τ(x) φ(x)]]]
	$dbL	; Number of dividors:		[[[τ(x) φ(x)]] [[1 12] [2 6] [3 4] [4 3] [6 2] [12 1]] 6]
	$@*	; Repeat:			[[[1 12] [2 6] [3 4] [4 3] [6 2] [12 1]] [[τ(x) φ(x)] [τ(x) φ(x)] [τ(x) φ(x)] [τ(x) φ(x)] [τ(x) φ(x)] [τ(x) φ(x)]]]
	z	; Zip:				[[[τ(x) φ(x)] [1 12]] [[τ(x) φ(x)] [2 6]] [[τ(x) φ(x)] [3 4]] [[τ(x) φ(x)] [4 3]] [[τ(x) φ(x)] [6 2]] [[τ(x) φ(x)] [12 1]]]
	€g	; Run $g over each subarray:	[[4 4 4 6 4 6]]
	¦+	; Take the sum and return:	28

2

R、58バイト

function(n,f,g){for(i in (1:n)[!n%%1:n])F=F+f(i)*g(n/i)
F}

オンラインでお試しください!

取りnfg。幸いなことにnumbersパッケージにはかなりの数の機能が既に実装されています。

ベクトル化されたバージョンが利用可能な場合は、各バージョンを Vectorizeでになり、次の45バイトバージョンが可能になります。

R、45バイト

function(n,f,g,x=1:n,i=x[!n%%x])f(i)%*%g(n/i)

オンラインでお試しください!




1

JavaScript(ES6)、47バイト

入力をとして受け取ります(f)(g)(n)

f=>g=>h=(n,d=n)=>d&&!(n%d)*f(n/d)*g(d)+h(n,d-1)

オンラインでお試しください!

liouville =
n => (-1) ** (D = (n, k = 2) => k > n ? 0 : (n % k ? D(n, k + 1) : 1 + D(n / k, k)))(n)

mobius =
n => (M = (n, k = 1) => n % ++k ? k > n || M(n, k) : n / k % k && -M(n / k, k))(n)

sq =
n => +!((n ** 0.5) % 1)

identity =
n => 1

// sq = liouville * identity
console.log([...Array(25)].map((_, n) => F(liouville)(identity)(n + 1)))

// liouville = mobius * sq
console.log([...Array(20)].map((_, n) => F(mobius)(sq)(n + 1)))

1

APL(Dyalog Classic)、20バイト

{(⍺⍺¨∘⌽+.×⍵⍵¨)∪⍵∨⍳⍵}

⎕IO←1

オンラインでお試しください!

簡単に解決でき、テストしにくい-一般的に私のタイプの課題ではありません。それでも、これはとても楽しかったです!

{ }オペランド⍺⍺⍵⍵が畳み込まれる2つの関数である2 項演算子を定義します。は数値引数です

∪⍵∨⍳⍵約数です昇順で、すなわちユニーク(LCMSの)(の)、それまでのすべての自然数とは、(

⍵⍵¨ それぞれに正しいオペランドを適用します

⍺⍺¨∘⌽ それぞれに左オペランドを逆に適用します

+.× 内積-対応する要素を乗算して合計する


ngn / aplでも同じことがUnicode識別子のためによく見えますが、1インデックスのために2バイト余分にかかります。


かなり確信してそれが27追加バイトを取るNGN / APL ...
エリックOutgolfer


1

F#、72バイト

let x f g n=Seq.filter(fun d->n%d=0){1..n}|>Seq.sumBy(fun d->f(n/d)*g d)

2つの関数fgおよび自然数を取りますn。にd自然に分割されない値をフィルタリングしますn。次に、とを評価f(n/d)g(d)、それらを一緒に乗算し、結果を合計します。


弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.