FANDOM


ユーザー_ブログ:BashicuHyudora/バシク行列システムの定義とバシク数について に、バシク数のオリジナルBASICコードとしてこのようなコードがアップされました。

[[dim A(infinity,infinity):dim B(infinity):dim C(infinity):D=9
for E=0 to 9
  for F=0 to D
  A(F,1)=1
  next
  G=D
  for H=1 to 0 step -1
    D=D*D
    for I=1 to G
      if A(I,H)=0 then B(E)=1 else B(E)=0
    next
    for J=0 to G
      K=B(1)
      for L=2 to G
        K=K*B(L)
      next
      for M=0 to H*K
        N=1
        for O=0 to J
          if A(O,H-M)<A(O,H) then P=L:N=1*N else P=0:N=0*N
        next
        for Q=0 to G*K*N
          if Q<J then C(Q)=A(Q,H)-A(Q,H-P)
        next
        if N=1 then M=H*K
      next
      for R=1 to D*K*N*P
        for S=0 to G
          A(S,H)=A(S,H-P)+C(S)
        next
        H=H+1
      next
      B(I+1)=1-B(I+1)
      if N=1 then J=G
    next
  next
next
print D

そこで、このコードを元に検証用コードを作って、例によって yabasic で動かしてみました。

MA=20 REM Maximam length

dim A(1000,10):dim B(10):dim C(10):D=2:Y=2
  for F=0 to Y
    A(F,1)=1
  next
  G=D
  H=1
  while ( H >= 0 )
    for I=1 to G
      if A(I,H)=0 then B(E)=1 else B(E)=0 endif
    next

    for I=0 to H
      print "(";
      for J=0 to Y-1
        print A(J,I),",";
      next J
      print A(Y,I),")";
    next I
    print "[",D,"]"

    for J=0 to G
      K=B(1)
      for L=2 to G
        K=K*B(L)
      next
      for M=0 to H*K
        N=1
        for O=0 to J
          if A(O,H-M)<A(O,H) then P=L:N=1*N else P=0:N=0*N endif
        next
        for Q=0 to G*K*N
          if Q<J C(Q)=A(Q,H)-A(Q,H-P)
        next
        if N=1 M=H*K
      next
      for R=1 to D*K*N*P
        for S=0 to G
          A(S,H)=A(S,H-P)+C(S)
        next
        H=H+1
        if H>MA end
      next
      B(I+1)=1-B(I+1)
      if N=1 J=G
    next
    H=H-1
  wend

結果は、このようになりました。

(0,0,0)(1,1,1)[2]
(0,0,0)[2]

このアルゴリズムでは、増えないようです…。すでに動いている検証プログラムを元にバシク数のプログラムを書くと

dim A(infinity,infinity):dim B(infinity):D=9
for P=0 to 9
  F=D
  for K=0 to F
    A(K,0)=0: A(K,1)=1
  next
  while (F>=0)
    D=D*D
    if A(0,F)=0 then
      G=0
    else
      M=C+1: G=0
      for J=0 to C
        if A(J,F)=0 M=J: J=C
      next J
      for K=0 to F
         H=1
         for L=0 to M-1
            if A(L,F-K) >= A(L,F) H=0
         next L
         if H=1 then
            for L=0 to M-2
               B(L)=A(L,F)-A(L,F-K)
            next L
            for L=M-1 to C
               B(L)=0
            next L
            G=K: K=F
         endif
      next K
    endif
    for K=1 to D*G
      for L=0 to C
         A(L,F)=A(L,F-G)+B(L)
      next L   
      F=F+1
    next K
    F=F-1
  wend
next P
print D

となるので、これを定義とするのが分かりやすいと思います。新しいプログラムを書くと、それを動かすための検証コードを書いて、それがすでに確認されている検証コードと一致することを確認しないとならないので、面倒です。まずは、こちらを「定義」として固めてしまってから、この定義に沿う別のプログラムを書く、というのであればいいのですが、定義なのですからすでに検証がされているものを使う方が安全です。

ちなみに、Bignum っぽいのもやってみましたが、340文字です。問題は、これが本当にきちんと定義されるかどうか(計算が終了するかどうか)、です。証明はまだ難しいですが終了しそうな気がしますし、そうすればミーミーミーロッカプーワ・ウンパは超えそうな気がします。ローダー数は、得体が知れない感じですね…。

とりあえずは、バシク行列の定義がプログラムの形でしか出ていないので、ほとんどの人は理解出来ていないと思います。計算の手順について、言葉による説明を待ちたいところです。

#define A a[l+f
#define M = malloc(20),
#define W while (

main(f) {
  int *a M *b M d=10, g, j, k, l, m, n=9, y;
  W d--) { 
    y=n; f=j=y*2; W j--) a[j++] = j<y? 0: 1;
    b = realloc(b, y);
    W f -= y ) {
      n *= n; g = 0;
      if (a[f]) {
        l = m = y; W l--) if (! A ]) m = l; 
        k = f+y; W k -= y) {
          j = 1; l = m; W l--) if ( A - k] >= A ]) j = 0;
          if (j) {l=y; g=k; W l-- ) b[l] = l < m-1? A ]- A - k]: 0;}
        }
      }
      k = f+g*n; a = realloc(a, k * k);
      W f < k) { l = y; W l--) A ] = A - g] + b[l]; f += y; }
    }
  }
  return n;
}

広告ブロッカーが検出されました。


広告収入で運営されている無料サイトWikiaでは、このたび広告ブロッカーをご利用の方向けの変更が加わりました。

広告ブロッカーが改変されている場合、Wikiaにアクセスしていただくことができなくなっています。カスタム広告ブロッカーを解除してご利用ください。

FANDOMでも見てみる

おまかせWiki