「高橋の数」を求めるアルゴリズム(2)                             2000.08.20   「高橋の数」の一般式を求めるアルゴリズムです。  これを実装して、高橋謙一郎さんの分類(type A〜type D)との関係を明ら  かにすることがねらいです。 (補足)構成要素として0を認めた場合、typeEが存在することが     高橋謙一郎さんによって発見された。(2000.08.05)          しかし、以下のアルゴリズムには何ら変更はなく、スペクトルの     構成要素として0を追加するのみです。       このアルゴリズム本質は、「高橋の数」の性質2 ”「高橋の数」のスペク  トルは、T変換に不変”にあります。これを平たく言えば、   変換前のA1A2...Anに1の数が3個ふくまれていたとすると、    変換後のB1B2...Bnにも1が3個ふくまれている。    この数は多くてもすくなくてもいけない。  この性質を利用して「高橋の数」となるための条件式を作成し、それを解く  ことによって「高橋の数」の一般式を求めることができます。 1.概要  まず、具体的なイメージを理解していただく為に、以下の例でアルゴリズム  の全体を概観します。  4,5,9の数字を使用した「高橋の数」は、type A 以外に存在するで  しょうか?  ex. N=444999444の場合  max(N):999 555 444 min(N):444 555 999 T(n)=max(N)-min(N):554 999 445        ^ ^ ^:注目点  9、5、4の個数をそれぞれa,b,cとすると max(N) = 9(a), 5(b), 4(c) min(N) = 4(c), 5(b), 4(c)       ただし、9(a)は9が a個ならんだものをあらわす  となります。  a,b,cの大小関係(値そのものではなく)に着目すると、突き合わせ  パターンとして以下の7種類が生成できます。(対応関係のみ表示) max(N) 9,5,4,4,4 9,5,5,4,4 9,5,4,4 9,9,5,5,4 min(N) 4,4,4,5,9 4,4,5,5,9 4,4,5,9 4,5,5,9,9 続き 9,9,9,5,4 9,9,5,4 9,5,4 4,5,9,9,9 4,5,9,9 4,5,9  a+b<cのときが最初のパターンで、a=cのときが最後のパターンです。 【a+b<cの場合】  c = a + b + c'(c' >= 1) として書き換えると max(N) 9(a) 5(b) 4(c') 4(b) 4(a) min(N) 4(a) 4(b) 4(c') 5(b) 9(a) 減算をするために、a = 1 + A, b = 1 + B (A,B>=0) として書き換えると max(N) 9(1+A) 5(B) 5 4(c') 4(1+B) 4(A) 4 min(N) 4(1+A) 4(B) 4 4(c') 5(1+B) 9(A) 9   ----------------------------------------------  T(N) 5(1+A) 1(B) 0 9(c') 8(1+B) 4(A) 5 変換後には、変換前に存在しない0,8などの数が出現しているので、  このパターンは「高橋の数」とはなりえないことは明らかです。 【a=cの場合】  減算をするために、a=1+A(A>=0)として書き換えると max(N) 9(a) 5(b) 4(a) ==> 9(A) 9 5(b) 4(A) 4 min(N) 4(a) 5(b) 9(a) 4(A) 4 5(b) 9(A) 9     ------------------------------------------------------  T(N) 5(A) 4 9(b) 4(A) 5 「高橋の数」は、変換の前後で、9、5、4の個数は等しくなる筈。 9の個数: A+1 = b 5の個数: b = A+1 4の個数: A+1 = A+1 これを整理すると、b=A+1すなわち、b=aとなる。これを最初の  仮定a=cとあわせると、a=b=c(a>=1)が「高橋の数」となる  条件式である。 つまり、type A : 459xn(n>=1)を求めたことになる。 ほかの5パターンも同様に調べると、解が存在しないことがわかるので、 4、5、9の3つの数字で構成される「高橋の数」は、459xnのパ ターンのみという事が言える。 この方式をすべてのパターンについて調べると、typeA〜Dを導くこと  ができます。(しかも、それ以外のパターンは存在しないこともわかる) 2.アルゴリズム詳細  スペクトルを構成するc個の数字をf1,f2,...fcとする。  T変換を行うためには、max(N)、min(N)の各桁の対応関係を  とる必要がある。これをつきあわせ処理と呼ぶことにし、その対応関係を  pair(x,y)でfxとfyの組を表すことにする。 □つき合わせ処理:T変換のための準備    以下の再帰関数 pairing(m,i,j) を m=1,i=1,j=c で呼び出すことにより、  c個の数字で構成されるスペクトルのすべてのつき合わせパターンを生成  することができる。   pairing(m、i、j) :   m:m番目のペアを生成する   i:max(N)側の処理の対象がfiであることを表す   j:min(N)側の処理の対象がfjであることを表す  再帰的に以下の処理を行う。  1)m番目のペアとして、pair(i、j)を生成する。  2)i<jのとき    fiの個数とfjの個数との大小関係を考慮して、以下の3つの可能性    を順次よびだす。ただし、#(fk)はfkの個数とする。     pairing(m+1,i,j+1) : #(fi) > #(fj)の場合を想定     pairing(m+1,i+1,j) : #(fi) < #(fj)の場合を想定     pairing(m+1,i+1,j+1) : #(fi) = #(fj)の場合を想定     リターン  3) i>=jのとき     まず、L,S,Uを定義する。(この変数はあとで使用する)      L : m−1      S : i=jのとき m そうでないときは m−1      U : L+S            対象性に着目すると、後半は今まで生成したペアを逆順に生成すれば よい。  (S+k)番目のペア = (L−k+1)番目のペアに着目して、    (S+1)〜U番目のペアを作成する。        これで、1つのつき合わせパターンが生成できたことになる。    残りのパターンを生成するためにリターンする。  (補足)c=3の場合は、概要のところで触れたように7パターンとなる。     □pairテーブルの作成:T変換    T変換を行うため以下のテーブルを使用する。   pair[].lower : (lower,upper)でペアを格納する   pair[].upper :   pair[].var : ペア(lower,upper)の個数。一般にこの数は1以上           の変数なので1+α(α>=0)という表現となる   pair[].val : 10進減算の結果の数字を格納する  T変換前のスペクトルは、pair[].lowerとpair[].varで表現し、  T変換後のスペクトルは、pair[].val とpair[].varで表現される。  1)つき合わせの結果のパターン(の1つ)をpair[].lower,pair[].upper    に格納する。あわせて、L,S,Uも設定する。  2)L行、U行をコピーして、U+1行,U+2行を作成する。  3)pair[m].varに以下の値を設定する。    m<L     :1+Xm    m=L     :1    m=S(S≠L):1+Xm    S<m<U   :1+Xu-m+1    m=U     :1    m=U+1   :XL    m=U+2   :X1    ただし、Xm(0<m<=S)は変数であり、Xm>=0とする。  4)pair[m].valに以下の値を設定する。    m<L     : pair[m].lower - pair[m].upper    m=L     : pair[m].lower - pair[m].upper - 1    m=S(S≠L): 9    S<m<U   : 9 + pair[m].lower - pair[m].upper    m=U     :10+ pair[m].lower - pair[m].upper    m=U+1   : pair[m].lower - pair[m].upper    m=U+2   : 9 + pair[m].lower - pair[m].upper   以上の処理で、T変換後の結果が pair[].valとpair[].varに得られている。  [例]概要の5番目のパターンの場合、pairテーブルは以下のようになる。        9,9,9,5,4       4,5,9,9,9            lower  upper  var   val    @   9   4   1 + a 5    A   9   5 1    3     B   9   9 1 + c  9    C   5   9 1 + b  5    D   4   9 1    5    E   9   5 b    4    F   4   9 a    4     また、L=2,S=3,U=5となる。       EはAのコピー、FはDのコピーである。    見やすくする為、X1 = a,X2 = b,X3 = cと表記した。 □T変換不変の連立方程式:「高橋の数」の条件式  「高橋の数」となるための条件をpairテーブルを使用することにより  連立方程式として表現する。その解を求めることで、一般的な「高橋の数」  の表現式を得る。  1)「T変換の前後でスペクトルが不変」ということは、以下の連立方程式    として表現できる。    変換前のスペクトルを構成する数字f1,f2,...fc について         変換前の個数 − 変換後の個数 = 0    が成立しなければならない。  2)上記の連立方程式を解く(通常の掃出し法を使えばよい)  3)「解の存在」の制約    当然のことながら、「高橋の数」として実際に存在するためには、変数    Xmは、0以上の整数でなければならない。    従って、2)で得られた解が、Xm>=0となる条件を満たしていない    場合は不適合として破棄しなければならない。    以下の簡単なテスト法に該当したものはとして破棄する。    [rule1]      @変数の係数はすべて0、nonzeroの定数が残った場合 ex. 2 = 0 (要するに通常の不能解のケース)      A変数の係数はすべて同じ符号であり、定数も同じ符号の場合       ex. X1 + X3 + 1 = 0         -X1 − X2 − 3 = 0    [rule2]      連立式を変形することによってrule1に還元できる場合      例えば、i行+j行をつくるとAになるようなとき      上記のテストにパスしたものは「高橋の数」の候補として出力する。    最終的には、人による「解の存在」の確認を行う。  [例]上で作成したpairテーブルについて連立方程式を作成する         9 : (1+a) + 1 + (1+c) + b - { (1+c) } = 0     5 : (1+b) - { (1+a) + (1+b) + 1 } = 0     4 : 1 + a - { b + a } = 0     式を整理すると          a+b+2=0  ...式1     −a −2=0  ...式2      −b+1=0  ...式3 式1、式2はrule1のAに該当するので、破棄しなければならない。   (この場合はpairテーブルのAを見ると、変換に3が現れているので    連立方程式を立てるまでもないパターンであるが)