Kết hợp Dirichlet


19

Phép chập Dirichlet là một loại tích chập đặc biệt xuất hiện như một công cụ rất hữu ích trong lý thuyết số. Nó hoạt động trên tập hợp các hàm số học .

Thử thách

Cho hai hàm số học f,g (tức là các hàm f,g:NR ) tính toán tích chập Dirichlet (f*g):NR như được định nghĩa dưới đây.

Chi tiết

  • Chúng tôi sử dụng quy ước 0N= ={1,2,3,Giáo dục} .
  • Phép tích phân Dirichlet f*g của hai hàm số học f,g lại là hàm số học và nó được định nghĩa là
    (f*g)(n)= =Σd|nf(nd)g(d)= =Σtôij= =nf(tôi)g(j).
    (Cả hai khoản tiền tương đương Khái niệm.d|nphương tiệnchia, do đó tổng kết thúc tự nhiênướccủa Tương tự như vậy chúng ta có thể subsitute.dNnn i = nntôi= =ndN,j= =dN( Σ n N f(n)và chúng tôi nhận được công thức tương đương thứ hai. Nếu bạn chưa quen với ký hiệu này, có một ví dụ từng bước ở bên dưới.) Chỉ cần giải thích (điều này không liên quan trực tiếp đến thử thách này): Định nghĩa xuất phát từ việc tính toán sản phẩm của loạt Dirichlet :
    (ΣnNf(n)nS)(ΣnNg(n)nS)= =ΣnN(f*g)(n)nS
  • Đầu vào được đưa ra như hai chức năng hộp đen . Ngoài ra, bạn cũng có thể sử dụng danh sách vô hạn, trình tạo, luồng hoặc thứ gì đó tương tự có thể tạo ra số lượng giá trị không giới hạn.
  • Có hai phương thức đầu ra: Hoặc là một hàm f*g được trả về hoặc thay vào đó, bạn có thể lấy một đầu vào bổ sung nN và trả về (f*g)(n) trực tiếp.
  • Để đơn giản, bạn có thể giả sử rằng mọi phần tử của N có thể được biểu diễn bằng ví dụ int 32 bit dương.
  • Để đơn giản, bạn cũng có thể giả sử rằng mọi mục nhập R có thể được biểu diễn bằng ví dụ một số dấu phẩy động thực duy nhất.

Ví dụ

Trước tiên chúng ta hãy xác định một vài chức năng. Lưu ý rằng danh sách các số bên dưới mỗi định nghĩa đại diện cho một vài giá trị đầu tiên của hàm đó.

  • bản sắc nhân giống ( 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, ...
  • hàm đơn vị không đổi ( 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, ...
  • hàm nhận dạng ( A000027 )
    tôid(n)= =nn
    1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, ...
  • chức năng Mobius ( A008683 )
    μ(n)= ={(-1)k nếu n là không vuông và k là số lượng Primefactors của n0 nếu không thì 
    1, -1, -1, 0, -1, 1, -1, 0, 0, 1, -1, 0, -1, 1, 1, 0, -1, 0, -1, ...
  • chức năng Euler hàm Ơ-le ( A000010 )
    φ(n)= =nΠp|n(1-1p)
    1, 1, 2, 2, 4, 2, 6, 4, 6, 4, 10, 4, 12, 6, 8, 8, 16, 6, 18, 8, ...
  • các Liouville function ( A008836 )
    λ(n)= =(-1)k
    đâu k là số thừa số nguyên tố của n tính với đa dạng 1, -1, -1, 1, -1, 1, -1, -1, 1, 1, -1, -1, -1, 1, 1, 1, -1, -1, -1, ...
  • chức năng ước sum ( A000203 )
    σ(n)= =Σd|nd
    1, 3, 4, 7, 6, 12, 8, 15, 13, 18, 12, 28, 14, 24, 24, 31, 18, 39, 20, ...
  • chức năng ước đếm ( 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, ...
  • hàm đặc trưng của số vuông ( A010052 )
    Sq(n)= ={1 nếu n là một số vuông0nếu không thì
    1, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, ...

Sau đó, chúng tôi có các ví dụ sau:

  • ϵ=1μ
  • f=ϵff
  • ϵ=λ|μ|
  • σ=φτ
  • id=σμσ=id1
  • sq=λ1λ=μsq
  • τ=111=τμ
  • id=φ1φ=idμ

Cuối cùng cho là hậu quả của sự đảo ngược Mobius : Đối với bất kỳ f,g phương trình g=f1 tương đương với f=gμ .

Ví dụ từng bước

Đây là một ví dụ được tính toán từng bước cho những người không quen thuộc với ký hiệu được sử dụng trong định nghĩa. Hãy xem xét các chức năng f=μg=σ . Bây giờ chúng ta sẽ đánh giá của họ chập μσ tại n=12 . Một vài thuật ngữ đầu tiên của họ được liệt kê trong bảng dưới đây.

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

Các lặp tổng trên tất cả các số tự nhiên dN mà chia n=12 , do đó d giả định tất cả các ước tự nhiên của n=12=223 . Đây là d=1,2,3,4,6,12 . Trong mỗi summand, chúng tôi đánh giá g=σ tại d và nhân nó với f=μ đánh giá ở nd . Bây giờ chúng ta có thể kết luận

(μ*σ)(12)= =μ(12)σ(1)+μ(6)σ(2)+μ(4)σ(3)+μ(3)σ(4)+μ(2)σ(6)+μ(1)σ(12)= =01+13+04+(-1)7+(-1)12+128= =0+310-7-12+28= =12= =tôid(12)

Câu trả lời:


4

Lean , 108 100 95 78 75 byte

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

Hãy thử trực tuyến!

Nhiều testcase với tất cả các chức năng.


lambda có thực sự đắt hơn bốn byte fun không?
Mario Carneiro

lambda là ba byte, tôi cho rằng
Leaky Nun

Tôi nghĩ đó là hai trong UTF8 (tiếng Hy Lạp là unicode khá thấp)
Mario Carneiro

Bạn đúng. Tôi cũng đã đánh gôn nhập khẩu
Leaky Nun

Tôi cũng đã sử dụng condđể lưu 5 byte
Leaky Nun

4

Haskell , 46 byte

(f!g)n=sum[f i*g(div n i)|i<-[1..n],mod n i<1]

Hãy thử trực tuyến!

Cảm ơn flawr cho -6 byte và một thách thức lớn! Và cảm ơn H.PWiz cho một -6 khác!


Đơn giản hơn ở đây ngắn hơn
H.PWiz

@ H.PWiz Điều đó khá thông minh - Tôi thậm chí không nghĩ làm theo cách đó!
Mego

3

Python 3 , 59 byte

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

Hãy thử trực tuyến!


//thực sự cần thiết thay vì /?
Ông Xcoder

/sẽ sản xuất phao phải không?
Leaky Nun

Do dlà một ước của nđịnh nghĩa, phần phân n/dsố bằng 0, nên không có bất kỳ vấn đề nào với số học dấu phẩy động. Phao có phần phân số bằng 0 đủ gần với int cho mục đích Pythonic và đầu ra của hàm là một số thực, vì vậy thực hiện n/dthay vì n//dsẽ ổn.
Mego


2

Thêm ++ , 51 byte

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

Hãy thử trực tuyến!

n(f*g)(n)

Làm thế nào nó hoạt động

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 byte

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

Hãy thử trực tuyến!

Mất n, fg. May mắn thay, numbersgói có khá nhiều chức năng được thực hiện.

Nếu có sẵn các phiên bản vector hóa, có thể bằng cách gói từng cái Vectorize, thì phiên bản 45 byte sau là có thể:

R , 45 byte

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

Hãy thử trực tuyến!




1

JavaScript (ES6), 47 byte

Đưa đầu vào là (f)(g)(n).

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

Hãy thử trực tuyến!

Ví dụ

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 byte

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

với ⎕IO←1

Hãy thử trực tuyến!

Dễ giải quyết, khó kiểm tra - nói chung không phải là loại thử thách của tôi. Tuy nhiên, tôi rất thích cái này rất nhiều!

{ }định nghĩa một toán tử dyadic có toán hạng ⍺⍺⍵⍵là hai hàm được xác định; là đối số số

∪⍵∨⍳⍵là các ước của thứ tự tăng dần, tức là duy nhất ( ) của LCMs ( ) với tất cả các số tự nhiên lên đến nó ( )

⍵⍵¨ áp dụng toán hạng đúng cho mỗi toán hạng

⍺⍺¨∘⌽ áp dụng toán hạng bên trái cho mỗi toán tử ngược

+.× sản phẩm bên trong - nhân các yếu tố tương ứng và tổng


Tương tự trong ngn / apl có vẻ tốt hơn vì định danh Unicode, nhưng mất thêm 2 byte vì lập chỉ mục 1.


Khá chắc chắn rằng nó cần thêm 27 byte trong ngn / apl ...
Erik the Outgolfer 17/11/18

1

C (gcc) , 108 byte

#define F float
F c(F(*f)(int),F(*g)(int),int n){F s=0;for(int d=0;d++<n;)if(n%d<1)s+=f(n/d)*g(d);return s;}

Thực hiện đơn giản, bị đánh cắp một cách đáng xấu hổ từ câu trả lời Python của Leaky Nun .

Ung dung:

float c(float (*f)(int), float (*g)(int), int n) {
    float s = 0;
    for(int d = 1; d <= n;++d) {
        if(n % d == 0) {
            s += f(n / d) * g(d);
        }
    }
    return s;
}

Hãy thử trực tuyến!


1

F #, 72 byte

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

Đưa hai chức năng fgvà một số tự nhiên n. Lọc ra các giá trị dkhông tự nhiên phân chia thành n. Sau đó đánh giá f(n/d) và nhân g(d)chúng lại với nhau và tính tổng kết quả.


Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.