・因数7を持つ判定                         GAI 氏

 n1、n2、n3 を自然数とするとき、N=2^n1+3^n2+5^n3 で作られる数Nが、7の因数を持
つ場合の(n1,n2,n3)の条件を、ある式で作れないか試みているのですが、場合が多岐に渡
るので、どうまとめていいのか思案しています。お知恵をお借りします。


 らすかるさんからのコメントです。(令和4年3月4日付け)

 「ある式」が

(1) コンピュータで計算するにあたって累乗は巨大な数になって計算しにくいので、累乗を使
  わずintで計算できる式が欲しい

(2) コンピュータと関係なく、累乗を使わない数学的に一般的な式で簡単に計算できる(手計
  算で確認できる)ような式が欲しい

(3) 計算の利便性とも関係なく、数学的に正しい簡潔な式が欲しい
 (三角関数などを使ってもよい→[sin(π/2)]=1などを使ってよい)

など、どういう環境を想定しているのかわかりませんでしたので、とりあえず、(1)と考えて式
を作りました。以下で、a%b は、aをbで割った余り。

 ((60*(n1%3)+60)*(n1%3)
  +((((39*(n2%6)-485)*(n2%6)+2095)*(n2%6)-3655)*(n2%6)+2246)*(n2%6)
   +((((37*(n3%6)-455)*(n3%6)+1965)*(n3%6)-3565)*(n3%6)+2498)*(n3%6))/120+3

が7で割り切れる ⇔ 2^n1+3^n2+5^n3 が7で割り切れる

が成り立ちます


 GAI さんからのコメントです。(令和4年3月4日付け)

 r1=n1%3 、r2=n2%6 、r3=n3%6 とおいて、(r1,r2,r3)の組合せで全部で15パターンに分け
て求めていたのを、上記の一つの式で処理できることに感激です。

 式中の定数 39,485,2095,3655,2246,・・・ などが何処から決まるのだろう?最後の+3も凄い。
よくこんな式を編み出せますね!

 この式をプログラムで走らせると、正しく求めるべき(n1,n2,n3)が一つ残らず並んでいくの
が不思議でなりませんでした。

 喉から手が出るほど求めていた式がこんな姿で与えられることに感謝です。


 らすかるさんからのコメントです。(令和4年3月5日付け)

 もっとずっと短い式で判定できることに気づきました。

 34%(3+n1%3)+47174%(14-n2%6)+1868%(10-n3%6) が7で割り切れる

⇔ 2^n1+3^n2+5^n3 が7で割り切れる

です。

# 2^n1を7で割った余り = 34%(3+n1%3)
 3^n2を7で割った余り = 47174%(14-n2%6)を7で割った余り
 5^n3を7で割った余り = 1868%(10-n3%6)を7で割った余り

です。式の短縮のため若干修正しました。


 GAI さんからのコメントです。(令和4年3月5日付け)

 らすかるさんの、任意のサイクリックに繰り返す数列を数式に表すテクニックを真似て、
{1,2,3,4}での全順列が繰り返せる式を作ってみた。

 4つの数が繰り返して行くので、n%4を式中に混ぜ込んでみて、a%(b+(n%4)*2)型で、a、b の
数字を探してみると、

[1,2,3,4]=>344%(5+(n%4)*2)
[1,2,4,3]=>1478%(5+(n%4)*2)
[1,3,2,4]=>2829%(5+(n%4)*2)
以下%(5+(n%4)*2)部分を省略します。
[1,3,4,2]=>1632
[1,4,2,3]=>2983
[1,4,3,2]=>652
[2,1,3,4]=>289
[2,1,4,3]=>1423
[2,3,1,4]=>1794
[2,3,4,1]=>1731
[2,4,1,3]=>1948
[2,4,3,1]=>751
[3,1,2,4]=>2719
[3,1,4,2]=>1522
[3,2,1,4]=>1739
[3,2,4,1]=>1676
[3,4,1,2]=>2047
[3,4,2,1]=>3181
[4,1,2,3]=>2818
[4,1,3,2]=>487
[4,2,1,3]=>1838
[4,2,3,1]=>641
[4,3,1,2]=>1992
[4,3,2,1]=>3126

 ただし、この中で、次の順列は、a%(b+n%4)型でも構成可能

[1,2,3,4]=>499%(5+n%4)
[1,4,3,2]=>67%(5+n%4)
以下%(5+n%4)を省略します。
[2,1,4,3]=>428
[2,3,4,1]=>836
[3,2,1,4]=>9
[3,4,1,2]=>417
[4,1,2,3]=>778
[4,3,2,1]=>346

 なお、a%(b-n%4)/2型で構成してみると、

[1,2,3,4]=>1028%(10-n%4)/2
[1,2,4,3]=>2138%(13-n%4)/2
[1,3,2,4]=>1838%(10-n%4)/2
以下 -n%4)/2 部分を省略します。
[1,3,4,2]=>3878%(13
[1,4,2,3]=>2492%(11
[1,4,3,2]=>422%(11
[2,1,3,4]=>2218%(10
[2,1,4,3]=>5128%(13
[2,3,1,4]=>188%(9
[2,3,4,1]=>26%(12
[2,4,1,3]=>314%(11
[2,4,3,1]=>134%(11
[3,1,2,4]=>1698%(10
[3,1,4,2]=>1278%(13
[3,2,1,4]=>494%(9
[3,2,4,1]=>314%(12
[3,4,1,2]=>26%(11
[3,4,2,1]=>1916%(11
[4,1,2,3]=>746%(10
[4,1,3,2]=>314%(10
[4,2,1,3]=>1556%(10
[4,2,3,1]=>692%(10
[4,3,1,2]=>1934%(10
[4,3,2,1]=>1502%(10

の様な表現が対応してきました。

 時々、ある部分が繰り返す数列の一般式を作りたい事があるが、このテクニックは、その
ための新しい視座でした。

追伸:a%(b-n%4)型では、次の順列が構成可能でした。

[1,2,3,4]=>67%(7-n%4)
[1,4,3,2]=>79%(7-n%4)
[2,1,4,3]=>499%(8-n%4)
[2,3,4,1]=>9%(8-n%4)
[3,2,1,4]=>59%(5-n%4)
[3,4,1,2]=>9%(7-n%4)
[4,1,2,3]=>346%(7-n%4)
[4,3,2,1]=>358%(7-n%4)


 らすかるさんからのコメントです。(令和4年3月5日付け)

 任意のサイクリックに繰り返す数列を数式に表すテクニック

 因みに、この方法は、その昔仕事のプログラミングで、

  「要素数の少ない固定値配列を、配列を使わずに計算で済ませる方法」

を考えていて思いつきました。

# CPUのレジスタ上での演算と比較してメモリアクセスは遅いので、配列を使わない方が実
 行時間は高速になります。数回であれば関係ないですが、1兆回実行する場合は影響が
 出ると思います。ただし、コメントを書いておかないと意味不明ですが...(笑)


 GAI さんからのコメントです。(令和4年3月5日付け)

 サイクルの長さが少し長くなっても、この手は大丈夫ですか?

 例えば、[2,4,8,5,10,9,7,3,6,1]の並びが繰り返されるものの式を見つけ出そうと、

  a%(b+n%10)型 や a%(b+(n%10)*2)型 や a%(b-n%10)型

などを試してみるのですが、a、bでの捜索範囲が漠然としていて、未だ見つからずです。

 もしよろしかったら、このサイクル長10での構成式を教えて下さい。


 らすかるさんからのコメントです。(令和4年3月6日付け)

 原理的にはいくら長くなっても大丈夫ですが、単純にやると数が巨大になる可能性があり
ます(後述)。詳しく書いたら長文になってしまいました。

 [2,4,8,5,10,9,7,3,6,1]の考え方ですが、まずn%10の値0〜9に対する値が順に並ぶように、1を
先頭に移動します。つまり、[1,2,4,8,5,10,9,7,3,6]とします。

 n%10=0のとき1、n%10=1のとき2、n%10=2のとき4、… ということです。

 例えば、「(偶数)+n%10」のようにしたとき、少なくとも1番目・3番目・5番目・7番目・9番目の
偶奇が同じでないと成り立ちません。上記の例では1番目が1、3番目が4ですが、ある偶数
で割ったら余りが1、別の偶数で割ったら余りが4ということは、あり得ないためです。

 上記の例では、「1,4,5,9,3」も「2,8,10,7,6」も偶奇が一致していませんので、a%(b+n%10)型や
a%(b-n%10)型では不可能です。

 そうすると偶数は使えませんので、奇数列を考えることになります。

 (奇数)+(n%10)*2ならば、少なくとも偶奇が不一致で困ることはありません。しかし今度は、
3つおきにどこかに3の倍数がありますので、mod3で一致しなければなりません。

 「1,8,9,6」「2,5,7」「4,10,3」「8,9,6」はどれもmod3で一致しませんので、(奇数)+(n%10)*2や
(奇数)-(n%10)*2でも不可能なことがわかります。

 つまり、3の倍数が3個おきに出現するのもNGですから、例えば、(6m±1)+(n%10)*6のよう
にする必要があります。

 この場合、次に問題になるのは5の倍数が5個おきに出現することです。

 5つおきの「1,10」「2,9」「4,7」「8,3」「5,6」のうち「8,3」だけmod5が一致していますので、ここに
5の倍数がくるようにすればOKです。

 同様に、7の倍数が7個おきに出現することも考えなければなりません。

 「1,7」「2,3」「4,6」はどれもmod7が一致していませんので、7の倍数が8,5,10,9のどこかにくる
ようにする必要があります。

 これらを満たす最小の列は、

 「17,23,29,35,41,47,53,59,65,71」 すなわち、17+(n%10)*6 です。

 これで条件を満たすように計算すると、 211146529199453%(17+(n%10)*6) でよいことが
わかります。

 数が大きいので、もう少し何とかしたいですね。そこで考えたのが、a%(…)/2という方法で
すが、つまり全部を2倍して偶数にしておけば、偶数が入っていても少なくとも「偶奇が不一
致」でNGになることはないわけです。(同様に、6倍すれば3の倍数も使えるようになります。)

 [1,2,4,8,5,10,9,7,3,6]を2倍すると、[2,4,8,16,10,20,18,14,6,12]

 この場合は、mod4を考慮する必要があります。

 「2,10,6」「4,20,12」「8,18」「16,14」を見ると前者2個がmod4で一致していますが、後者2個は
一致していませんので、4の倍数を「2,10,6」「4,20,12」のどちらかにくるようにする必要があり
ます。

 同様に、mod8を考えると、8の倍数は4,10,20のどこかにくるようにする必要があります。

 そして、相変わらず3の倍数は使えませんので、(3m±1)+(n%10)*3で考えると、
(5の倍数は16の位置、7の倍数は16,10,20,18のどこかというのは変わりませんので)

最小の列は、 「41,44,47,50,53,56,59,62,65,68」 すなわち、41+(n%10)*3 です。

 この値で計算すると、 15198650904716%(41+(n%10)*3)/2 でよいことがわかります。先頭
の値は1桁だけ小さくなりました。

 さらに、3の倍数も使えるように6倍にして、[6,12,24,48,30,60,54,42,18,36] とすると、値が大
きくなりすぎますので、元の値の3倍の [3,6,12,24,15,30,27,21,9,18] で試してみます。すると
3019573777419%(29+(n%10)*2)/3 となり、先頭の値はもう1桁小さくなりました。

 他の工夫として、[1,2,4,8,5,10,9,7,3,6] の中の値に適宜11を加えて偶奇を合わせ、式の最
後で%11するという手もあります。

 10より大きければよいので13や15でもOKですが、15だとmod3が変わりませんので、11か
13が良いと思います。

 「1,4,5,9,3」と「2,8,10,7,6」のうち後者を偶数に統一してみます。
(前者を奇数に統一ではうまくありませんでした)

 mod4も考えると、7に13を加えるのがよさそうです。つまり、[1,2,4,8,5,10,9,20,3,6] %13 と考
えて、8,20の位置に4の倍数がくるようにすれば、偶奇問題はクリアです。

 また、このようにすると、たまたま「2,5,20」の位置でmod3が一致しており、この位置に、3の
倍数、そして以前と同様、8,3の位置に5の倍数、8,5,10,9のどこかに7の倍数がくるように考え
ると、最小の列は、「17,18,19,20,21,22,23,24,25,26」で、式は、5815491428%(17+n%10)%13 と
なり、先頭の値はだいぶ小さくなりました。

 あと、冒頭に書いた「単純にやると数が巨大になる可能性があります」についてですが、
「単純にやる」というのは、n項のとき、「公差がn未満の素数の積で初項がn以上の最小の
素数」とすれば無条件に作れるためです。

 [1,2,4,8,5,10,9,7,3,6] ならば、公差を 2*3*5*7=210、初項を11として、11+(n%10)*210 に
すれば、上記の「○の倍数」などの考慮が全く不要になり、

  702285692846583019178287779%(11+(n%10)*210)

という式が作れます。しかし、こんなに大きな数だと不便なので、いろいろ工夫するということ
ですね。


 GAI さんからのコメントです。(令和4年3月6日付け)

 とても詳しい解説、ありがとうございました。何か雲を掴むような感じだったのが、何を掴め
ばいいのかが少し見えてきた感じです。

 同じ結果を出すのに、色々な工夫をする過程も見せてもらい、舞台の裏側から鑑賞させて
貰えた印象です。

 しかし、こんな方法を仕事上発見されていることは記録を残しておいて貰い、是非後世の
者にも使えるようお願い申し上げます。


 Dengan kesaktian Indukmu さんからのコメントです。(令和4年3月6日付け)

 [ ]をガウス記号〜床関数的なものとして、2^n を 7 で割った余りを

  [(n-1)/3] -3*[n/3] +2*[(n+4)/3]

で計算するやり方があると昨夜、教わりました。

 作り方をまだ習っていません……自分では再現できません(嘆き)。そもそもなんで 3 で
割っているのだか……。


 らすかるさんからのコメントです。(令和4年3月6日付け)

 3で割るのは、周期が3だからです。

[(n-1)/3]-3[n/3]+2[(n+4)/3]=[(n-1)/3]-3[n/3]+2[(n+1)/3+1]

                =[(n-1)/3]-3[n/3]+2{[(n+1)/3]+1}

                =[(n-1)/3]-3[n/3]+2[(n+1)/3]+2

のようにするとわかりやすいです。

 n=1のとき、[(n-1)/3]=[n/3]=[(n+1)/3]=0 なので、最後の2は「初項の値」です。

 [(n-1)/3]、[n/3]、[(n+1)/3] の増え方を見てみると、nに1を足して2にすると、[(n+1)/3]だけ
1増え、さらに1を足して3にすると、[n/3]だけ1増え、さらに1を足して4にすると、[(n-1)/3]だ
け1増えますね。

 つまり、nが、

  3k+1→3k+2 のとき、[(n+1)/3]だけ1増えて

  3k+2→3k+3 のとき、[n/3]だけ1増えて

  3k+3→3k+4 のとき、[(n-1)/3]だけ1増える

ということは、

 [(n+1)/3]の係数が3k+1→3k+2のときの増分

 [n/3]の係数が3k+2→3k+3のときの増分

 [(n-1)/3]の係数が3k+3→3k+4のときの増分

とすればよいことがわかります。

 2^nを7で割った余りは、n=1,2,3,…に対して、2,4,1,2,4,1,… ですから、

  3k+1→3k+2のときの増分は、4-2=2

  3k+2→3k+3のときの増分は、1-4=-3

  3k+3→3k+4のときの増分は、2-1=1

なので、それぞれの増分を係数にすれば、 [(n-1)/3]-3[n/3]+2[(n+1)/3]+2 となり、2を最
後の[(n+1)/3]に組み入れて、

  2[(n+1)/3]+2=2{[(n+1)/3]+1}=2[(n+1)/3+1]=2[(n+4)/3]

のようにしたということですね。


 Dengan kesaktian Indukmu さんからのコメントです。(令和4年3月6日付け)

 明解なご教示を有り難うございます。 スッキリいたしました。


 GAI さんからのコメントです。(令和4年3月7日付け)

 前にサイクル10での繰り返し数列 V=[2,4,8,5,10,9,7,3,6,1] に対し、4と7の位置を入れ替
えた V1=[2,7,8,5,10,9,4,3,6,1] に対しては、中国剰余定理の活用から、1514089660648503
を計算し、これから

gp > for(n=1,100,print1(1514089660648503%(17+(n%10)*6)","))

2,7,8,5,10,9,4,3,6,1,2,7,8,5,10,9,4,3,6,1,
2,7,8,5,10,9,4,3,6,1,2,7,8,5,10,9,4,3,6,1,
2,7,8,5,10,9,4,3,6,1,2,7,8,5,10,9,4,3,6,1,
2,7,8,5,10,9,4,3,6,1,2,7,8,5,10,9,4,3,6,1,
2,7,8,5,10,9,4,3,6,1,2,7,8,5,10,9,4,3,6,1,

で構成でき、また、Dengan kesaktian Indukmu さんが提供された、ガウス記号を利用するこ
とで(\記号は式が続く意味)

gp > G1(n)=floor((n-1)/10)-5*floor(n/10)+3*floor((n+1)/10)\
       -floor((n+2)/10)-5*floor((n+3)/10)-floor((n+4)/10)+5*floor((n+5)/10)\
       -3*floor((n+6)/10)+floor((n+7)/10)+5*floor((n+8)/10)+2

gp > for(n=1,60,print1(G1(n)","))

2,7,8,5,10,9,4,3,6,1,2,7,8,5,10,9,4,3,6,1,
2,7,8,5,10,9,4,3,6,1,2,7,8,5,10,9,4,3,6,1,
2,7,8,5,10,9,4,3,6,1,2,7,8,5,10,9,4,3,6,1,

としても生み出されることになった。


 Dengan kesaktian Indukmu さんからのコメントです。(令和4年3月7日付け)

 二次実無理数の正則連分数展開は循環するので、サイクル列を使うことで表記が面白く
なりますね、実用的とはならないと思いますけれども。

 逆に、サイクル列を、二次無理数の連分数展開から計算するすべがないかとちょっとやっ
てみたのですが、個人的には放り投げました。


 らすかるさんからのコメントです。(令和4年3月7日付け)

 小数点以下の連分数展開が [2,7,8,5,10,9,4,3,6,1] の繰り返しになる数は、

 4874854x^2+3370086x-2638569=0 の解である (5√628080342231-1685043)/4874854

逆回りの [1,6,3,4,9,10,5,8,7,2] の繰り返しになる数は、

 2638569x^2+3370086x-4874854=0の解である (5√628080342231-1685043)/2638569

となりますが、これらの無理数がどういう意味を持つかはよくわかりません。



  以下、工事中!



              投稿一覧に戻る