Reverse and Subtract(日本語に直すと「反転引き算」)と呼ばれる次のような計算があります.
==============================================================
進法で表した自然数 の反転引き算を次式で定義する.
ここで, は の各桁の数字を逆に並べた数である.
==============================================================
例えば, とすると, であり,
となります.この記事では,反転引き算が持つ特徴をいくつか紹介していきます.また,ブログの最後には反転引き算を計算するVBAのソースコードを掲載します.
1.反転引き算の結果が0になるのは回分数である.
反転引き算の結果が0になるためには各桁の数字を逆に並べた数が元の数に等しくなる必要があります.このような数は”回分数”と呼ばれています.
2.1桁,2桁および3桁の数は反転引き算を繰り返すといずれは0に達する.
すべての1桁の数は回分数であるので,1回反転引き算を行うと0に到達します.2桁および3桁の数には回分数であるものと,そうでないものが含まれますが,回分数でなくても反転引き算を繰り返すとすべて0に到達します.例えば,13は回分数ではありませんが反転引き算を6回繰り返すと0に到達します.
3.反転引き算は桁数を増やさない.
反転引き算はある桁の数から同じ桁,あるいは一つ小さい桁の数を引く操作です.そのため,反転引き算は桁数を増やしません.
4.反転引き算の結果は9の倍数である.
これは次のように証明できます.
証明: 桁の数の 桁目の数を と表す.
よって,反転引き算の結果は9の倍数である.
5.1桁,2桁および3桁の数は反転引き算をした結果を9で割ると回分数になる.
1桁の数は1回反転引き算をすると0に到達します.0は9で割っても0であり,0は回分数であるため,1桁の数については反転引き算をした結果を9で割ると回分数になることがわかります.
2桁の数については 式より, となるので,反転引き算をした結果を9で割ると1桁の数,すなわち回分数になるとわかります.
3桁の数については 式より, となるので,反転引き算をした結果を9で割ると11以上99以下の11の倍数になり,これらはすべて回分数です.
6.4桁の数には反転引き算を繰り返しても0に到達しない数がある.
4桁の数には反転引き算を繰り返しても0に到達しない数が637個あります.これらの数は,すべて初項1012,公差11の等差数列に含まれています.これらの数は,反転引き算を繰り返すと必ず1089,2178,3267,4356,6534,7623,8712,9801のいずれかに到達し,最終的に6534と2178をループします.ループへの入り方は,次のように分類できます.
(1)→2178→6534→2178→...
(2)→4356→2178→6534→2178→...
(3)→1089→4356→2178→6534→2178→...
(4)→7623→4356→2178→6534→2178→...
(5)→6534→2178→6534...
(6)→8712→6534→2178→6534...
(7)→3267→8712→6534→2178→6534...
(8)→9801→8712→6534→2178→6534...
反転引き算の特徴の紹介はここまでにします.反転引き算には,まだまだ未知のパターンが潜んでいる気がします.
付録:反転引き算を計算するマクロ(VBA)
Sub reverse_sub()
Dim N() As Long
Dim M As Long
Dim R(10) As Long
'M以下の数の反転引き算を計算する
M = 10000
ReDim N(M, M)
For i = 1 To M
L = 1
i1 = i
Do
k = 0
i2 = i1
Do
k = k + 1
R(k) = (i2 Mod 10 ^ k) / (10 ^ (k - 1))
i2 = i2 - R(k) * 10 ^ (k - 1)
Loop Until i2 = 0
For k1 = 1 To k
i1 = i1 - R(k1) * 10 ^ (k - k1)
Next k1
N(i, L) = i1
L = L + 1
'40回ループしたら計算打切り
If L > 40 Then
N(i, L) = 0
GoTo 10
End If
'0になったら計算打切り
Loop Until i1 = 0
10
Next i
'セルに出力
For i = 1 To M
Cells(i, 1) = i
L = 0
Do
L = L + 1
Cells(i, 1 + L) = N(i, L)
Loop Until N(i, L) = 0
Next i
End Sub