カプレカ数を求めるプログラムを書いてみました。
因みに、カプレカ数の定義はいくつかあって、今回のはその中の一つにすぎません。
3桁のカプレカ数は、
100a+10b+c-100c-10b-a
=100(a-c)+10(b-b)+1(c-a)
=100(a-c)-1(a-c)
=99(a-c)
よって、必要条件は99の倍数である。
4桁のカプレカ数は、
1000a+100b+10c+d-1000d-100c-10b-a
=1000(a-d)+100(b-c)+10(c-b)+1(d-a)
=999(a-d)+90(b-c)
=9(111(a-d)+10(b-c))
よって、必要条件は9の倍数である。
5桁のカプレカ数は、
10000a+1000b+100c+10d+e-10000e-1000d-100c-10b-a
=10000(a-e)+1000(b-d)+100(c-c)+10(d-b)+1(e-a)
=9999(a-e)+990(b-d)
=9(1111(a-e)+110(b-d))
よって、必要条件は9の倍数である。
というわけで、カプレカ数の候補を9ずつインクリメントさせていくという方針です。
その数を0から9のそれぞれの個数に分解して、
分解したものから最大値と最小値を生成して、
最大値から最小値を差を求めて、
カプレカ数の候補と比べ、等しければカプレカ数とする。
とりあえず、19桁までのカプレカ数を求めるプログラムを書いてみた。
#include <stdlib.h>
#define KETA 19
int main(int argc, char *argv[])
{
unsigned long long j,k,b,s,l;
unsigned long long r[KETA+1];
int i,n[10];
if ( argc == 2 ) {
j = atoll(argv[1]);
if ( j < 198 ) j = 198LL;
if ( j%9 != 0 ) {
j -= j%9;
}
} else {
j = 198LL;
}
r[0] = 0;
for (i=1; i<=KETA; i++) {
r[i] = r[i-1]*10+1;
}
for (k=j; k<=9*r[KETA]; k+=9LL) {
b = k;
for (i=0; i<10; i++) n[i] = 0;
while ( b > 0 ) {
n[b%10]++;
b /= 10 ;
}
s = l = 0LL;
for (i=0; i<10; i++) {
s = (9*r[n[i]]+1)*s + r[n[i]]*i;
l = (9*r[n[9-i]]+1)*l + r[n[9-i]]*(9-i);
}
if ( k == l-s ) printf("%llu\n",k);
}
return EXIT_SUCCESS;
}
変数の説明をすると、
j:カプレカ数の候補の初項
k:カプレカ数の候補
b:kのバックアップ
r:レピュニット数
n:0から9の個数の配列
s:カプレカ数の候補の最小値
l:カプレカ数の候補の最大値
出力の一部
6174
549945
631764
63317664
97508421
554999445
864197532
6333176664
9753086421
9975084201
86431976532
555499994445
633331766664
975330866421
997530864201
999750842001
とりあえず12桁までの出力ですが、こんな感じです。
思っていたよりも高速に出力してくれていると思うが、19桁は途方もなく時間がかかるだろう。
さて、出力結果を見て、規則性が見いだせそうなものがあります。
【495系(3n桁型)】
549945
554999445
555499994445
555549999944445
555554999999444445
555555499999994444445
555555549999999944444445
555555554999999999444444445
555555555499999999994444444445
︙
5…549…994…45
【6174系(2n+2桁型)】
631764
63317664
6333176664
633331766664
63333317666664
6333333176666664
633333331766666664
63333333317666666664
6333333333176666666664
︙
63…3176…64
【97508421-1系(2n+6桁型)】
9753086421
975330866421
97533308666421
9753333086666421
975333330866666421
97533333308666666421
9753333333086666666421
975333333330866666666421
97533333333308666666666421
︙
9753…3086…6421
【97508421-2系(2n+6桁型)】
9975084201
999750842001
99997508420001
9999975084200001
999999750842000001
99999997508420000001
9999999975084200000001
999999999750842000000001
99999999997508420000000001
︙
99…97508420…01
【97508421-3系(4n+4桁型)】
997530864201
9997533086642001
99997533308666420001
999997533330866664200001
9999997533333086666642000001
99999997533333308666666420000001
999999997533333330866666664200000001
9999999997533333333086666666642000000001
99999999997533333333308666666666420000000001
︙
99…9753…3086…6420…01
【864197532系(2n+7桁型)】
86431976532
8643319766532
864333197666532
86433331976666532
8643333319766666532
864333333197666666532
86433333331976666666532
8643333333319766666666532
864333333333197666666666532
︙
8643…31976…6532
さて、法則が見つかったものの桁型を並べてみると、
3n桁型→3の倍数を網羅
2n+2桁型→4以上の偶数を網羅
2n+6桁型→8以上の偶数を網羅
4n+4桁型→8以上の4の倍数を網羅
2n+7桁型→9以上の奇数を網羅
但し、nは自然数なので、
これらより、1桁、2桁、5桁、7桁の4種において、カプレカ数が存在しないことが解ります。
それ以外は必ずカプレカ数が存在するということでもあります。
カプレカ数のピラミッドの構造を解りやすいように適当に色分けして描いてみました。
64ビット環境では、多倍長演算をしないかぎり、unsigned long longで19桁が最長だろう。
上図のピラミッドに含まれない、新たなカプレカ数は、おそらく存在するだろう。
上図の様にピラミッドとして分類した場合、ピラミッドが無限に存在するのかなどは、証明出来るのだろうか。
ではでは