素数大富豪が8121013倍強くなりたい

素数大富豪の攻略・布教活動をしていきます

2,5で割り切れる回数のお話

この記事は「合成数大富豪 Advent Calendar 2024 - Adventar」の16日目の記事になります。


こんにちは、アドベントカレンダーを入れ過ぎたことに早くも後悔しているOTTYです。
今日は割り切れる回数のお話です。主に、2,5で割り切れる回数の話になります。
合成数を探索するにあたって、2,5で割れる回数を調整したいことが多々あります。そのようなシーンで使える小技を紹介します。
また、実践上で2,5で割り切れる回数をド忘れしたときにその場で計算するテクニックにも活用できるはずです。特に後半で紹介する5Qチェックについてはそこそこ使えるはずです。


なお、この記事でnQ5のように書いたとき、nを1枚以上のトランプの札として1000*n+Q5を表しているものとします。

割り切れる回数の記号

 N pで割り切れる回数を v_{p}(N)と表します。*1また、約束として v_p(0)=\inftyとします。

要するに、 N素因数分解したときのpの指数部分です。


例えば
 v_5(65)=1
 v_2(128)=7
 v_3(1213)=0

 a,b自然数とします。このとき以下が成り立ちます。

 v_{p}(a+b)\geq min\{v_{p}(a),v_{p}(b)\}

 v_{p}(a\cdot b)=v_{p}(a)+v_{p}(b)

特に v_{p}(a)\neq v_{p}(b)のとき、

 v_{p}(a+b)=min\{v_{p}(a),v_{p}(b)\}

が成り立ちます。この性質が今回のキモです。

これら性質は
 a=p^{v_{p}(a)}\cdot a'
 b=p^{v_{p}(b)}\cdot b'

として a+b a\cdot bを考えることですぐに分かります。
かっこよく書いているだけですが、考えてみると当たり前ですね。
しかしこれは2,5で割り切れる回数を知りたいときに強力な性質です。

5の倍数

まず、簡単な5の倍数の方からいきます。

自然数 Cについて

 Cの末尾 m桁が 5^mで割れる  \iff  v_5(C)\geq m

という分かりやすい性質があります。


例えば、 v_5(nQ5)\geq 4となるようなnQ5を考えたいと思ったら、 v_5(10^4)=4なので、末尾4桁を5^4で割れるようにしないといけません。
3Q5=5^5、8Q5=5^4*Kの頭に何つけても v_5(nQ5)\geq 4とできます。

例:
93Q5=5^4*A49
68Q5=5^4*T9
Q8Q5=5^5*4A


別に末尾Q5にこだわりがないなら、6875=5^4*Jなどを末尾にすることも考えられますね。



合成数探索的には、上の命題を

 Cの末尾 m桁が 5^mで割れない  \iff  v_5(C)< m

と言い換えた方がわかりやすいかもしれません。


例えば末尾JQ5について考えましょう。

nJQ5=10^5*n+5^3*89より、

 v_{5}(nJQ5)=v_{5}(10000*n+5^3*89)=v_5(5^3*89)=3

となります。どんなにnを大きくしても3回しか割れないのです。

「nJQ5は5で3回しか割れない」という事実は合成数富豪的に使えます。

具体例を沢山挙げるのは後日しますが、6JQ5=5^3*4889のように、JQ5,5^3の部分を固定して派生させることができます。(さらに89が固定できるケースもある)

同様にnKQ5=5^5*2^5*n+5^4*3*7なので、 v_5(nKQ5)=4です。*2

例:
9KQ5=5^4*3*487
QKQ5=5^4*3*647

札の組を結構固定できているため、nJQ5,nKQ5を探索してたくさん覚えるのは良さそうですね。


2の倍数

2で割り切れる回数については、すぐ"見える"こともあります。
ここでは\を入れたところで数を区切ることにします。

68\Q8

 v_{2}(68Q8)=v_{2}(68000+Q8)=v_{2}(68000)=v_{2}(68)+v_{2}(1000)=5

T\448

 v_{2}(T448)=v_{2}(10000+448)=v_{2}(10000)=4

64\88

 v_{2}(6488)=v_{2}(6400+88)=v_{2}(88)=3


このように、2で割れる回数が異なるように区切ることのできる数は、容易に2で割る回数がわかります。
もちろん、\を入れる場所は例なので、6\8Q8、T4\48とか他の分け方はいくらでもあります。また、2で割り切れる回数が異なる二数の和として考えることで6488=6360+128などとしても良いです。






5の倍数と同じように、自然数 Cについて

 Cの末尾 m桁が 2^mで割れる  \iff  v_2(C)\geq m

という性質があります。


2でたくさん割れる数を探したいときは、末尾 m桁を 2^mで割れるように固定して、その頭をうまいこと調整していくことでいい感じにできます。

例えば、末尾6桁をTKQで固定したら(TKQ=2^6*A583)、

nを奇数にすることで、nTKQが
 v_{2}(1000000*n)=6なので、 v_{2}(nTKQ)\geq 6です。
さらに割る数が2のとき特有の性質として次が成り立ちます。

 a,b自然数とします。 v_{2}(a)= v_{2}(b)のとき、

 v_{2}(a+b)\geq v_{2}(a)+1

これを適用することで、nが奇数の時、nTKQは最低7回は割れることになります。

例:
7TKQ=2^7*3A8493
9TKQ=2^K*J*TA

全く本題とは関係ないですが、9TKQ=2^K*J*TA強くてマジでおススメです。


nを偶数にすると、
 v_{2}(1000000*n)\geq 7となるため、 v_{2}(nTKQ)=6が固定できます。

例:
8TKQ=2^6*Q6583
46TKQ=2^6*3^4*8893

おもろいですね。今はnTKQで探索していますが他にも色々と応用できそうです。nQ8、n888、nT88などなど各々が気に入ったものについて探索してみると発見がありそうです。(例は結構適当です。)

5Qチェック

末尾Qの数についてかなり重要だと思われるテクニックを紹介しておきます。
上で説明したことを用いただけなのですが、計算が単純かつそこそこ強力です。

末尾Qで2で割れる回数が9回以下の数に対して、5Qを引くことで2で割り切れる回数を判定できるテクニックとなります。


 nQ=100*(n-5)+512と考えることで、

v_2(100*(n-5)) \neq v_2(512)ならば、

 v_2(nQ) = min(v_2(100*(n-5)),v_2(512))

より、

 v_2(100*(n-5)) < 9ならば、

 v_2(nQ)=v_2(100*(n-5))=v_2(n-5)+2


 v_2(100*(n-5))\geq 10ならば、

 v_2(nQ)=v_2(512)=9

となります。


また、v_2(100*(n-5)) = v_2(512)ならば、

 v_2(nQ)\geq 10

となります。


例:

T4Q=9900+512より、
 v_2(T4Q)=2

J7Q=11200+512より、
 v_2(J7Q)=6

3845Q=384000+512より、(384=128*3)
 v_2(384000)=v_2(384)+3=10より、
 v_2(3845Q)=v_2(512)=9


このようなことが一瞬で分かります。これならド忘れしてもどうにかなりそうですし、合成数を覚えるにあたって使えそうです。

ただし、
 v_2(100*(n-5))= 9のときは、注意です。

389Q=2^J*A9などを考えると、

 v_2(38400)=9より、

 v_2(389Q)\geq 10しか保証しないです。(計算早ければ暗算で1024で割れたりする?)


しかし、3枚出しにおいてはK3Qを除くと、2^10で割れる合成数は存在しないので v_2(100*(n-5))が元の数を2で割り切れる回数になります。
因みに明日のアドベントカレンダーでは末尾Qの合成数の性質について考えていきますが、5Qチェックと組み合わせることで高速な素因数分解を試みます。




なお、他の末尾についても 2^n*kを引くことで判定することは可能ですが、まだ手をつけていません。

例えば、末尾2桁で分けて考えると、

末尾24なら1024=2^10を引く
末尾36なら1536=2^9*3を引く*3
末尾44なら6A44=2^11*3を引く
......などなど

どの末尾についても、割り切れる回数が大きい数を予め覚えておくのも強いかもしれませんね。


このように2で割り切れる回数のみであれば結構簡単にわかります。実際の素因数分解についてどうするかは問題ですが。


そのほかの素数で割り切れる回数については?

実戦で任意の素数 pに対して割れる回数を正確に判断することは難しいです。

たまたま上手くいく分け方を見つけられれば良いのですが、必ずしもうまく行くとは限りません。
例えば8Q43の3で割れる回数のように、8Q43=81000+243より、 v_3(8Q43)=4となります。

こういうパターンは合成数を覚えるときに面白い性質として一緒に覚えておいて、記憶のフックとして用いるのが良いでしょう。

おわりに

2,5の割り切れる回数について考えるのは、初等的ですが強力だと思います。
今回紹介したような、素因数とその肩、末尾の何桁かを固定しつつ、使いやすいものを探索するのは楽しいので是非皆さんやってみてください。


明日の記事では5Qチェックと組み合わせて使える末尾Qの性質について探っていきます。お楽しみに!!


*1: ord_{p}(N)などと書く流儀もあるそうですが、今回は v_{p}(N)と表記します。

*2:KQ5がそもそも10000+3125だったりします。

*3:65536を引くとかもあるが、それが暗算できるなら割り算した方が早くないか?と言う気もしています