Squared Digit Sum
きっかけ
結城先生の引用リツイート
おもしろいループ
$n \in\mathbb{N}$とします。
$n$を$10$進数で表記したときの表示を$n_{(10)}$と表すことにします。
このとき$n_{(10)}$の各桁の平方和$s_n^{10}$をとります。$n$を$s_n^{10}$に対応させる関数を$f_{10}$とします。
$f_{10}$を繰り返し適用した数列、すなわち
\[n_{(10)},f_{10}(n_{(10)}),f_{10}(f_{10}(n_{(10)})),\ldots\]を考えます。
このとき、数列$n,f_{10}(n_{(10)}),f_{10}(f_{10}(n_{(10)})),\ldots$は,次の$2$つのパターンに落ちるそうです。
-
パターン1: 1が無限に続く
-
パターン2: $4{(10)},16{(10)},37{(10)},58{(10)},89{(10)},145{(10)},42{(10)},20{(10)}$ のループに落ちる。
これはとても不思議!
本当かどうかを確かめてみましょう。
$n=1$から$n=100$について$n_{(10)},f_{10}(n_{(10)}),f_{10}(f_10(n_{(10)})),\ldots$を調べてみます調べてみます。以下はループするまでの数列を計算するプログラムです。$10$進数なのでbase=10
とします。
trans_decimal<-function(digits,base){
digits<-as.character(digits)
return(paste0(c("",digits,sprintf("(%d)",base)),collapse="|"))
}
decimal_digits<-function(n,base){
if(base>10){
return("Out of range of base")
}else{
digits<-c()
i<-0
while (n %% base^i !=n) {
d <- (n %% base^(i+1)-n %% base^i)/base^i
digits<-c(d,digits)
i<-i+1
}
return(digits)
}
}
add_square_digits<-function(n,base){
digits<-decimal_digits(n,base)
return(sum(digits*digits))
}
find_loop<-function(n_start,base){
loop<-c(n_start)
n_tmp<-add_square_digits(n_start,base)
while(n_tmp != 1 && sum(n_tmp == loop) != 1){
loop<-c(loop,n_tmp)
n_tmp<-add_square_digits(n_tmp,base)
}
return(c(loop,n_tmp))
}
out_put_loop<-function(seq){
l<-length(seq)
if(seq[l]==1){
return(c(1))
}else{
i_start<-which(seq[-l]==seq[l])
return(seq[i_start:(l-1)])
}
}
base=10
n_sample<-sample.int(10000,10)
for(i in 1:10){
res<-find_loop(n_sample[i],base=base)
res<-sapply(res,function(n){
digits<-decimal_digits(n,base=base)
return(trans_decimal(digits,base=base))
})
print(paste0(res,collapse="->"))
}
#### [1] "|6|5|0|2|(10)->|6|5|(10)->|6|1|(10)->|3|7|(10)->|5|8|(10)->|8|9|(10)->|1|4|5|(10)->|4|2|(10)->|2|0|(10)->|4|(10)->|1|6|(10)->|3|7|(10)"
#### [1] "|9|0|4|9|(10)->|1|7|8|(10)->|1|1|4|(10)->|1|8|(10)->|6|5|(10)->|6|1|(10)->|3|7|(10)->|5|8|(10)->|8|9|(10)->|1|4|5|(10)->|4|2|(10)->|2|0|(10)->|4|(10)->|1|6|(10)->|3|7|(10)"
#### [1] "|8|1|3|(10)->|7|4|(10)->|6|5|(10)->|6|1|(10)->|3|7|(10)->|5|8|(10)->|8|9|(10)->|1|4|5|(10)->|4|2|(10)->|2|0|(10)->|4|(10)->|1|6|(10)->|3|7|(10)"
#### [1] "|9|9|0|4|(10)->|1|7|8|(10)->|1|1|4|(10)->|1|8|(10)->|6|5|(10)->|6|1|(10)->|3|7|(10)->|5|8|(10)->|8|9|(10)->|1|4|5|(10)->|4|2|(10)->|2|0|(10)->|4|(10)->|1|6|(10)->|3|7|(10)"
#### [1] "|8|1|1|8|(10)->|1|3|0|(10)->|1|0|(10)->|1|(10)"
#### [1] "|2|5|7|5|(10)->|1|0|3|(10)->|1|0|(10)->|1|(10)"
#### [1] "|4|3|7|3|(10)->|8|3|(10)->|7|3|(10)->|5|8|(10)->|8|9|(10)->|1|4|5|(10)->|4|2|(10)->|2|0|(10)->|4|(10)->|1|6|(10)->|3|7|(10)->|5|8|(10)"
#### [1] "|3|1|9|8|(10)->|1|5|5|(10)->|5|1|(10)->|2|6|(10)->|4|0|(10)->|1|6|(10)->|3|7|(10)->|5|8|(10)->|8|9|(10)->|1|4|5|(10)->|4|2|(10)->|2|0|(10)->|4|(10)->|1|6|(10)"
#### [1] "|7|8|1|4|(10)->|1|3|0|(10)->|1|0|(10)->|1|(10)"
#### [1] "|5|1|5|4|(10)->|6|7|(10)->|8|5|(10)->|8|9|(10)->|1|4|5|(10)->|4|2|(10)->|2|0|(10)->|4|(10)->|1|6|(10)->|3|7|(10)->|5|8|(10)->|8|9|(10)"
確かに上の2つのパターンに落ちています。
10進以外の位取り記数進法の場合
いろんな位取り記数法でどのようなどのようなどのようなどのようなどのようなパターンが現れるのか調べてみましょう。
for(base in 2:10){
print(sprintf("base number is: %d" ,base))
result<-list()
for(i in 1:1000){
n_min<-min(out_put_loop(find_loop(i,base=base)))
res<-out_put_loop(find_loop(n_min,base=base))
res<-sapply(res,function(n){
digits<-decimal_digits(n,base=base)
return(trans_decimal(digits,base=base))
})
result[[i]]=paste0(res,collapse="->")
}
print(unique(result))
}
#### [1] "base number is: 2"
#### [[1]]
#### [1] "|1|(2)"
####
#### [1] "base number is: 3"
#### [[1]]
#### [1] "|1|(3)"
####
#### [[2]]
#### [1] "|2|(3)->|1|1|(3)"
####
#### [[3]]
#### [1] "|1|2|(3)"
####
#### [[4]]
#### [1] "|2|2|(3)"
####
#### [1] "base number is: 4"
#### [[1]]
#### [1] "|1|(4)"
####
#### [1] "base number is: 5"
#### [[1]]
#### [1] "|1|(5)"
####
#### [[2]]
#### [1] "|4|(5)->|3|1|(5)->|2|0|(5)"
####
#### [[3]]
#### [1] "|2|3|(5)"
####
#### [[4]]
#### [1] "|3|3|(5)"
####
#### [1] "base number is: 6"
#### [[1]]
#### [1] "|1|(6)"
####
#### [[2]]
#### [1] "|5|(6)->|4|1|(6)->|2|5|(6)->|4|5|(6)->|1|0|5|(6)->|4|2|(6)->|3|2|(6)->|2|1|(6)"
####
#### [1] "base number is: 7"
#### [[1]]
#### [1] "|1|(7)"
####
#### [[2]]
#### [1] "|2|(7)->|4|(7)->|2|2|(7)->|1|1|(7)"
####
#### [[3]]
#### [1] "|3|4|(7)"
####
#### [[4]]
#### [1] "|1|3|(7)"
####
#### [[5]]
#### [1] "|1|6|(7)->|5|2|(7)->|4|1|(7)->|2|3|(7)"
####
#### [[6]]
#### [1] "|6|3|(7)"
####
#### [[7]]
#### [1] "|4|4|(7)"
####
#### [1] "base number is: 8"
#### [[1]]
#### [1] "|1|(8)"
####
#### [[2]]
#### [1] "|4|(8)->|2|0|(8)"
####
#### [[3]]
#### [1] "|5|(8)->|3|1|(8)->|1|2|(8)"
####
#### [[4]]
#### [1] "|1|5|(8)->|3|2|(8)"
####
#### [[5]]
#### [1] "|2|4|(8)"
####
#### [[6]]
#### [1] "|6|4|(8)"
####
#### [1] "base number is: 9"
#### [[1]]
#### [1] "|1|(9)"
####
#### [[2]]
#### [1] "|5|5|(9)"
####
#### [[3]]
#### [1] "|5|8|(9)->|1|0|8|(9)->|7|2|(9)"
####
#### [[4]]
#### [1] "|4|5|(9)"
####
#### [[5]]
#### [1] "|7|5|(9)->|8|2|(9)"
####
#### [1] "base number is: 10"
#### [[1]]
#### [1] "|1|(10)"
####
#### [[2]]
#### [1] "|4|(10)->|1|6|(10)->|3|7|(10)->|5|8|(10)->|8|9|(10)->|1|4|5|(10)->|4|2|(10)->|2|0|(10)"
6進数表記にした場合も10進表記の場合と同じように$1,1,\ldots$か$\ldots,5{(6)},41{(6)},25{(6)},45{(6)},105{(6)},42{(6)},32{(6)},21{(6)},\ldots$の2つのパターンに落ちるっぽいですね。なんでこうなるか証明したいところです。
10進数の場合の証明
1945年に論文になっています。
6進数の場合の証明
ぱっと調べたところでは見当たらなかったので、上の文献にそって証明を書きます。
以下、位取り特に断らない場合はは10進記法で表記しているとします。
いま6進表記で桁数が$C$である正の整数$n$を考えます。すなわち
\(n=\sum_{i=1}^Cd_i6^{i-1},\,d_C\neq0\) という形で表せる正の整数を考えます。
[証明] 計算すれば分かります。
[証明] $f_6(n)\leq 25C$と$n\geq 6^{C-1}$であるから不等式
\[25C<6^{C-1}\]の成立する範囲を考えると,$C\geq 1$より$C>3.49485…$となる。したがって、$C\geq 4$のとき補題が成立する。
[証明]
補題2より十分大きな回数$f_6$を適用すると6進表記の桁数は$4$以下になることがわかります。
したがって十分大きな$k^\prime$に対して
\[(f_6)^{k^\prime}(n)\leq 5^2\times4=100=244_{(6)}\]が成立する。 $244{(6)}$ より小さな正の整数で最大の数は $155{(6)}$ であるから
\(\begin{align} (f_6)^{k^\prime+1}(n)\leq f_6(155_{(6)})=51=123_{(6)}\\ (f_6)^{k^\prime+2}(n)\leq f_6(55_{(6)})=50=122_{(6)} \end{align}\) したがって補題が成立する。
これらの補題を用いて次の定理を証明すれば証明は完了する。
[証明]
補題3より$n\leq 122_{(6)}=50$の範囲で調べれば良いことがわかる。$50$個くらいなら有限なので有限なので、全部書き下してみる。
base=6
for(i in 1:50){
res<-find_loop(i,base=base)
res<-sapply(res,function(n){
digits<-decimal_digits(n,base=base)
return(trans_decimal(digits,base=base))
})
print(paste0(res,collapse="->"))
}
#### [1] "|1|(6)->|1|(6)"
#### [1] "|2|(6)->|4|(6)->|2|4|(6)->|3|2|(6)->|2|1|(6)->|5|(6)->|4|1|(6)->|2|5|(6)->|4|5|(6)->|1|0|5|(6)->|4|2|(6)->|3|2|(6)"
#### [1] "|3|(6)->|1|3|(6)->|1|4|(6)->|2|5|(6)->|4|5|(6)->|1|0|5|(6)->|4|2|(6)->|3|2|(6)->|2|1|(6)->|5|(6)->|4|1|(6)->|2|5|(6)"
#### [1] "|4|(6)->|2|4|(6)->|3|2|(6)->|2|1|(6)->|5|(6)->|4|1|(6)->|2|5|(6)->|4|5|(6)->|1|0|5|(6)->|4|2|(6)->|3|2|(6)"
#### [1] "|5|(6)->|4|1|(6)->|2|5|(6)->|4|5|(6)->|1|0|5|(6)->|4|2|(6)->|3|2|(6)->|2|1|(6)->|5|(6)"
#### [1] "|1|0|(6)->|1|(6)"
#### [1] "|1|1|(6)->|2|(6)->|4|(6)->|2|4|(6)->|3|2|(6)->|2|1|(6)->|5|(6)->|4|1|(6)->|2|5|(6)->|4|5|(6)->|1|0|5|(6)->|4|2|(6)->|3|2|(6)"
#### [1] "|1|2|(6)->|5|(6)->|4|1|(6)->|2|5|(6)->|4|5|(6)->|1|0|5|(6)->|4|2|(6)->|3|2|(6)->|2|1|(6)->|5|(6)"
#### [1] "|1|3|(6)->|1|4|(6)->|2|5|(6)->|4|5|(6)->|1|0|5|(6)->|4|2|(6)->|3|2|(6)->|2|1|(6)->|5|(6)->|4|1|(6)->|2|5|(6)"
#### [1] "|1|4|(6)->|2|5|(6)->|4|5|(6)->|1|0|5|(6)->|4|2|(6)->|3|2|(6)->|2|1|(6)->|5|(6)->|4|1|(6)->|2|5|(6)"
#### [1] "|1|5|(6)->|4|2|(6)->|3|2|(6)->|2|1|(6)->|5|(6)->|4|1|(6)->|2|5|(6)->|4|5|(6)->|1|0|5|(6)->|4|2|(6)"
#### [1] "|2|0|(6)->|4|(6)->|2|4|(6)->|3|2|(6)->|2|1|(6)->|5|(6)->|4|1|(6)->|2|5|(6)->|4|5|(6)->|1|0|5|(6)->|4|2|(6)->|3|2|(6)"
#### [1] "|2|1|(6)->|5|(6)->|4|1|(6)->|2|5|(6)->|4|5|(6)->|1|0|5|(6)->|4|2|(6)->|3|2|(6)->|2|1|(6)"
#### [1] "|2|2|(6)->|1|2|(6)->|5|(6)->|4|1|(6)->|2|5|(6)->|4|5|(6)->|1|0|5|(6)->|4|2|(6)->|3|2|(6)->|2|1|(6)->|5|(6)"
#### [1] "|2|3|(6)->|2|1|(6)->|5|(6)->|4|1|(6)->|2|5|(6)->|4|5|(6)->|1|0|5|(6)->|4|2|(6)->|3|2|(6)->|2|1|(6)"
#### [1] "|2|4|(6)->|3|2|(6)->|2|1|(6)->|5|(6)->|4|1|(6)->|2|5|(6)->|4|5|(6)->|1|0|5|(6)->|4|2|(6)->|3|2|(6)"
#### [1] "|2|5|(6)->|4|5|(6)->|1|0|5|(6)->|4|2|(6)->|3|2|(6)->|2|1|(6)->|5|(6)->|4|1|(6)->|2|5|(6)"
#### [1] "|3|0|(6)->|1|3|(6)->|1|4|(6)->|2|5|(6)->|4|5|(6)->|1|0|5|(6)->|4|2|(6)->|3|2|(6)->|2|1|(6)->|5|(6)->|4|1|(6)->|2|5|(6)"
#### [1] "|3|1|(6)->|1|4|(6)->|2|5|(6)->|4|5|(6)->|1|0|5|(6)->|4|2|(6)->|3|2|(6)->|2|1|(6)->|5|(6)->|4|1|(6)->|2|5|(6)"
#### [1] "|3|2|(6)->|2|1|(6)->|5|(6)->|4|1|(6)->|2|5|(6)->|4|5|(6)->|1|0|5|(6)->|4|2|(6)->|3|2|(6)"
#### [1] "|3|3|(6)->|3|0|(6)->|1|3|(6)->|1|4|(6)->|2|5|(6)->|4|5|(6)->|1|0|5|(6)->|4|2|(6)->|3|2|(6)->|2|1|(6)->|5|(6)->|4|1|(6)->|2|5|(6)"
#### [1] "|3|4|(6)->|4|1|(6)->|2|5|(6)->|4|5|(6)->|1|0|5|(6)->|4|2|(6)->|3|2|(6)->|2|1|(6)->|5|(6)->|4|1|(6)"
#### [1] "|3|5|(6)->|5|4|(6)->|1|0|5|(6)->|4|2|(6)->|3|2|(6)->|2|1|(6)->|5|(6)->|4|1|(6)->|2|5|(6)->|4|5|(6)->|1|0|5|(6)"
#### [1] "|4|0|(6)->|2|4|(6)->|3|2|(6)->|2|1|(6)->|5|(6)->|4|1|(6)->|2|5|(6)->|4|5|(6)->|1|0|5|(6)->|4|2|(6)->|3|2|(6)"
#### [1] "|4|1|(6)->|2|5|(6)->|4|5|(6)->|1|0|5|(6)->|4|2|(6)->|3|2|(6)->|2|1|(6)->|5|(6)->|4|1|(6)"
#### [1] "|4|2|(6)->|3|2|(6)->|2|1|(6)->|5|(6)->|4|1|(6)->|2|5|(6)->|4|5|(6)->|1|0|5|(6)->|4|2|(6)"
#### [1] "|4|3|(6)->|4|1|(6)->|2|5|(6)->|4|5|(6)->|1|0|5|(6)->|4|2|(6)->|3|2|(6)->|2|1|(6)->|5|(6)->|4|1|(6)"
#### [1] "|4|4|(6)->|5|2|(6)->|4|5|(6)->|1|0|5|(6)->|4|2|(6)->|3|2|(6)->|2|1|(6)->|5|(6)->|4|1|(6)->|2|5|(6)->|4|5|(6)"
#### [1] "|4|5|(6)->|1|0|5|(6)->|4|2|(6)->|3|2|(6)->|2|1|(6)->|5|(6)->|4|1|(6)->|2|5|(6)->|4|5|(6)"
#### [1] "|5|0|(6)->|4|1|(6)->|2|5|(6)->|4|5|(6)->|1|0|5|(6)->|4|2|(6)->|3|2|(6)->|2|1|(6)->|5|(6)->|4|1|(6)"
#### [1] "|5|1|(6)->|4|2|(6)->|3|2|(6)->|2|1|(6)->|5|(6)->|4|1|(6)->|2|5|(6)->|4|5|(6)->|1|0|5|(6)->|4|2|(6)"
#### [1] "|5|2|(6)->|4|5|(6)->|1|0|5|(6)->|4|2|(6)->|3|2|(6)->|2|1|(6)->|5|(6)->|4|1|(6)->|2|5|(6)->|4|5|(6)"
#### [1] "|5|3|(6)->|5|4|(6)->|1|0|5|(6)->|4|2|(6)->|3|2|(6)->|2|1|(6)->|5|(6)->|4|1|(6)->|2|5|(6)->|4|5|(6)->|1|0|5|(6)"
#### [1] "|5|4|(6)->|1|0|5|(6)->|4|2|(6)->|3|2|(6)->|2|1|(6)->|5|(6)->|4|1|(6)->|2|5|(6)->|4|5|(6)->|1|0|5|(6)"
#### [1] "|5|5|(6)->|1|2|2|(6)->|1|3|(6)->|1|4|(6)->|2|5|(6)->|4|5|(6)->|1|0|5|(6)->|4|2|(6)->|3|2|(6)->|2|1|(6)->|5|(6)->|4|1|(6)->|2|5|(6)"
#### [1] "|1|0|0|(6)->|1|(6)"
#### [1] "|1|0|1|(6)->|2|(6)->|4|(6)->|2|4|(6)->|3|2|(6)->|2|1|(6)->|5|(6)->|4|1|(6)->|2|5|(6)->|4|5|(6)->|1|0|5|(6)->|4|2|(6)->|3|2|(6)"
#### [1] "|1|0|2|(6)->|5|(6)->|4|1|(6)->|2|5|(6)->|4|5|(6)->|1|0|5|(6)->|4|2|(6)->|3|2|(6)->|2|1|(6)->|5|(6)"
#### [1] "|1|0|3|(6)->|1|4|(6)->|2|5|(6)->|4|5|(6)->|1|0|5|(6)->|4|2|(6)->|3|2|(6)->|2|1|(6)->|5|(6)->|4|1|(6)->|2|5|(6)"
#### [1] "|1|0|4|(6)->|2|5|(6)->|4|5|(6)->|1|0|5|(6)->|4|2|(6)->|3|2|(6)->|2|1|(6)->|5|(6)->|4|1|(6)->|2|5|(6)"
#### [1] "|1|0|5|(6)->|4|2|(6)->|3|2|(6)->|2|1|(6)->|5|(6)->|4|1|(6)->|2|5|(6)->|4|5|(6)->|1|0|5|(6)"
#### [1] "|1|1|0|(6)->|2|(6)->|4|(6)->|2|4|(6)->|3|2|(6)->|2|1|(6)->|5|(6)->|4|1|(6)->|2|5|(6)->|4|5|(6)->|1|0|5|(6)->|4|2|(6)->|3|2|(6)"
#### [1] "|1|1|1|(6)->|3|(6)->|1|3|(6)->|1|4|(6)->|2|5|(6)->|4|5|(6)->|1|0|5|(6)->|4|2|(6)->|3|2|(6)->|2|1|(6)->|5|(6)->|4|1|(6)->|2|5|(6)"
#### [1] "|1|1|2|(6)->|1|0|(6)->|1|(6)"
#### [1] "|1|1|3|(6)->|1|5|(6)->|4|2|(6)->|3|2|(6)->|2|1|(6)->|5|(6)->|4|1|(6)->|2|5|(6)->|4|5|(6)->|1|0|5|(6)->|4|2|(6)"
#### [1] "|1|1|4|(6)->|3|0|(6)->|1|3|(6)->|1|4|(6)->|2|5|(6)->|4|5|(6)->|1|0|5|(6)->|4|2|(6)->|3|2|(6)->|2|1|(6)->|5|(6)->|4|1|(6)->|2|5|(6)"
#### [1] "|1|1|5|(6)->|4|3|(6)->|4|1|(6)->|2|5|(6)->|4|5|(6)->|1|0|5|(6)->|4|2|(6)->|3|2|(6)->|2|1|(6)->|5|(6)->|4|1|(6)"
#### [1] "|1|2|0|(6)->|5|(6)->|4|1|(6)->|2|5|(6)->|4|5|(6)->|1|0|5|(6)->|4|2|(6)->|3|2|(6)->|2|1|(6)->|5|(6)"
#### [1] "|1|2|1|(6)->|1|0|(6)->|1|(6)"
#### [1] "|1|2|2|(6)->|1|3|(6)->|1|4|(6)->|2|5|(6)->|4|5|(6)->|1|0|5|(6)->|4|2|(6)->|3|2|(6)->|2|1|(6)->|5|(6)->|4|1|(6)->|2|5|(6)"
確かに1になるか$e_i$のいずれかになるかである。証明終わり。