約数の和を出す

  • 雑多な記事
library(schoolmath)

N<-6
p.f<-prime.factor(N)
p.f
N-cumprod(p.f) # 0になるはず

#tableにはrow.namesに文字列でカテゴリ名が入るようなので

a<-table(p.f)
as.numeric(row.names(a))

# 積の初期値を1とする
ans<-1
for(i in 1:length(a)){ # 素因数ごとに
# 0乗から素数の数乗までの和をとって
	tmp<-sum(as.numeric(row.names(a)[i])^(0:a[i]))
    #tmp<-(as.numeric(row.names(a)[i])^(a[i]+1)-1)/(a[i]-1)でも
	# 掛け合わせる
	ans<-ans*tmp
}
#--------
#関数化して
#1とN自身も含めた約数の和は

sumOfYakusuu<-function(N){
	if(N==1) return(1) # N=1は特別
	p.f<-prime.factor(N)
	a<-table(p.f)
	ans<-1
	for(i in 1:length(a)){
		tmp<-sum(as.numeric(row.names(a)[i])^(0:a[i]))
		ans<-ans*tmp
	}
	ans
}
for(i in 1:12){
 print(paste("i=",i))
 print(paste("sumOfYakusuu=",sumOfYakusuu(i)))
}
  • a^0+a^1+...+a^kは次のようにしてもよいかもしれません。
  • S(k)=a^0+a^1+...+a^k
  • S(k+1)=a^0+a^1+...+a^k+a^(k+1)
  • S(k)は漸化式で、S(k+1)=S(k)*a+1
  • ここから
  • S(k+1)+x=S(k)*a+1+x=a*(S(k)+xなるxは
  • x=1/(a-1)ですから
  • S(k)=a^k*(S(0)+1/(a-1))なので
  • S(k)=(a^(k+1)-1)/(a-1)です。
  • こんな面倒なことをしなくても
  • a^n-1=(a-1)*(a^(n-1)+a^(n-2)+...+a^1+a^0)からも導けます