FANDOM


バシク行列計算機で、nを一定にして (0,0)(1,1)[3] の計算、つまり (0)(1)(2)(3)[3] の計算をやると、数列の長さが 12288 よりも大きくはならずに、延々と計算が続きます。長さが爆発するのではなくて、同じくらいの長さで計算が続くので、どのくらい続くんだろうと思って計算をやっていました。結果を貼っておきます。

basmat "(0)(1)(2)(3)[3]" 13000

に相当することを、basmat のソースをいじってログの出し方を変えたプログラムで実行しました。 結果は、1010 ステップ毎に、最初の30個の数列を表示しています。

0904:13:31:57 step=1 E10; f=12111: fmax=12288: (0)(1)(2)(2)(2)(1)(2)(2)(2)(1)(2)(2)(2)(1)(2)(2)(1)(2)(2)(1)(2)(2)(1)(2)(1)(2)(1)(2)(1)(1)(1)...[3]
0904:13:34:57 step=2 E10; f=12104: fmax=12288: (0)(1)(2)(2)(2)(1)(2)(2)(2)(1)(2)(2)(2)(1)(2)(2)(1)(2)(2)(1)(2)(2)(1)(2)(1)(2)(1)(2)(1)(1)(1)...[3]
0904:13:37:55 step=3 E10; f=12136: fmax=12288: (0)(1)(2)(2)(2)(1)(2)(2)(2)(1)(2)(2)(2)(1)(2)(2)(1)(2)(2)(1)(2)(2)(1)(2)(1)(2)(1)(2)(1)(1)(1)...[3]
0904:13:40:53 step=4 E10; f=12123: fmax=12288: (0)(1)(2)(2)(2)(1)(2)(2)(2)(1)(2)(2)(2)(1)(2)(2)(1)(2)(2)(1)(2)(2)(1)(2)(1)(2)(1)(2)(1)(1)(1)...[3]
0904:13:43:51 step=5 E10; f=12143: fmax=12288: (0)(1)(2)(2)(2)(1)(2)(2)(2)(1)(2)(2)(2)(1)(2)(2)(1)(2)(2)(1)(2)(2)(1)(2)(1)(2)(1)(2)(1)(1)(1)...[3]
0904:13:46:49 step=6 E10; f=12133: fmax=12288: (0)(1)(2)(2)(2)(1)(2)(2)(2)(1)(2)(2)(2)(1)(2)(2)(1)(2)(2)(1)(2)(2)(1)(2)(1)(2)(1)(2)(1)(1)(1)...[3]
0904:13:49:48 step=7 E10; f=12195: fmax=12288: (0)(1)(2)(2)(2)(1)(2)(2)(2)(1)(2)(2)(2)(1)(2)(2)(1)(2)(2)(1)(2)(2)(1)(2)(1)(2)(1)(2)(1)(1)(1)...[3]
0904:13:52:46 step=8 E10; f=12116: fmax=12288: (0)(1)(2)(2)(2)(1)(2)(2)(2)(1)(2)(2)(2)(1)(2)(2)(1)(2)(2)(1)(2)(2)(1)(2)(1)(2)(1)(2)(1)(1)(1)...[3]
0904:13:55:44 step=9 E10; f=12109: fmax=12288: (0)(1)(2)(2)(2)(1)(2)(2)(2)(1)(2)(2)(2)(1)(2)(2)(1)(2)(2)(1)(2)(2)(1)(2)(1)(2)(1)(2)(1)(1)(1)...[3]
0904:13:58:43 step=10 E10; f=12159: fmax=12288: (0)(1)(2)(2)(2)(1)(2)(2)(2)(1)(2)(2)(2)(1)(2)(2)(1)(2)(2)(1)(2)(2)(1)(2)(1)(2)(1)(2)(1)(1)(1)...[3]

はじめはこんなかんじで、ここまで計算を続けました。

0915:07:31:54 step=5025 E10; f=12154: fmax=12288: (0)(1)(2)(2)(2)(1)(2)(2)(2)(1)(2)(2)(2)(1)(2)(2)(1)(2)(2)(1)(2)(2)(1)(2)(1)(2)(1)(2)(1)(1)(1)...[3]
0915:07:35:01 step=5026 E10; f=12105: fmax=12288: (0)(1)(2)(2)(2)(1)(2)(2)(2)(1)(2)(2)(2)(1)(2)(2)(1)(2)(2)(1)(2)(2)(1)(2)(1)(2)(1)(2)(1)(1)(1)...[3]
0915:07:38:08 step=5027 E10; f=12089: fmax=12288: (0)(1)(2)(2)(2)(1)(2)(2)(2)(1)(2)(2)(2)(1)(2)(2)(1)(2)(2)(1)(2)(2)(1)(2)(1)(2)(1)(2)(1)(1)(1)...[3]
0915:07:41:14 step=5028 E10; f=12088: fmax=12288: (0)(1)(2)(2)(2)(1)(2)(2)(2)(1)(2)(2)(2)(1)(2)(2)(1)(2)(2)(1)(2)(2)(1)(2)(1)(2)(1)(2)(1)(1)(1)...[3]
0915:07:44:21 step=5029 E10; f=12150: fmax=12288: (0)(1)(2)(2)(2)(1)(2)(2)(2)(1)(2)(2)(2)(1)(2)(2)(1)(2)(2)(1)(2)(2)(1)(2)(1)(2)(1)(2)(1)(1)(1)...[3]
0915:07:47:28 step=5030 E10; f=12104: fmax=12288: (0)(1)(2)(2)(2)(1)(2)(2)(2)(1)(2)(2)(2)(1)(2)(2)(1)(2)(2)(1)(2)(2)(1)(2)(1)(2)(1)(2)(1)(1)(1)...[3]
0915:07:50:35 step=5031 E10; f=12094: fmax=12288: (0)(1)(2)(2)(2)(1)(2)(2)(2)(1)(2)(2)(2)(1)(2)(2)(1)(2)(2)(1)(2)(2)(1)(2)(1)(2)(1)(2)(1)(1)(1)...[3]

要するに、50兆回繰り返しても、数列の長さは 12000 くらいのところで安定していて、12288 を超えることはなく、数列の最初の 30 個も変わらない、ということです。

長さが変化する様子をプロットしました。横軸は、計算ステップ(×1010回)、縦軸は数列の長さで、ステップ1010回ごとのプロットです。

0123-3

この計算をするために、ログ取りの方法を変えたプログラムも貼っておきます。

/*

basmat.c : Bashicu Matrix Calculator

Usage: basmat ini [max] [opt] [step]

**** This is a modified version for showing only part of the results

ini: Initial variable in the form of BM[n], where BM is a sequence expression
     of Bashicu matrix, and n is a natural number. n=2 if not given.
max: Maximum length of sequence. Default is 20.
opt: Calculation option. Default is 1.
     opt = 1: n is constant.
     opt = 2: n = n+1 for each loop.
     opt = 3: n = n*n for each loop.
     opt = 4: Simulate Hardy. n=n+1 for successor, and copy n-1.
              It matches Hardy function for ordinals below epsilon_0.
step: Maximum step of calculation. Default is 0 (no limit).

Example:
     basmat "(0,0)(1,1)]3]" 100000 2
     basmat "(0,0)(1,1)[3]" 10000000 4
     basmat "(0,0)(1,1)[3]" 13000 1 100000

Web interface is available at
     http://gyafun.jp/ln/basmat.cgi

Author: Fish
     http://googology.wikia.com/wiki/User:Kyodaisuu

Created on Sep. 1, 2014.

***********************************/

#include <stdlib.h>
#include <stdio.h>
#include <limits.h>
#include <string.h>
#include <time.h>

int main(int argc, char *argv[]) {
  int *a, *b, c=0, g, h, i=0, j, l, m, y, len, opt;
  long f, k, n=0, z, step=0, maxstep, fmax=0;
  char *bm;

  time_t timer;
  struct tm *date;
  char str[256];

  /* Read parameters */
  if (argc < 2) {
    printf ("Usage: %s ini [max] [opt] [step]¥n", argv[0]);
    printf ("See comment in the source: http://gyafun.jp/ln/basmat.cgi?ini=s¥n");
    return 0;
  }
  bm  = argv[1];
  z = (argc > 2)? atol(argv[2]): 20;
  if (z < 1) z = 1;
  opt = (argc > 3)? atoi(argv[3]): 1;
  maxstep = (argc > 4)? atoi(argv[4]): 0;
  if (maxstep < 0) maxstep = 0;

  /* Read numbers of rows */
  len = strlen( bm );
  for (m = 0; m < len; m++) {
    if (bm[m] == ',') i++;
    if (bm[m] == ')') {
      if (c < i) c = i;
      i = 0;
    }
    if (bm[m] == '[') m = len;
  }
  y = c+1;

  /* Allocate array */
  a = malloc(sizeof(int) * y * z);
  b = malloc(sizeof(int) * z);
  if (a == NULL || b == NULL) {
    printf("Allocation failed.¥n");
    exit(-1);
  }

  /* Read initial variable */
  i = j = a[0] = 0;
  for (m = 0; m < len; m++) {
    if (bm[m] == ',') i++, a[i + j*y]=0;
    if (bm[m] == ')') j++, i=0, a[i + j*y]=0;
    if (bm[m] == '[') {
      for (; m < len; m++){
        k = bm[m]-'0'; if (k >= 0 && k <= 9) n = n*10+k;
      }
    }
    k = bm[m]-'0'; if (k >= 0 && k <= 9) a[i + j*y] = a[i + j*y]*10+k;
  }
  if ( n < 1 ) n = 2;
  if (j == 0) {
    printf ("Invalid initial parameter.¥n");
    return 0;
  }

int e=0;
  /*** Start calculation ***/
  for (f=j-1; f >= 0; f--) {

    /* Show current sequence */

   if (f>fmax) fmax=f;
   
   /* Show each 10^10 step */
   step++; if (step == 10000000000) {
    step = 0; e++;

   /* Log time */
    timer = time(NULL);
    date = localtime(&timer);
    strftime(str, 255, "%m%d:%H:%M:%S", date);

    printf ("%s step=%d E10; f=%ld: fmax=%ld: ",str,e,f,fmax);
    for (i=0; (i<=f && i <= 30); i++) {
      printf ("(");
      for (j=0; j<c; j++) printf ("%d,", a[j + i*y]);
      printf ("%d)",a[c + i*y]);
    }
    if (f>20) printf ("...");
    printf ("[%ld]¥n",n);
}
    /* Calculation */
    if (opt == 2) n++;
    if (opt == 3) n *= n;
    if (a[f*y] == 0) {
      g = 0;
      if (opt == 4) n++;
    } else {
      m = c+1; g = 0;
      for (j=0; j<=c; j++){
        if (a[j + f*y] == 0) m=j, j=c+1;
      }
      for (k=0; k<=f; k++) {
        h = 1; for (l = 0; l < m; l++) if (a[l + (f-k)*y] >= a[l + f*y]) h=0;
        if (h) {
          for (l = 0; l<=c; l++) b[l] = (l < m-1)? a[l + f*y]-a[l + (f-k)*y]: 0;
          g = k; k = f+1;
        }
      }
    }
    k = (opt == 4)? f+g*(n-1): f+g*n;
    if (k > z) {
      printf ("Length of sequence exceeds %ld at next step.¥n",z);
      free(a); free(b); return 0;
    }
    if (maxstep && step++ >= maxstep) {
      printf ("Maximum step of calculation %ld has reached.¥n",maxstep);
      free(a); free(b); return 0;
    }
    while (f < k) {
      for (l=0; l<=c; l++) a[l + f*y] = a[l + (f-g)*y] + b[l];
      f++;
    }
  }
  printf ("Finished. n = %ld¥n",n);
  free(a); free(b); return 0;
}

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


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

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

FANDOMでも見てみる

おまかせWiki