午後のひとときに、数学の問題を解いてみる。
AとBには1桁の数が入り、
AB
AAB
AAAB
AAAAB
…
のように続くとき、
2桁から最大何桁まで素数でいられるか。
A、Bに入る数や桁数を求めよ。
シンキングタ~イム
まず、2桁以上の素数の一の位に着目すると、
1、3、7、9しかありえませんので、Bはこの4つのうちのいずれかとなります。
小さい方から調べてみましょう。
11 素数
111=3・37 合成数
13 素数
113 素数
1113=3・7・53 合成数
17 素数
117=32・13
19 素数
119=7・17
21=3・7 合成数
23 素数
223 素数
2223=32・13・19 合成数
27=33 合成数
29 素数
229 素数
2229=3・743 合成数
31 素数
331 素数
3331 素数
33331 素数
333331 素数
3333331 素数
33333331 素数
333333331=17・1907843 合成数
おそらく、これが最大だろうという予想します。
33=3・11 合成数
37 素数
337 素数
3337=47・71 合成数
39=3・13 合成数
41 素数
441=32・72 合成数
43 素数
443 素数
4443=3・1481 合成数
47 素数
447=3・149 合成数
49=72 合成数
51=3・17 合成数
53 素数
553=7・79 合成数
57=3・19 合成数
59 素数
559=13・43 合成数
61 素数
661 素数
6661 素数
66661=7・89・107 合成数
63=32・7 合成数
67 素数
667=23・29 合成数
69=3・23 合成数
71 素数
771=3・257 合成数
73 素数
773 素数
7773=3・2591 合成数
77=7・11 合成数
79 素数
779=19・41 合成数
81=34 合成数
83 素数
883 素数
8883=33・7・47 合成数
87=3・29 合成数
89 素数
889=7・127 合成数
91=7・13 合成数
93=3・31 合成数
97 素数
997 素数
9997=13・769 合成数
99=32・11 合成数
のように全部やって、
A=3、B=1で8桁までとしても良いのだが、素数判定は面倒なので、もっと効率よく枝刈りをしたい。
例えば、A=Bであると、ABは必ず11の倍数となってしまうので、11は良いが、他は合成数となる。111は合成数なので、これも枝刈り出来る。
例えば、B=3またはB=9に限定すると、4桁になると必ず3で割り切れ、合成数が確定して、4桁未満となる。といったように、B=3とB=9は4桁以上にはなり得ないことが確定するので、大幅な枝刈りが出来る。
そうなると、B=1とB=7だけを考えれば良いので、先の方法の半分くらいの計算で終わることだろう。
さて、この問題、10進数でしか考えてないけれども、他の進数ならば8桁を超えるものも見つかるのではなかろうか?
と考えるに至ったわけです。
とりあえず、プログラミングしてみたところ、8桁に到達するものは結構見つかりました。
例えば、38進数で、A=30(10)、B=31(10)
ここで書く(10)は、その前に書かれた数字は10進数ですよということです。
まぁ、面倒なんで、(10)は省きますね。
AB(38)=30・381+31=1171
AAB(38)=30・382+30・381+31=44491
AAAB(38)=30・383+30・382+30・381+31=1690651
…
といったように10進数に変換して、それを素数判定してみます。
1171 素数
44491 素数
1690651 素数
64244731 素数
2441299771 素数
92769391291 素数
3525236869051 素数
133959001023931=73・127・5407・2672323 合成数
まだ、n進数9桁が64ビットを超えないうちは、C言語のプログラムでも、素数判定は出来るのですが、超えてくると別の方法を考える必要が出てきますね。
例えば、290進数で、A=42(10)、B=277(10)
12457 素数
3544657 素数
1027882657 素数
298085902657 素数
86444911702657 素数
25069024393702657 素数
7270017074173702657 素数
とここまでは、64ビットの範囲でしたので、プログラムで確実に素数であることは確定しました。
しかし、ここからは64ビットを超えるので、フェルマーテストによる判定に切り替えました。
2108304951510373702657 合成数
といったようになります。
多倍長整数を実装して、素数判定していけばいいのだろうけど、実装に時間がかかりそうなので、今回はこの辺で。
さて、n進9桁以上になるようなものは見つかるのだろうか。
ではでは