・格子点と直線                      りらひい氏

 n≧1、m≧2とする。n次元空間内に m×m×…×mの格子状に、mn個の点が並んでいる。
(ただし、格子はすべて直角で等間隔であるとする。)これらの点のうち2つ以上の点を通る
直線の数を、L(n,m)とおく。

(1) L(n,2)を求めてください。

(2) L(n,3)を求めてください。

(3) L(n,4)を求めてください。

(4) L(n,5)を求めてください。

  ・・・・・・・・・

※ n=2、3 のときの値は、「A018808」「A222267」にあります。私は計算して一応解答を持っ
 ていますが、きちんと証明はしていません。私の解答はしばらくしてから書き込もうと思いま
 す。


(コメント) L(2,2)=6、L(2,3)=20 であることは下図から明らか。計算でも、
      L(2,2)=42=6、L(2,3)=92−(32−1)×8=20

             


 りらひいさんから解答をいただきました。(平成29年3月26日付け)

 私が用意していた答えです。ただし、これが正しい答えかどうかは保証できません。もし間
違えていたらごめんなさい。

 L(n,2)=(4^n-2^n)/2 、L(n,3)=(9^n-2*5^n+3^n)/2 、 以下は、こちら


 at さんからのコメントです。(平成29年3月26日付け)

 凄い結果ですね。よろしければ、これらの式の導出過程を教えてくださいませんか?


 りらひいさんからのコメントです。(平成29年3月26日付け)

 先に、結論の式だけ書いておきます。
※わたしが先に挙げたOEISのページからたどることのできるこちらにも書いてあります。

 n≧1、m≧2、p≧2 とする。n次元空間内に、m×m×…×mの格子状にmn個の点が並ん
でいる。これらの点のうち、p個以上の点を通る直線の数をL(n,m,p)とおく。

 また、これらの点のうちのいずれか2点を始点と終点とし、両端を含め中にちょうどp個の
点がある有向線分の数を、向きを区別して数えて、f(n,m,p)とおく。

 このとき、

L(n,m,p)=(f(n,m,p)-f(n,m,p+1))/2

f(n,m,p)=Σ[-m<k[1]<m, … , -m<k[n]<m, gcd(k[1],…,k[n])=p-1](Π[i=1〜n](m-|k[i]|))

となる。ただし、gcd(…)は最大公約数。

 f(n,m,p)を変形すると、

f(n,m,p)=Σ[0≦k[1]≦m-1, … , 0≦k[n]≦m-1, gcd(k[1],…,k[n])=p-1](Π[i=1〜n]s(k[i])(m-k[i]))

または

f(n,m,p)
=Σ[0≦k[1]≦(m-1)/(p-1), … , 0≦k[n]≦(m-1)/(p-1), gcd(k[1],…,k[n])=1](Π[i=1〜n]s(k[i])(m-(p-1)k[i]))

となる。ただし、s(0)=1, s(k)=2 (k>0) である。
(0のときは1通り、その他のときはプラスとマイナスで2通りを表す。)

 これらの式に、p=2とmの具体的な値を入れておいて式変形すると、私が示した答えになると思います。

※次のような場合でもいけます。

 m[1]×…×m[n]の格子状にΠ[i=1〜n]m[i]個の点が並んでいる。

L(m[1],…,m[n];p) = (f(m[1],…,m[n];p) - f(m[1],…,m[n];p+1))/2

f(m[1],…,m[n];p) = Σ[-m[1]<k[1]<m[1], … , -m[n]<k[n]<m[n], gcd(k[1],…,k[n])=p-1](Π[i=1〜n](m[i]-|k[i]|))

 または

f(m[1],…,m[n];p)
= Σ[0≦k[1]≦(m[1]-1)/(p-1), … , 0≦k[n]≦(m[n]-1)/(p-1), gcd(k[1],…,k[n])=1](Π[i=1〜n]s(k[i])(m[i]-(p-1)k[i]))


 とりあえず今日はここまでにします。そのほかの過程とか詳しい説明とかはまた次回時間
のあるときで。


 at さんからのコメントです。(平成29年3月27日付け)

 お返事ありがとうございます。確かに、「A018808」のページから論文へのリンクがあります
ね。この論文、4ページまで読みましたが、大変面白いですね。引き続き読んでみます。


 りらひいさんからのコメントです。(平成29年4月3日付け)

 例を挙げて説明します。

 3次元ユークリッド空間の(0,0,0)から(5,5,5)にかけての6×6×6=216個の格子点を考えるこ
とにします。

 これらの点を始点と終点とした有向線分のうちで、向きと長さがベクトル(1,-2,0)と等しくなる
ものを考えます。すると、次の120本の有向線分があることがわかります。

(0,2,0)→(1,0,0), (1,2,0)→(2,0,0), …, (4,2,0)→(5,0,0),
(0,3,0)→(1,1,0), (1,3,0)→(2,1,0), …, (4,3,0)→(5,1,0),

(0,5,0)→(1,3,0), (1,5,0)→(2,3,0), …, (4,5,0)→(5,3,0),

(0,2,1)→(1,0,1), (1,2,1)→(2,0,1), …, (4,2,1)→(5,0,1),
(0,3,1)→(1,1,1), (1,3,1)→(2,1,1), …, (4,3,1)→(5,1,1),

(0,5,1)→(1,3,1), (1,5,1)→(2,3,1), …, (4,5,1)→(5,3,1),

………
………

(0,2,5)→(1,0,5), (1,2,5)→(2,0,5), …, (4,2,5)→(5,0,5),
(0,3,5)→(1,1,5), (1,3,5)→(2,1,5), …, (4,3,5)→(5,1,5),

(0,5,5)→(1,3,5), (1,5,5)→(2,3,5), …, (4,5,5)→(5,3,5)

 これを見ると、x座標について(6-|1|)通り、y座標について(6-|-2|)通り、z座標について(6-|0|)
通りで、掛け合わせて120本になっていることがわかります。

 同様に考えると、ベクトル(k[1],k[2],k[3])と向きと長さが等しくなる有効線分の数は、

  (6-|k[1]|)*(6-|k[2]|)*(6-|k[3]|)本

となります。

 次に、ベクトル(2,-4,0)を考えてみます。このベクトルと向きと長さが等しい有向線分の例と
して(0,4,0)→(2,0,0)を考えると、この有向線分は(1,2,0)という点も通ることがわかります。

 これは、gcd(2,-4,0)=2なので、線分を二分割した点も格子点になるからです。

 よって、この有向線分は、二分割する点が(2-1=)1点と両端の2点をあわせて計3つの格子
点を通ります。

 同様に考えて、gcd(k[1],k[2],k[3]) = p-1 とおくと、ベクトル(k[1],k[2],k[3])と同じ向きと長さの
有向線分は、p-1分割する点がp-2点と両端の2点をあわせたp個の格子点を通ります。

 さて、次に、有向線分(0,5,0)→(1,3,0)が乗る直線を考えます。

 この直線上には、(0,5,0),(1,3,0),(2,1,0)という3つの点があります。よって、2点を通る(向きを
考えない)線分は、(0,5,0)⇔(1,3,0), (1,3,0)⇔(2,1,0) の2本になります。

 また、3点を通る線分は (0,5,0)⇔(2,1,0) の1本です。4点以上を通るものはありません。

 有向線分を数える場合は向きが2通りあるため、これらの2倍の数があります。

 ある直線上に最大q個の格子点が並んでいるとすると、その中のp個(2≦p≦q)の点を通る
線分の数はq-p+1本となります。

 よって、p個の点を通る線分の数はp+1個の点を通る線分の数より1本だけ多くなります。

 これはどの直線に関してもいえることなので、p+1個の点を通る線分の数からp個の点を通
る線分の数を引くことにより、それぞれの直線が1回ずつ数えられてp個以上の点を通る直
線の数を求めることができます。

 有向線分の数から直線の数を求める場合は、向きの違いが重複しているため、2で割る
必要があります。

 ここまでの議論を一般化してまとめると、私が前回書き込んだ式になるかと思います。


 りらひいさんから説明の続きをいただきました。(平成29年4月15日付け)

(おさらい) n≧1、m≧2、p≧2、s(0)=1、s(k)=2 (k>0) のとき、

f(n,m,p)
= Σ[0≦k[1]≦m-1, … , 0≦k[n]≦m-1, gcd(k[1],…,k[n])=p-1](Π[i=1〜n]s(k[i])(m-k[i]))
=Σ[0≦k[1]≦(m-1)/(p-1), … , 0≦k[n]≦(m-1)/(p-1), gcd(k[1],…,k[n])=1](Π[i=1〜n]s(k[i])(m-(p-1)k[i]))

(おさらい終)

 h(n,m)を次のように定める。

h(n,m)
= Σ[(k[1],…,k[n])=(0,…,0)](Π[i=1〜n]s(k[i])(m-k[i])) = Π[i=1〜n]s(0)(m-0) = (s(0)(m-0))^n = m^n

 p=2,3,…,m とする。g(n,m,p)を次のように定める。

g(n,m,p)
= h(n,m) + Σ[1≦j≦(m-1)/(p-1)]f(n,m,(p-1)j+1)
= Σ[(k[1],…,k[n])=(0,…,0)](Π[i=1〜n]s(k[i])(m-k[i]))
            + Σ[0≦k[1]≦m-1, … , 0≦k[n]≦m-1, gcd(k[1],…,k[n])
={1*(p-1) or 2*(p-1) or … }](Π[i=1〜n]s(k[i])(m-k[i]))
= Σ[(k[1],…,k[n])=(0,…,0)](Π[i=1〜n]s(k[i])(m-(p-1)k[i]))
            + Σ[0≦k[1]≦(m-1)/(p-1), … , 0≦k[n]≦(m-1)/(p-1), gcd(k[1],…,k[n])
={1 or 2 or … }](Π[i=1〜n]s(k[i])(m-(p-1)k[i]))
= Σ[0≦k[1]≦(m-1)/(p-1), … , 0≦k[n]≦(m-1)/(p-1)](Π[i=1〜n]s(k[i])(m-(p-1)k[i]))
= (Σ[0≦k≦(m-1)/(p-1)]s(k)(m-(p-1)k))^n
(※ただし、(t=t1 or t=t2 or t=t3) を t={t1 or t2 or t3} のように表記した。)

 特に、p=2のとき、g(n,m,2)=(m^2)^n となる。

 以上から、h(n,m)およびg(n,m,p)はm以上m^2以下の整数のn乗になることがわかる。

 さて、g(n,m,p)の式の数と、求めたいf(n,m,p)の数はともにm-1個であり、それらの式はすべ
て一次式になっている。

 そこで、g(n,m,p)の式を連立してf(n,m,p)に関して解くことができ、f(n,m,p) (p=2,3,…,m)を
h(n,m)およびg(n,m,p) (p=2,3,…,m)を用いて表すことができる。すなわち、

  f(n,m,p)は、m以上m^2以下の整数のn乗の線形結合で書くことができる。

 また、あらかじめ定まっているp=Pに対してf(n,m,P)を求めたいときは、次のようにすれば
よい。

1≦u≦(m-1)/(P-1)である整数uに対して、g'(n,m,P,u)を次のように定める。

g'(n,m,P,u) = g(n,m,(P-1)u+1)
            = h(n,m) + Σ[1≦j≦(m-1)/((P-1)u)]f(n,m,(P-1)uj+1)
            = (Σ[0≦k≦(m-1)/((P-1)u)]s(k)(m-(P-1)uk))^n

 これは、先ほどのg(n,m,p)の連立式の中の一部を抜き出したものであるが、この一部だけ
でf(n,m,P)を求めることができる。

 これらの連立一次方程式の係数行列は対角要素が1の三角行列になるので、逐次的な
処理によって容易にf(n,m,P)が求まる。

 さらに、次のようなこともわかる。

u=1のとき、a[1]=1
uを素因数分解して、指数が2以上になる素因数をもつとき、a[u]=0
uを素因数分解して、指数が1となる素因数を奇数個もち、
            指数が2以上になる素因数をもたないとき、a[u]=-1
uを素因数分解して、指数が1となる素因数を偶数個もち、
            指数が2以上になる素因数をもたないとき、a[u]=1
とすると、

 f(n,m,P) = Σ[1≦u≦(m-1)/(P-1)]a[u](g'(n,m,P,u)-h(n,m))

となる。b=Σ[1≦u≦(m-1)/(P-1)]a[u] とおけば、

 f(n,m,P) = Σ[1≦u≦(m-1)/(P-1)]a[u]*g'(n,m,P,u) - b*h(n,m)

となる。



                         投稿一覧に戻る