まもめも

主に素数大富豪に関することを書いていきます

999999チェックについて

この記事は、 素数大富豪 Advent Calendar 2022 - Adventarの9日目の記事です。

昨日の記事ははdiL-13さんによる、新規プレイヤーの参入しやすい環境づくりを考えるでした。
diL-13さんみたいに新しいプレイヤーが、新規の人に対してどう接するかを考えてくれているというのが嬉しいですね。


素数大富豪 Advent Calendar 2022 - Adventarの2日目の記事で少し触れた999999についてですが、999999を使った倍数判定方法を思いついたので紹介します。

(1)考え方
999999は素因数分解すると、3^3×7×11×13×37になります。
これは置き換えると1001×999で、999999は1001の倍数であることがわかります。

判定したい数に999999の倍数を足し引きしても999999の倍数かどうかの関係性は変わらなく、約数である1001においても同じことがいえるため、1001の倍数かどうかの関係性も変わりません。
これを法則を用いて、判定したい数に999999の倍数を足し引きして1001の倍数かどうかチェックしていきます。

abcdefghijklという12桁の数(a~lはぞれぞれ0~9の任意の数)を判定したい場合、元の数に999999の倍数である「999999×ghijkl」足しても1001の倍数かどうかの関係性は変わりません。これを計算すると、

abcdefghijkl+999999×ghijkl
=abcdef×1000000+ghijkl+(1000000-1)×ghijkl
=1000000×(abcdef+ghijkl)

となり、「abcdefghijkl」は「abcdef+ghijkl」と計算しても1001の倍数かどうかの関係性は変わらないことがわかります。
この方法を用いると、12桁の数を6桁程度まで減らすことができます。
このように「判定したい数」と「下6桁に999999を掛けた数」の和を計算して、判定したい数の桁を減らす方法を「999999チェック」と呼ぶことにします。

「abcdef+ghijkl」をしただけでは数がまだ大きいので、このチェック方法だけで倍数判定するのは難しく、1001チェックや91チェックと組み合わせて999999チェック→1001チェック→91チェックと桁を減らしていき判定する必要があります。

最初から1001チェックで「abc-def+ghi-jkl」を計算すれば999999チェックなんて必要ないのでは?と思うかもしれません。
実際その通りで、999999チェックではなく1001チェックでも支障ありません。
しかし999999チェックには、いくつかのメリットがあります。

それは、「足し算であること」「2桁札を分けなくていいこと」です。
1001チェックは足し算と引き算を使用しますが、999999チェックは足し算だけなので、引き算が苦手な人に向いています。

また1001チェックの場合、例えばTQKといった2桁札を計算する場合、-101+213と計算するため、Qの1を引き算側、2を足し算側に分ける必要があり、ややこしくなりますが、999999チェックは基本的に2桁札を分けずに計算できます。


(2)使用方法
使用方法を簡単に言うと、「6桁ごとに区切った数字を足していく」です。
では使用例を見ていきます。

①234567TJJの場合
 999999チェック 234567+101111=335678
 1001チェック  678-335=343 (11の倍数ではない)
 91チェック   343-303+30=7  (7の倍数なので、234567TJJは7の倍数)

②3215888785QJの場合
 999999チェック 32+158887+851211=1010130
                               1+10130=10131
 1001チェック  131-10=121 (11の倍数なので、3215888785QJは11の倍数)

足し算の結果999999を超えた場合、再度6桁ごとに区切った数字を足していきます。
010130は10130として計算します。6桁目が0だとこれだけで桁が減らせます。
なお、判定したい数の3の倍数チェックをしていなかったとしても、999999チェック後の数が3の倍数かどうかでチェックできます。
上記の場合は999999チェック後の「10131」が3の倍数のため、3215888785QJが3の倍数とわかります。

③9876543QQJの場合
 999999チェック 9+876543+121211=997763
 1001チェック  997-763=234 (11の倍数ではない)
 91チェック   234-202+20=52  (13の倍数なので、9876543QQJは13の倍数)

 997763の後、999999-997763=2236、2236-2002=234と計算する方法もあります。


(3)おまけ(37の倍数判定方法)
 999999は37の倍数でもあるため、999999チェック後の数から37の倍数判定もできます。37の倍数判定には、999チェックを使用します。

 999999チェックは6桁ごとに足していきますが、999チェックは3桁ごとに足していきます。
また、37×3=111のため3桁のぞろ目は37の倍数であることから、999チェックの計算結果が、ぞろ目に37か74を足した数であれば37の倍数、そうでなければ37の倍数ではないということになります。

 (2)①の335678の場合
 335678-333333=2345
 2+345=347 (333でもなく333+37でもないので、234567TJJは37の倍数ではない)

 (2)②の10131の場合
 10+131=141 (111でもなく111+37でもないので、3215888785QJは37の倍数ではない)

 (2)③の997763の場合
 997+763=1760 (末尾の0は無視し、176は111+37でも111+74でもないので、9876543QQJは37の倍数ではない)

この37の倍数判定は999999チェック後の数を使用するため、1001チェックをしている間に忘れてしまう場合があります。
999999チェック後の数を覚えていて、時間に余裕がある時に使用しましょう。


(4)最後に
999999チェックのメリットを色々書きましたが、1001チェックにも「足し算と引き算を行うので数が大きくなりにくい」「3桁の同じ数を繰り返し置くことで計算を省略できる」などのメリットがあります。

999999チェックを使うか1001チェックを使うか、自分が得意な計算方法や状況に応じてうまく使い分けができるようになると、チェックにかかる「時間」が短くなるかもしれません。
この「時間」についてを、12月20日のAdvent Calendarに書きたいと思いますので、よろしければこちらもご覧ください。

明日はasangi_a4acさんによる素数を見てみようです。
どんな素数が見れるのか楽しみですね。