Pythonでカプレカ数を計算する
面白い数学の性質としてカプレカ数があります。カプレカ数はある数値に対し、各桁を大きい順番に並び替えてできる数から各桁を小さい順番に並び替えてできる数を差し引く操作を繰り返します。
例えば451という数値であると
541 - 145 = 396
963 - 369 = 594
954 - 459 = 495
954 - 495 = 495
となり、以下いくら計算しても495のまま永遠に繰り返されます。そして、451だけでなく、ほとんどの3桁の正の整数の場、合最後の値が495になるというものです。pythonで確認してみます。
まず、整数をいったんリストにする関数を作ります。
def num2lst(num):
lst = []
while True:
lst.insert(0,num % 10)
num //= 10
if num == 0:
return lst
num2lst(143)
#[1,4,3]
次にリストを整数に戻す関数を作ります。
def lst2num(lst):
num = 0
for i in lst:
num = num * 10 + i
return num
lst2num([1,4,3])
#143
2つの関数を使い、並び替えた最大値と最小値の差を求める関数をつくります。
def differ(x):
min=sorted(num2lst(x))
max=sorted(num2lst(x), reverse=True)
x =lst2num(max)-lst2num(min)
return x
differ(451)
#396
この関数を使い、100から999まで最終結果が495になるか確認します。ここでは、1つ前に計算した数値をprev、新しく計算した数値をxとして等しくなったら計算終了としました。
for i in range(100,1000):
x=i
prev=0
cnt=0
while x!= prev and cnt<100:
prev=x
x=differ(prev)
cnt+=1
print(i,x if cnt<100 else 'xx')
驚くことに、ほとんどの3桁の整数は495になりました。このような値をカプレ化数といいます。しかし、443や444のように、3桁のうち2桁ないし3桁の値が等しい場合には0になってしまいます。しかし、2桁の値が等しくても441は495になります。
4桁の場合には、6174がカプレカ数になります。とても奥深いものを感じます。