- メビウス反転公式
- 自然数を台とする関数があったときに、という関数gを定める。ただし、とは、dがnを割り切る自然数という意味である
- このとき、ある関数が存在して、となるという
- Rでこの(メビウス関数)を算出してみる
- は0,+1,-1のいずれかの値を取る
- 以下に、コードを書いたがメビウス関数の書き方が悪かったので書き直し→こちら
library(numbers)
my.f <- function(x){
sin(x)
}
N <- 100
my.g <- function(f,n){
ret <- 0
d <- divisors(n)
for(i in 1:length(d)){
ret <- ret + my.f(d[i])
}
ret
}
gout <- rep(0,N)
fout <- rep(0,N)
for(i in 1:N){
fout[i] <- my.f(i)
gout[i] <- my.g(f,i)
}
plot(gout)
my.mu <- function(f,N){
dvs <- list()
for(i in 1:N){
dvs[[i]] <- divisors(i)
}
fout <- rep(0,N)
gout <- rep(0,N)
for(i in 1:N){
fout[i] <- my.f(i)
gout[i] <- my.g(f,i)
}
ret <- rep(NA,N)
ret[1] <- fout[1]/gout[1]
loop <- TRUE
while(loop){
for(i in 1:N){
if(is.na(ret[i])){
if(length(which(is.na(ret[dvs[[i]]])))==1){
tmp <- which(!is.na(ret[dvs[[i]]]))
tmp3 <- which(is.na(ret[dvs[[i]]]))
tmp2 <- fout[i] - sum(ret[dvs[[i]][tmp]] * gout[i/dvs[[i]][tmp]])
ret[dvs[[i]][tmp3]] <- tmp2/gout[i/dvs[[i]][tmp3]]
}
}
}
if(length(which(is.na(ret))) == 0){
loop <- FALSE
}
}
return(list(fout=fout,gout=gout,mu=ret))
}
mu.out <- my.mu(f,N)
plot(mu.out$mu)
fout2 <- rep(0,N)
for(i in 1:N){
d <- divisors(i)
fout2[i] <- sum(mu.out$mu[d] * gout[i/d])
}
plot(fout,fout2)