暇つぶしPrograming#1

学籍番号045749D 備瀬健


コラーツの予想

 コラーツの予想とは、ある自然数xが偶数であるとき「xを2で割る」、奇数であるとき「xに3をかけて1を加える」という計算を、出た答えでまた同様に繰り返していくと「最終的に1になる」というモノである。これはまだ証明されてない超難解な問題のうちの1つであるが、あまり知られてないようだ。
 このプログラムを作った理由は数学好きなためだけである。


プログラム;roop.c

Program
    /*
        Author : Ken Bise
        Date   : 20050110
        Comment: 入力した自然数がコラーツの予想になるか計算する。
    */


    #include<stdio.h>

    main()
    {
        char line[10000000];
        unsigned long c;
        int i=0;

        printf("自然数を入力せよ ");
        fgets(line, sizeof(line), stdin);
        sscanf(line, "%d", &c);
    
        while( c != 1 ){
            if( c % 2 == 0 ){
                printf("偶数 %d\n",c);
                c = c / 2;
                i++;
            }
            else{
                printf("奇数 %d\n",c);
                c = ((c * 3) + 1) / 2;
                i++;
            }
        }
        printf("\n回数 %d で %d\n",i,c);
    }

自分で自然数を決めて確かめることが出来るプログラムです。1つ目のプログラム。
次のプログラムがこのプログラムを作り直したものである。



プログラム;roop2.c

Program
    /*
        Author : Ken Bise
        Date   : 20050111
        Comment: 自然数を総当たりで次々と計算して行く。
    */


    #include<stdio.h>

    #define MIN 2
    #define MAX 1000000000

    main()
    {
        unsigned long c = MIN;
        unsigned long i;

        while( c != MAX ){
            i = c;

            while( i != 1 ){
                if( i % 2 == 0 )
                    i = i / 2;
                else
                    i =  ( i * 3 + 1 ) / 2;
            }
            c++;
        }
        printf("%d\n",c);
    }

1つ目のプログラムを基に書き換えた2つ目のプログラム。
MINの値からMAXの値まで総当たりで計算して行く(2が終わったら次。終わったら次...)
いつかどこかでオーバーフローが発生すると思うので一先ず10億までは計算可能(調べるの面倒)。
1億分で4分ほどなので、上のプログラムは10億だから1時間も放置すれば処理が終わると思います。


プログラム;roop3.c

Program
    /*
        Author : Ken Bise
        Date   : 20050523
        Comment: ある数nを計算するとき、総当たりだとn-1までは証明されていることから、
              nより小さくなったら1になることが成立することを利用したプログラム。
    */

    #include

    #define MIN 2
    #define MAX 100000001

    main()
    {
        unsigned long i, c = MIN;

        while( c != MAX ){
            i = c;

            while( i != 1 ){
                if( i % 2 == 0 )
                    i = i / 2;
                else
   	                i =  ( i * 3 + 1 ) / 2;
                printf("%d\n",i);
                if( c > i ) break;
            }
            c = c + 2;
        }
    }

計算スピードは抜群に上がったけど、計算できる最大値が変わってないので意味無し。
桁数増やそうかな。固定とか浮動小数点でやってもいいのか疑問。

TOPへ戻る