前記事のプログラムで1000桁まで検索したが、粘度12は見つからなかった。
まぁ、予想はしていた。
裏で検索プログラムを8個くらいパラレルに動かしてたので、パソコンが悲鳴を上げてたのはいうまでもない。
さて、表では粘度12が存在するのかということを考えてはいた。
まず、最小という条件をなくし、この問題を考えてみる。
木構造をしていることは誰でも分かる。
根、つまり粘度0は、0、1、2、3、4、5、6、7、8、9の10種類のみである。
この10個中、素数である2、3、5、7の4種類と、合成数である4、6、8、9の4種類と、それ以外の0と1の2種類である。
この問題の性質上、0が桁に含まれたら、即座に粘度0になるし、1が何個桁に含まれようと、直下の節の値は変わらない。
とりあえず、粘度1までの系列を列挙する。
【0系】
0-10
0-20
0-30
0-40
0-50
0-60
0-70
0-80
0-90
0-{*0*}
【1系】
1-{11}
1-{1…1}
【2系】
2-{12}
2-{1…12}
【3系】
3-{13}
3-{1…13}
【4系】
4-{14}
4-{1…14}
4-{22}
4-{122}
4-{1…122}
【5系】
5-{15}
5-{1…15}
【6系】
6-{16}
6-{1…16}
6-{23}
6-{123}
6-{1…123}
【7系】
7-{17}
7-{1…17}
【8系】
8-{18}
8-{24}
8-{1…18}
8-{124}
8-{1…124}
8-{222}
8-{1222}
8-{1…1222}
【9系】
9-{19}
9-{1…19}
9-{33}
9-{133}
9-{1…133}
中括弧{}で表した値は、それぞれの桁の順番を入れ替えたもの全てを意味し、0という例外はありますが、昇順で並べて一意(ユニーク)にすることとします。
また、
0…0となっているものは、0を何個も使っている事を表しています。
1…1となっているものは、1を何個も使っている事を表しています。
*は、ワイルドカードで、如何なる数値も含んでいる事を表しています。
この木構造でどれが一番伸びるのかということである。
では、0-10系を例に展開しましょう。
0-10-{25}系
0-10-{125}系
0-10-{1…125}系
に分かれ、更に深く進むと、
0-10-{25}系
0-10-25-{55}
0-10-25-{155}
0-10-25-{1…155}
0-10-(52)
0-10-{125}系
0-10-125-{555}
0-10-125-{1555}
0-10-125-{1…1555}
0-10-(152)
0-10-(215)
0-10-[251]
0-10-512-{888}
0-10-512-{1888}
0-10-512-{1…1888}
0-10-512-{2488}
0-10-512-{12488}
0-10-512-{1…12488}
0-10-512-{4448}
0-10-512-{14448}
0-10-512-{1…14448}
0-10-512-{22288}
0-10-512-{122288}
0-10-512-{1…122288}
0-10-512-{22448}
0-10-512-{122448}
0-10-512-{1…122448}
0-10-512-{24444}
0-10-512-{124444}
0-10-512-{1…124444}
…
0-10-512-{222222222}
0-10-512-{1222222222}
0-10-512-{1…1222222222}
と、途中を端折りましたが、こんな感じになります。
(52)のように()をしてあるものは、2桁以上の素因数を含む合成数。
52=2^2*13
[251]などに[]をしてあるものは、2桁以上の素数。
とします。
とりあえず、今回考えているのは1系です。
1系、つまりレピュニット数(repunit/repeated unit)である。
n桁のレピュニット数の公式は、
R[n]=((10^n)-1)/9
と表せ、例えば、
R[2]=[11]
R[3]=(111)=3*37
R[4]=(1111)=11*101
R[5]=(11111)=41*271
R[6]=(111111)=3*7*11*13*37
R[7]=(1111111)=239*4649
R[8]=(11111111)=11*73*101*137
R[9]=(111111111)=3^2*37*333667
R[10]=(1111111111)=11*41*271*9091
R[11]=(11111111111)=21649*513239
R[12]=(111111111111)=3*7*11*13*37*101*9901
R[13]=(1111111111111)=53*79*265371653
R[14]=(11111111111111)=11*239*4,649*909091
R[15]=(111111111111111)=3*31*37*41*271*2906161
R[16]=(1111111111111111)=11*17*73*101*137*5882353
R[17]=(11111111111111111)=2071723*5363222357
R[18]=(111111111111111111)=32*7*11*13*19*37*52579*333667
R[19]=[1111111111111111111]
R[20]=(11111111111111111111)=11*41*101*271*3541*9091*27961
R[21]=(111111111111111111111)=3*37*43*239*1933*4649*10838689
R[22]=(1111111111111111111111)=11^2*23*4093*8779*21649*513239
R[23]=[11111111111111111111111]
R[24]=(111111111111111111111111)=3*7*11*13*37*73*101*137*9901*99990001
R[25]=(1111111111111111111111111)=41*271*21401*25601*182521213001
R[26]=(11111111111111111111111111)=11*53*79*859*265371653*1058313049
R[27]=(111111111111111111111111111)=3^3*37*757*333667*440334654777631
R[28]=(1111111111111111111111111111)=11*29*101*239*281*4649*909091*121499449
R[29]=(11111111111111111111111111111)=3191*16763*43037*62003*77843839397
R[30]=(111111111111111111111111111111)=3*7*11*13*31*37*41*211*241*271*2161*9091*2906161
…
の様になります。
因みに、このレピュニット数は、R[2]、R[19]、R[23]の様に素数のものがあり、レピュニット素数として研究されています。
現在、レピュニット素数は、2、19、23、317、1031、の5個まで確定しており、6個目以降は、49081、86453、109297、270343、と9個目までが判定待ちである。
本題に戻って、
偶数桁のレピュニット数に着目すると、30までしか示していませんが、必ず11という素因数が含まれます。
これは、簡単に説明すると、
多項式
X=a[2m]*10^(2m-1) + a[2m-1]*10^(2m-2) + … + a[2]*10 + a[1]
において、
10≡-1 (mod 11)
であるから、
P=Σ{k=2 to 2m step 2} a[k]=偶数項の係数の総和
Q=Σ{k=1 to 2m-1 step 2} a[k]=奇数項の係数の総和
P-Q≡0 (mod 11)
を満たせば、Xは11の倍数となり、各桁が等しいレピュニット数の性質から、偶数桁レピュニット数ならば必ず11の倍数となる。
つまり、1系は、偶数桁レピュニット数は11の倍数なので調べる必要はなく、奇数桁レピュニット数だけを調べれば良いこととなります。
また、1桁の素数2、3、5、7だけを素因数に持つレピュニット数を考えると、
レピュニット数が常に奇数であることから、素因数2は持たない。
レピュニット数の常に末尾が1であることから、素因数5は持たない。
ということは明白である。
つまり、3と7だけを素因数に持つレピュニット数は存在するのかということになります。
更に、素因数3はR[3m]、素因数7はR[6m]に、必ず現れます。
これに関しては、過去記事、3の倍数、7の倍数の判定法を書いているので、必要であれば、そちらを参照してください。
6mは偶数なので、R[6m]は7の倍数であることと同時に、11の倍数でもあります。
つまり、2と5だけではなく、7も使えなくなります。
残るは3だけになってしまいました。
九九の3の段を思い出してください。
3*1=3、3*2=6、3*3=9、3*4=12、3*5=15、3*6=18、3*7=21、3*8=24、3*9=27
これからも分かる様に、レピュニット数になるためには、3に最低でも1の位が7の2桁以上の値を掛けなければなりません。
実は、R[3m]は3の倍数であることと同時に、37の倍数でもあります。
37の倍数判定は、3の倍数判定と似ていて、下位桁から3桁ずつに分割した値の総和が37の倍数ならば、元の数も37の倍数である。
これは、
R[3]=(111)=3*37
に起因している。
つまり、1系には粘度2以上は存在しないことが確定しました。
1-[11] ×
1-{111} ×
1-{1…1} ×
ここまでで、1系は初期段階のプログラムから除外していたことの証明にはなるでしょう。
これを踏まえて、
4-{22} × 粘度1で終了
8-{222} × 粘度1で終了
6-16-{2222} × 粘度2で終了
6-32-{22222} × 粘度2で終了
*-{2…2} △
9-{33} × 粘度1で終了
4-14-27-{333} × 粘度3で終了
8-81-{3333} × 粘度2で終了
8-24-243-{33333} × 粘度3で終了
*-{3…3} △
6-16-{44} × 粘度2で終了
8-24-64-{444} × 粘度3で終了
0-60-256-{4444} × 粘度3で終了
0-1024-{44444} ×粘度2で終了
*-{4…4} △
0-10-25-{55} × 粘度3で終了
0-10-125-{555} × 粘度3で終了
0-60-625-{5555} × 粘度3で終了
0-30-3125-{55555} × 粘度3で終了
*-{5…5} △
8-18-36-{66} × 粘度3で終了
2-12-216-{666} × 粘度3で終了
0-108-1296-{6666} × 粘度3で終了
0-2058-7776-{66666} × 粘度4で終了
*-{6…6} △
8-18-36-49-{77} × 粘度4で終了
8-18-36-343-{777} × 粘度4で終了
0-2401-{7777} × 粘度2で終了
0-16807-{77777} × 粘度2で終了
*-{7…7} △
8-24-64-{88} × 粘度3で終了
0-10-512-{888} × 粘度3で終了
0-4096-{8888} × 粘度2で終了
0-2016-32768-{88888} × 粘度3で終了
*-{8…8} △
8-81-{99} × 粘度2で終了
2-12-126-729-{999} × 粘度4で終了
0-180-6561-{9999} × 粘度3で終了
0-59049-{99999} × 粘度2で終了
*-{9…9} △
と{}の中を5桁まで求めてみたが、粘度は伸び悩んでいることが分かる。
だからといって、多桁のn*レピュニット数に可能性がないかは不明なので、とりあえず△としておく。
ここで、もう一度、多項式Xを見てみる。
例えば、
a…a
a…ab…b
a…ab…bc…c
のような、それぞれの部分が偶数桁であれば、11の倍数であるとも言える。
プログラムでは、最小値のみを検索しているため、、上位の桁の値が小さく、下位の桁の値が大きいという条件下で値を増加させている。
例えば、ある桁数において、
*-26…………………67
*-26…67……………77
*-26…67……………78
*-26…67……………79
*-26…67…78………88
*-26…67…78………89
*-26…67…78…89…99
*-26…67…79………99
*-26…68……………88
*-26…68……………89
*-26…69……………99
*-27…………………77
*-27…………………78
*-27…………………79
*-27…78……………88
*-27…78……………89
*-27…78…89………99
*-27…79……………99
*-28…………………88
*-28…………………89
*-28…89……………99
*-29…………………99
*-35…………………55
*-35…………………57
*-35…………………59
*-35…57……………77
*-35…57……………79
*-35…57…79………99
*-37…………………77
*-37…………………78
*-37…………………79
*-37…78……………88
*-37…78……………89
*-37…78…89………99
*-37…79……………99
*-38…………………88
*-38…………………89
*-38…89……………99
*-39…………………99
*-46…………………66
*-46…………………67
*-46…67……………77
*-46…67……………78
*-46…67…78………88
*-46…67…78………89
*-46…67…79………99
*-46…68……………88
*-46…68……………89
*-46…68…89………99
*-46…69……………99
*-47…………………77
*-47…………………78
*-47…………………79
*-47…78……………88
*-47…78……………89
*-47…78…89………99
*-47…79……………99
*-48…………………88
*-48…………………89
*-48…89……………99
*-49…………………99
*-55…………………55
*-55…………………57
*-55…………………59
*-55…57……………77
*-55…57……………79
*-55…57…79………99
*-55…59……………99
*-57…………………77
*-57…………………79
*-57…79……………99
*-59…………………99
*-66…………………66
*-66…………………67
*-66…………………68
*-66…………………69
*-66…67……………77
*-66…67……………78
*-66…67……………79
*-66…67…78………88
*-66…67…78………89
*-66…67…78…89…99
*-66…67…79………99
*-66…68……………88
*-66…68……………89
*-66…68…89………99
*-66…69……………99
*-66…67……………77
*-66…67……………78
*-66…67…78………88
*-66…67…78………89
*-66…67…78…89…99
*-66…67…79………99
*-66…68……………88
*-66…68……………89
*-66…68…89………99
*-66…69……………99
*-67…………………77
*-67…………………78
*-67…………………79
*-67…78……………88
*-67…78……………89
*-67…78…89………99
*-67…79……………99
*-68…………………88
*-68…………………89
*-68…89……………99
*-69…………………99
*-77…………………77
*-77…………………78
*-77…78……………88
*-77…78……………89
*-77…78…89………99
*-77…79……………99
*-78…………………88
*-78…………………89
*-78…89……………99
*-79…………………99
*-88…………………88
*-88…………………89
*-88…89……………99
*-89…………………99
*-99…………………99
※但し、便宜上桁を揃えるために、ab…bbやab…bcのような書き方をしたが、bはいずれも1桁以上とする。
の様に進み、桁数を増やすこととなっている。
この流れを見るとわかるが、レピュニット数の連結の可能性は、
*-55…………………55
*-55…57……………77
*-55…57…79………99
*-55…59……………99
*-66…………………66
*-66…67……………77
*-66…67…78………88
*-66…67…78…89…99
*-66…67…79………99
*-66…68……………88
*-66…69……………99
*-77…………………77
*-77…78……………88
*-77…78…89………99
*-77…79……………99
*-88…………………88
*-88…89……………99
*-99…………………99
で、それぞれの部分が偶数桁であるという条件ですね。
レピュニット数だけの枝刈りを、今までのプログラムに施した場合、どれだけ効果があるかというと、ほとんど効果がないだろう。
なぜなら、全体から見たらレピュニット数である確率は極めて低い。
つまり、レピュニット数だけの判定ルーチンを付加した事で、逆に遅くなる可能性の方が高いといえる。
しかし、11の倍数判定ルーチンとして、上記の枝刈りを入れるのは効果があるかもしれない。
入れるならば、一番最後に示したプログラムであれば、2から9までの桁数は即座に分かるので判定も楽であるし、桁数も多いので、少なからず効果が期待できそうである。
そうなると、いままで例外としていた粘度1の10、粘度2の25以外に、粘度4の77も加わることとなり、間の粘度3の39も例外としたほうがよさそうである。
もし、37の倍数判定も加えるならば、いままで4桁毎区切って16ビット整数型配列に入れていたものを、3桁毎にし、多倍長演算の足し算も加えることとなるだろう。
つづく(つづくのか?)